Microchip Studio中Atmega2560 UART字符串发送函数失效求助
Atmega2560 UART字符串发送函数异常排查
环境信息
- MCU:Atmega2560
- IDE:Microchip Studio v7.0.2594
- 工具链:WinAVR(也曾尝试Native工具链)
问题描述
项目编译成功,但UART字符串发送函数无法正常工作:调用UART_TxString(MOD_UART1,"\nHello")时,MCU通过UART端口发送全0;但逐个调用UART_TxByte发送单个字符的操作完全正常。
代码示例
调用代码
UART_TxString(MOD_UART1,"\nHello"); // 此调用导致UART发送全0 UART_TxByte(MOD_UART1,'\n'); // 工作正常 UART_TxByte(MOD_UART1,'H'); // 工作正常 UART_TxByte(MOD_UART1,'e'); // 工作正常 UART_TxByte(MOD_UART1,'y'); // 工作正常
函数定义
void UART_TxByte(sys_module module, uint8_t byte) { switch(module) { case MOD_UART0: { while (( UCSR0A & (1<<UDRE0)) == 0) ; // 等待UDR寄存器就绪 UDR0 = byte; break; } case MOD_UART1: { while (( UCSR1A & (1<<UDRE1)) == 0) ; // 等待UDR寄存器就绪 UDR1 = byte; break; } default: break; } } void UART_TxString(sys_module module, char* string) { while(*string) { UART_TxByte(module, *string); string++; } }
补充说明
曾多次使用Atmega系列MCU,此前传递字符串给UART、LCD或无线模块的同类函数均能正常工作;尝试将字符串存入全局数组后再传递给UART_TxString,问题依旧。
更新:临时解决方案
找到一个临时可行的实现方式,但存在局限性:
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); // 无法正常工作
至今仍未找到while(*string)循环失效的根本原因。
内容的提问来源于stack exchange,提问作者Manish Verma
相关产品推荐
相关产品推荐

