Node.js中使用SerialPort发送含0xC0的二进制序列出现编码异常的解决方案咨询
这个问题其实很常见——当你需要传输纯二进制数据时,SerialPort的默认编码配置或者错误的发送方式会偷偷把你的二进制字节转成字符串编码,导致像0xC0这类非UTF-8兼容的字节被破坏。下面是几个针对性的解决步骤:
用Buffer直接发送,且不要指定编码参数
你已经用Buffer.from(hexString, 'hex')创建了正确的二进制缓冲区,这一步是对的。但发送时一定要确保直接传递Buffer,并且不要给write方法加编码参数:const buff = Buffer.from("c0002d2d454f462d2d5061747465726e2d2d","hex"); port.write(buff, (err) => { if (err) { return console.error('写入错误: ', err.message); } console.log('数据已发送'); });如果给
write加了'utf8'这类编码参数,SerialPort会把Buffer先转成字符串再重新编码,0xC0这类字节会被错误转换。初始化串口时禁用自动编码
检查你的串口初始化代码,如果设置了encoding选项(比如encoding: 'utf8'),那SerialPort会自动把所有数据转成该编码的字符串,这是二进制数据的大忌。正确的配置应该去掉encoding,或者显式设为null:const { SerialPort } = require('serialport'); const port = new SerialPort({ path: '/dev/ttyUSB0', // 换成你的串口路径 baudRate: 9600, encoding: null, // 关键:以原始二进制模式工作 autoOpen: false });当
encoding为null时,所有读写操作都会直接处理Buffer,不会做任何编码转换。避免不必要的Buffer转字符串操作
如果你在发送前对Buffer做了toString()再转Buffer的操作,比如:// 错误示例! const messedUpBuff = Buffer.from(buff.toString()); port.write(messedUpBuff);这会导致0xC0这类非UTF-8有效字符被替换成
�(十六进制0xFFFD),彻底破坏你的二进制序列。一定要跳过这种多余的转换。验证Buffer的正确性
发送前可以先打印Buffer确认内容:console.log(buff); // 应该输出 <Buffer c0 00 2d 2d 45 4f 46 2d 2d 50 61 74 74 65 72 6e 2d 2d>如果打印的Buffer是正确的,那问题肯定出在串口的编码配置或者发送方式上。
总的来说,只要让SerialPort保持纯二进制模式,所有数据都以Buffer形式传递,就能阻止任何不必要的编码转换,0xC0字节也能被正确传输到设备。
内容的提问来源于stack exchange,提问作者ThomasS

