单片机:Atmega2560 IDE:Microchip Studio v7.0.2594 工具链:WinAVR(也尝试过 Native)
我正在尝试通过 UART 与我的 MCU 通信。我已经通过 UART 编写了两个非常基本的函数来传输字节和字符串并观察串行终端上的输出。项目编译成功,但字符串函数不起作用。 有人请帮忙!!
UART_TxString(MOD_UART1,"\nHello"); //This causes MCU to transmit all 0s over the UART port
UART_TxByte(MOD_UART1,'\n'); //This works fine
UART_TxByte(MOD_UART1,'H'); //This works fine
UART_TxByte(MOD_UART1,'e'); //This works fine
UART_TxByte(MOD_UART1,'y'); //This works fine
//Function definitions
void UART_TxByte(sys_module module, uint8_t byte)
{
switch(module)
{
case MOD_UART0:
{
while (( UCSR0A & (1<<UDRE0)) == 0) ; // Do nothing until UDR is ready
UDR0 = byte;
break;
}
case MOD_UART1:
{
while (( UCSR1A & (1<<UDRE1)) == 0) ; // Do nothing until UDR is ready
UDR1 = byte;
break;
}
default:
break;
}
}
void UART_TxString(sys_module module, char* string)
{
while(*string)
{
UART_TxByte(module, *string);
string++;
}
}
我曾多次与Atmega系列合作,但以前从未发生过这种情况。 将字符串传递给函数(UART/LCD/无线模块)一直有效。
我也尝试过创建一个全局数组并将字符串内容放入其中,然后将其传递给字符串函数,但仍然引起了同样的问题。
更新:我现在找到了一个解决方法,如下所示,
void UART_TxString(sys_module module, char string[])
{
uint16_t i=0;
for(i=0 ; string[i]!=0 ; i++)
{
UART_TxByte(module, string[i]);
}
}
但是,通过上述解决方法,我需要使用 sprintf 将字符串加载到数组中。 但如果我这样做:
char string[] = "hello\r"
UART_TxString(MOD_UART1, string); // It doesn't work...
还是没找到原因
while(*string)
没有用。
代码中唯一可能遇到问题的是
char
函数中的数据类型 UART_TxString
。要检查从 char
到 uint8_t
的类型转换是否没有问题,您可以尝试以下操作:
void UART_TxString(sys_module module, char* string)
{
while(*string)
{
uint8_t temp = (uint8_t)(*string);
UART_TxByte(module, temp);
string++;
}
}