这个Node.js程序正在运行,它使用serialport和ws

这个Node.js程序正在运行,它使用serialport和ws,node.js,arduino,raspberry-pi3,Node.js,Arduino,Raspberry Pi3,项目委员会包括: 树莓皮3 Arduino Uno rev3 Git文件: var-webSocketUrl=”wss://api.artik.cloud/v1.1/websocket?ack=true"; var设备_id=“”; var设备_令牌=”; var isWebSocketReady=false; var-ws=null; var serialport=require(“serialport”) var SerialPort=SerialPort.SerialPort; var

项目委员会包括:

  • 树莓皮3
  • Arduino Uno rev3
Git文件:

var-webSocketUrl=”wss://api.artik.cloud/v1.1/websocket?ack=true";
var设备_id=“”;
var设备_令牌=”;
var isWebSocketReady=false;
var-ws=null;
var serialport=require(“serialport”)
var SerialPort=SerialPort.SerialPort;
var sp=new SerialPort(“/dev/ttyACM0”{
波特率:9600,
解析器:serialport.parsers.readline(“\n”)
});
var WebSocket=require('ws');
/**
*获取以毫秒为单位的当前时间
*/
函数getTimeMillis(){
返回parseInt(Date.now().toString());
}
/**
*创建a/websocket双向连接
*/
函数start(){
//创建websocket连接
isWebSocketReady=假;
ws=新的WebSocket(webSocketUrl);
ws.on('open',function(){
日志(“Websocket连接已打开…”);
寄存器();
});
ws.on('message',函数(数据,标志){
console.log(“收到的消息:+data+'\n”);
});
ws.on('close',function(){
日志(“Websocket连接已关闭…”);
});
}
/**
*向websocket发送寄存器消息并启动消息泛洪器
*/
函数寄存器(){
log(“在websocket连接上注册设备”);
试一试{
var registerMessage='{“type”:“register”,“sdid”:“+device_id+”,“Authorization”:“bearer'+device_token+”,“cid”:“+getTimeMillis()+”}”;
console.log('Sending register message'+registerMessage+'\n');
send(registerMessage,{mask:true});
isWebSocketReady=true;
}
捕获(e){
console.error('注册消息失败。注册消息时出错:'+e.toString());
}
}
/**
*向ARTIK Cloud发送一条消息
*/
函数sendData(onFire){
试一试{
ts=',“ts”:“+getTimeMillis();
风险值数据={
“onFire”:onFire
};
var payload='{“sdid”:“+device_id+”“+ts+”,“data”:“+JSON.stringify(data)+',“cid”:“+getTimeMillis()+”}”;
console.log('发送有效负载'+有效负载);
send(有效负载,{mask:true});
}捕获(e){
console.error('发送消息时出错:'+e.toString());
}
}
/**
*一切从这里开始
*/
start();//创建websocket连接
sp.on(“打开”,功能(){
sp.on(数据),功能(数据){
如果(!isWebSocketReady){
console.log(“Websocket未就绪。跳过向ARTIK Cloud发送数据(数据:“+data+”));
返回;
}
console.log(“串口接收数据:”+数据);
var flameDigitalValue=parseInt(数据);
//flameDigitalValue=1==>未检测到火灾
//flameDigitalValue=0==>检测到火灾
var onFire=假;
如果(值==0){
onFire=true;
}
发送数据(onFire);
});
});
出于某种原因,它不起作用我从这个网站上得到了代码:

但是他给了我这个错误:

pi@raspberrypi:~$node index.js
/home/pi/index.js:12
解析器:serialport.parsers.readline(“\n”)
^
TypeError:serialport.parsers.readline不是函数
反对。(/home/pi/index.js:12:32)
at模块编译(内部/modules/cjs/loader.js:654:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:665:10)
在Module.load(内部/modules/cjs/loader.js:566:32)
在tryModuleLoad(内部/modules/cjs/loader.js:506:12)
at Function.Module._load(内部/modules/cjs/loader.js:498:3)
位于Function.Module.runMain(internal/modules/cjs/loader.js:695:10)
启动时(内部/bootstrap/node.js:201:19)
在bootstrapNodeJSCore(internal/bootstrap/node.js:516:3)
我做错了什么?

serialport模块(解析器实现)在4.x版之后发生了更改

你有两个选择

a) 降级串行端口模块;如果您知道使用了哪个版本号(询问GitHub项目的作者)

注意,在代码末尾,您需要替换

sp.on('data' ...


希望这能有所帮助。

看来解析器已经从serialport库中分离出来,进入了它们自己的模块。您可能需要分别安装和
require()
它们。有关信息,请参阅。顺便说一句,我建议选择(b)。
const SerialPort = require('serialport');
const Readline = require('parser-readline');
const sp = new SerialPort('/dev/ttyACM0', {
        baudRate: 9600
});
const parser =  sp.pipe(new Readline({ delimiter: "\n"}));
sp.on('data' ...
parser.on('data' ...