C程序接收字符串末尾出现/UN?PIC18F蓝牙通信问题排查
关于PIC18F蓝牙通信中USART输入异常与字符串比较的问题
一、"/UN"是什么?对应什么按键?
首先,/UN不是标准转义序列,更可能是你的getsUSART函数对无法识别的控制字符的一种占位输出——这里的UN应该是"Unknown"的缩写,意思是函数读入了它认不出来的字符,就用这个标记代替了。
结合你的场景,大概率是这两种情况:
- 你输入"ABC"后按下了回车键(Enter):很多串口终端会把回车转换成
\r\n(ASCII码0x0D+0x0A),如果你的USART配置或者getsUSART函数对控制字符的处理逻辑不完善,就会把这些不可见字符转成/UN显示出来。 - 误触了终端的特殊功能键:比如Ctrl组合键、蓝牙模块的触发键等,这些按键会发送非可见的控制字符(比如ESC、DEL这类),函数无法识别就输出了占位符。
你可以做个简单测试确认:输入"ABC"后不要按任何额外按键,直接查看input内容;或者用代码把每个字符的ASCII码打印出来,比如:
for(int i=0; i<4; i++){ // 打印字符的十六进制ASCII值 putchUSART( (input[i] >> 4) < 10 ? '0' + (input[i] >> 4) : 'A' + (input[i] >> 4) -10 ); putchUSART( (input[i] & 0x0F) < 10 ? '0' + (input[i] & 0x0F) : 'A' + (input[i] & 0x0F) -10 ); putchUSART(' '); }
对照ASCII表就能知道这些字符到底对应什么按键了。
二、如何正确比较input与目标字符串?
因为input数组长度固定为4,还可能混入异常字符,直接用strcmp容易出问题,推荐两种靠谱的方法:
- 固定有效长度比较
如果你确定正常输入是3个字符(比如"ABC"),可以直接对比前3位,避开后面的异常字符:
char target[] = "ABC"; if(input[0] == target[0] && input[1] == target[1] && input[2] == target[2]){ // 匹配成功,执行逻辑 }
- 先清理异常字符再比较
先把input中不是可见ASCII字符(范围0x20~0x7E)的部分替换成字符串终止符\0,再用标准字符串函数比较:
// 清理数组中的异常控制字符 for(int i=0; i<4; i++){ if(input[i] < 0x20 || input[i] > 0x7E){ input[i] = '\0'; break; // 遇到异常字符就停止,后面的内容不用管 } } // 现在可以安全使用strcmp if(strcmp(input, "ABC") == 0){ // 匹配成功 }
另外要注意:确认getsUSART(input,4)是否会自动在数组末尾添加\0?如果没有的话,一定要手动补全,比如读取后立刻执行input[3] = '\0';,否则strcmp会读到内存里的垃圾数据,导致比较结果错误。
内容的提问来源于stack exchange,提问作者Lukali
相关产品推荐
相关产品推荐

