You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:43:25