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

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容易出问题,推荐两种靠谱的方法:

  1. 固定有效长度比较
    如果你确定正常输入是3个字符(比如"ABC"),可以直接对比前3位,避开后面的异常字符:
char target[] = "ABC";
if(input[0] == target[0] && input[1] == target[1] && input[2] == target[2]){
    // 匹配成功,执行逻辑
}
  1. 先清理异常字符再比较
    先把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:48