安装串口
// serialport版本不一样则使用方法有差异,这里使用10.4.0版本
npm install --save serialport
npm install --save serialport@10.4.0
串口工具
工具用来测试读取串口是否成功连上
- SerialPort Usage | Node SerialPort
- UartAssist.exe
SerialPort
属性
path
baudRate
isOpen
binding
事件
-
open
端口打开时触发; -
error
发送错误时触发; -
close
端口关闭时触发; -
data
收到数据时触发; -
drain
如果write方法返回false,则再次调用write方法时将触发该事件;
方法
-
open(() => {}): void
打开端口; -
update(options: updateOptions, callback?: err => {}): void
更改波特率; -
write(data: string|Buffer|Array<number>, en[**coding**](https://www.lsjlt.com/tag/coding/)?: string, callback?: error => {}): boolean
发送数据; -
read(size?: number): string|Buffer|null
读取数据; -
close(callback?: error => {}): void
关闭端口; -
set(options: setOptions, callback?: error => {}): void
设置流控制; -
get(callback: (error, data: ModemStatus) => {}): void
获取已打开端口的流控制状态; -
flush(callback? error => {}):void
清空接收和发送缓存中未处理数据; -
drain(callback? error => {}):void
等待数据发送完成; -
pause(): this
暂停 flowing mode 触发data事件,转为 paused mode; -
resume(): this
恢复 data 事件,从 paused mode 转为 flowing mode;
代码使用
const {SerialPort} = require("serialport");
const serialport = new SerialPort({
path:"COM3", // 串口号
baudRate:9600, // 波特率
dataBits:8, // 数据位
parity:"none", // 奇偶校验
stopBits:1, // 停止位
autoOpen:false // 是否自动打开端口
});
// 打开串口
serialport.open((err) => {
if(err) {
return console.log('Err: ', err);
}
console.log('端口打开成功!');
});
serialport.removeAllListeners(); //清除所有监听器
// 串口数据监听
serialport.on("data",data=>{
console.log('Data:', data) // data为监听到的内容,即下位机返回的数据
})
// 串口关闭
serialport.on("close", () =>{
console.log('串口关闭')
})
// 错误监听
serialport.on('error', (err) =>{
console.log('error: ' err)
})
// 发送数据,实现下行数据
serialport.write('Hello world!\n'); // 发送字符串
serialport.write(Buffer.from('Hey!\n')); // 发送Buffer数据
数据处理
如果串口传递过来的数据,被一段一段的切分开,这样就会很难处理数据,
例如: 原数据为01 3D 47 00 00 12 A4 32 33
可第一次接收到的就为 01 3 剩下的D 47 00 00 12 A4 32 33 会被遗留到第二次发送
解决方法
- 数据粘包与分包
- 建立缓存区对数据进行合并拆分