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
相关产品推荐
相关产品推荐

