3

我正在开发一个 Arduino 项目来控制电机和读取传感器。我决定使用使用Node.js的 Web 视图作为介质通道,使用任一库(SerialPort 和 SerialPort2)从串行端口读取/写入浏览器。

当我使用电线将 Arduino 直接连接到 USB 设备时,两者都工作正常,但是当我通过无线适配器将 Arduino 连接到 USB 设备时,Node.js 似乎无法读取任何内容**(APC220)即使我可以使用 Arduino 串行监视器读取接收到的所有内容。

我检查了这背后的所有可能原因;我检查了用于与无线串行和 APC220 以及桥接器(USB 到串行转换器)进行 Arduino 通信的波特率。它们都具有相同的设置:9600 波特率,无奇偶校验/流控制,数据位:8,停止位:1。

行为如下。它可以毫无问题地连接到COM 端口,然后我尝试打印错误,但似乎两个 SerialPort 库都没有识别出错误。然后没有读取事件(数据),这意味着它(Node.js)没有与串行端口交互,即使它是打开的。

注意:我知道我可以使用另一个 Arduino 作为 USB 端口和无线适配器之间的媒介,但我想了解这个问题并在没有这样的工作的情况下干净地解决它。

问题可能是什么?

服务器 [node.js]:

var SerialPort  = require('serialport2').SerialPort;
var portName = 'COM15';

var io = require('socket.io').listen(8000); // Server listens for socket.io communication at port 8000
io.set('log level', 1); // Disables debugging. This is optional. You may remove it if desired.

var sp = new SerialPort(); // Instantiate the serial port.
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
   baudRate: 9600, // This is synchronised 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
});

io.sockets.on('connection', function (socket) {
    // If socket.io receives message from the client browser then
    // this call back will be executed.
    socket.on('message', function (msg) {
        console.log(msg);
    });
    // If a web browser disconnects from Socket.IO then this callback is called.
    socket.on('disconnect', function () {
        console.log('disconnected');
    });
});

var cleanData = ''; // This stores the clean data
var readData = '';  // This stores the buffer
sp.on('data', function (data) { // Call back when data is received
    readData = data.toString(); // Append data to buffer.
    // If the letters '[' and ']' are found on the buffer then isolate what's in the middle
    // as clean data. Then clear the buffer.
    console.log(readData); // **Here you should be able to print the data if you receive any**
     if (readData.indexOf(']') >= 0 && readData.indexOf('[') >= 0) {
        cleanData = readData.substring(readData.indexOf('[') + 1, readData.indexOf(']'));
        readData = '';
        console.log("-- "+cleanData);
        io.sockets.emit('message', cleanData);
     }else if(readData.indexOf('[') >= 0){
        cleanData = readData.substring(readData.indexOf('[') + 1, readData.length);
        readData = '';
     }else if(readData.indexOf(']') >= 0){
        cleanData += readData.substring(0, readData.indexOf(']'));
        readData = '';
        console.log("-- "+cleanData);
        io.sockets.emit('message', cleanData);
     }else{
        cleanData += readData;
        readData = '';
     }
    //console.log(readData);
    //io.sockets.emit('message', readData);
});
4

2 回答 2

0

当显示器运行时,没有其他程序可以读取串行端口。

如果您不同时打开两者,那么事情会更加棘手。我的建议是监视电线。即:安装Wireshark,看看串口/USB总线上的数据。

您可能还想检查 APC220 和 Arduino 的串行端口在其串行/USB 转换器方面有何不同。另一个想法是在 Linux 下分析这个问题,因为可以更深入地了解芯片组/USB 活动的低级差异。当然,如果您没有 Linux 经验,这很难做到,但也许您认识一些 Linux 爱好者。

于 2013-06-12T16:49:51.270 回答
-1

好吧,你的两个代码看起来都很好,所以我很确定你的问题很明显(比如你脸上的鼻子),因为你太专注于细节,所以你看不到。所以这是我首先要做的清单:

  • 确定你的串行接口是COM15,并且永远不会改变吗?
  • 您确定两个APC设备都配置了正确的波特率吗?
  • 您是否尝试让您的 Arduino 发送一个通过通道发送相同内容的简单代码?

喜欢:

void loop() {
  ...println("TEST");
  delay(1000);
}

在您的主机上:

sp.on('data', function (data) {
    console.log(data.toString());
});

当您的系统中出现错误时,请尝试构建该错误部分的最简单用例,这样您就可以确定代码中没有其他东西会干扰它。你不需要让你的 Arduino 在 GPS 上工作,你的 Node.js 也不需要在网络上工作。

尽可能让它变得最简单。(并且不要忘记在您的 Arduino 循环中添加延迟,否则您可能难以重新刷新芯片)。

您可能还想在代码中添加以下错误捕获部分serialport2

port.on('error', function(err) {
  console.log("ERROR receiving serial data: ", err);
});

以及您的open()声明:

sp.open(portName, portConfig, function (err) {
    console.log("ERROR opening serial port: ", err);
});

因为您可能缺少主机端的错误报告!

于 2013-06-19T12:10:15.370 回答