Visual Studio C# 串口接收字符串显示正确却无法进入if语句问题
问题根因
你直接从串口读取的dataIN1字符串包含不可见的控制字符(最常见是设备发送时附带的回车符\r、换行符\n或首尾空白符),直接和"go"做全等匹配自然失败。而TextBox控件的Text属性在赋值时会自动过滤掉部分末尾的控制类不可见字符,因此从文本框取出的内容是干净的"go",可以匹配成功。
解决方案(无需依赖文本框中转)
方案1:清洗读取到的字符串
直接对串口读取的内容做首尾空白/控制字符清理,用Trim()方法即可实现,大部分场景下都能解决问题:
dataIN1 = serialPort1.ReadExisting().Trim(); // 自动去掉首尾的\r、\n、空格、制表符等 if (dataIN1 == "go") { // 你的业务逻辑 }
方案2:全局缓冲区拼接(适配分包发送场景)
如果设备会拆分发送g和o两个字符,你可以维护一个全局的接收缓冲区,每次读取到新数据就追加进去,匹配到指令后再做处理:
// 定义全局串口接收缓冲区 private string serialRecvBuffer = string.Empty; // 串口接收事件中的逻辑 dataIN1 = serialPort1.ReadExisting(); serialRecvBuffer += dataIN1; if (serialRecvBuffer.Contains("go")) { // 执行业务逻辑 // 处理完成后清空已匹配的内容,避免重复触发 serialRecvBuffer = serialRecvBuffer.Replace("go", string.Empty); }
排查调试方法
如果以上方法都不生效,可以把读取到的字符串转成原始字节数组,确认多余的不可见字符是什么:
// 打断点查看rawBytes数组的内容,正常"go"对应字节为0x67、0x6F,多出的字节就是多余字符 byte[] rawBytes = Encoding.ASCII.GetBytes(dataIN1);
同时确认serialPort1.Encoding属性和设备的发送编码一致,默认一般为ASCII编码。
内容的提问来源于stack exchange,提问作者sander meer
相关产品推荐
相关产品推荐

