Raspberry Pi,Arduino,Node.js和串口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Raspberry Pi,Arduino,Node.js和串口相关的知识,希望对你有一定的参考价值。
我试图从node.js服务器脚本与我的arduino交谈。
这是我的代码:
var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server)
, SerialPort = require('serialport').SerialPort;
//SERIAL
var portName = '/dev/ttyACM0';
var sp = new SerialPort(); // instantiate the serial port.
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
baudRate: 115200, // this is synced to what was set for the Arduino Code
dataBits: 8, // this is the default for Arduino serial communication
parity: 'none', // this is the default for Arduino serial communication
stopBits: 1, // this is the default for Arduino serial communication
flowControl: false // this is the default for Arduino serial communication
});
//SERVER
server.listen(80, '127.0.0.5');
app.get('/', function (req, res){
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket){
socket.emit('test', { test: 'Its Working' });
socket.on('value', function (data){
console.log(data);
});
});
我很确定我的设备在/ dev / ttyACM0上,因为:
pi@raspberrypi ~/Programming/node $ dmesg|tail
[91569.773042] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[91569.776338] usbcore: registered new interface driver cdc_acm
[91569.776369] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[92601.131298] usb 1-1.2: USB disconnect, device number 7
[92609.044999] usb 1-1.2: new full-speed USB device number 8 using dwc_otg
[92609.149759] usb 1-1.2: New USB device found, idVendor=2341, idProduct=0043
[92609.149789] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[92609.149806] usb 1-1.2: Manufacturer: Arduino (www.arduino.cc)
[92609.149820] usb 1-1.2: SerialNumber: 74132343430351705051
[92609.156743] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
pi@raspberrypi ~/Programming/node $
当我尝试运行我的服务器脚本时,我收到错误:
pi@raspberrypi ~/Programming/node $ node server.js
info - socket.io started
/home/pi/node_modules/serialport/serialport.js:72
throw new Error('Invalid port specified: ' + path);
^
Error: Invalid port specified: undefined
at new SerialPort (/home/pi/node_modules/serialport/serialport.js:72:11)
at Object.<anonymous> (/home/pi/Programming/node/server.js:8:10)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
我确定我只是遗漏了一些简单的东西,但我不太了解Linux或Node知道它是什么。我需要为驱动程序安装arduino IDE吗?是因为我正在抨击我的覆盆子pi,我知道这使用串口但我想通过USB进行通信。这是可能的还是我只有1个串口,无论是USB还是串口?
编辑我已经安装了IDE,我可以通过IDE与arduino交谈。所以这不是驱动程序或缺少端口。
谢谢你的帮助。
乔
我认为这是因为SerialPort
的空参数,你稍后在open中指定
var sp = new SerialPort(); // instantiate the serial port.
//then you open
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
来自SerialPort npm项目页面
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("/dev/tty-usbserial1");
When opening a serial port, you can specify (in this order).
1. Path to Serial Port - required.
2. Options - optional and described below.
所以你应该在SerialPort中指定所有参数而不是open
var portName = '/dev/ttyACM0';
var sp = new SerialPort(portName, {
baudRate: 115200,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false
});
我有一个工作nodeJS / arduino / Serialport机器人。
我用过(你需要把串口改成自己的)
var serialport = require("serialport");
var SerialPort = serialport.SerialPort; // localize object constructor
var sp = new SerialPort(comPort, {
parser: serialport.parsers.readline("
"),
baudrate: 9600
});
sp.on("open", function () {
sp.write(0x80);
sp.write('123456
');
console.log ("comm port ready");
});
记住当您写入Arduino以“消耗”输出时。我的工作代码,我告诉机器人走向一个特定的方向。
robotData.setLastCommand(direction);
sp.write(direction , function(err, results) {
**sp.drain(function(err, result){**
//console.log ("drain");
//console.log(err, result);
});
//console.log ("results -> " + results);
});
也许这段代码可以帮助别人。我在Raspberry PI Zero W上运行它。
它使用解析器获取固定长度的字节(在本例中为16)并检查第一个字符是否为列:
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyAMA0', {
baudRate: 57600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false
});
var ByteLength = require('@serialport/parser-byte-length');
var parser = port.pipe(new ByteLength({length: 16}));
parser.on('data', function (data) {
var dataUTF8 = data.toString('utf-8');
if (dataUTF8.substring(0, 1) === ":") {
console.log('Data: ' + data);
}
});
注意:这个page对于像我这样在RPI系列上遇到麻烦的人来说非常有用
以上是关于Raspberry Pi,Arduino,Node.js和串口的主要内容,如果未能解决你的问题,请参考以下文章
使用 UART 从 Raspberry Pi 编程 Arduino
Raspberry Pi 和 Arduino 之间的简单 2 路串行通信
我有一个 Arduino Rs485 网络,正在尝试在 Raspberry Pi 中添加一个。 Pi 能够向 Arduino 发送消息,但无法接收