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

C语言串口版本号字符串7.0.0被截断为7的问题如何解决?

问题根源

  • 核心错误:你定义的ESPFWVERSION是unsigned int类型数组,不是C语言标准字符串要求的char类型数组。在大多数32位平台下,unsigned int占4个字节,你将单字节的字符赋值给unsigned int元素时,只有最低字节存储了字符编码,剩余3个字节会自动补0。当你用%s格式符输出时,printf读取完第一个字符'7'(ASCII 0x37)后,紧接着就会读到下一个字节的0值,会被判定为字符串结束符,因此只会输出7。
  • 次要错误:字符串结束符赋值下标错误。循环结束时j的值等于你拷贝的有效字符总数,结束符应该赋值给下标j的位置,你写的j+1会导致有效字符和结束符之间多了一个未初始化的垃圾值。

修复方案

直接修改ESPFWVERSION的定义为char类型数组,同时修正结束符赋值逻辑即可,修复后代码如下:

// 改为char类型数组,符合C语言字符串存储要求
char ESPFWVERSION[10] = {0}; 
SendATandExpectResponse("AT+VERSIONINFO2", "OK");
sprintf(ttlbuffer, "%s\r\n",RESPONSE_BUFFER);
SendStringSerially(ttlbuffer);    
int j=0;

for (int i = 0; RESPONSE_BUFFER[i]!='*'; i++)
{
    char chR = RESPONSE_BUFFER[i] ;
    ESPFWVERSION[j] = chR;     
    j++;
    sprintf(ttlbuffer, "j=%i \r\n",j);
    SendStringSerially(ttlbuffer);           
}

// 结束符直接赋值到下标j的位置即可
ESPFWVERSION[j] = '\0';        

sprintf(ttlbuffer, "(%s)\r\n",ESPFWVERSION);
SendStringSerially(ttlbuffer);

额外优化建议

  • 建议给循环增加边界判断,避免RESPONSE_BUFFER没有*字符时数组越界,比如可以加上i < RESPONSE_BUFFER最大长度的判断条件。
  • 如果你的平台支持标准库函数,可以用strchr先定位*的位置,再用strncpy直接拷贝,不需要手动写循环,代码更简洁不易出错。

内容的提问来源于stack exchange,提问作者Milton Augustine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:03:03