【问题标题】:Serial port not working?串口不工作?
【发布时间】:2012-06-09 18:56:38
【问题描述】:

我编写了一个程序,向我的 arduino 发送数据,它检测发送的内容,然后根据按下的键打开正确的引脚。

在我的 Windows 计算机上使用 arduino 软件时,arduino 草图工作正常,我可以通过发送 W A S 或 D 来打开和关闭每个引脚。

通过节点发送时,arduino 上的 RX 灯闪烁,但没有其他反应。

谁能帮忙?

Node.js 程序:

var httpServer = require('http').createServer(function(req, response){ /* Serve your static files */ })
httpServer.listen(8080);

var nowjs = require("now");
var everyone = nowjs.initialize(httpServer);

everyone.now.logStuff = function(msg){
    console.log(msg);
}

var SerialPort = require('serialport2').SerialPort;
var assert = require('assert');

var portName;

if (process.platform == 'win32') {
  portName = 'COM4';
} else if (process.platform == 'darwin') {
  portName = '/dev/cu.usbserial-A800eFN5';
} else {
  portName = '/dev/ttyUSB0';
}

var readData = '';
var sp = new SerialPort();

sp.on('close', function (err) {
  console.log('port closed');
});

sp.on('error', function (err) {
  console.error("error", err);
});

sp.on('open', function () {
  console.log('port opened... Press reset on the Arduino.');
});

sp.open(portName, {
  baudRate: 9600,
  dataBits: 8,
  parity: 'none',
  stopBits: 1,
  flowControl: false
});

everyone.now.forward = function() {
sp.write("w");
}

everyone.now.back = function() {
sp.write("s");
}

everyone.now.left = function() {
sp.write("a");
}

everyone.now.right = function() {
sp.write("d");
}

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

Arduino 程序:

void setup(){
  Serial.begin(9600);
  Serial.write("READY");
  //Set all the pins we need to output pins
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop (){
  if (Serial.available() > 0) {

    //read serial as a character
    char ser = Serial.read();
    Serial.write(ser);
    //NOTE because the serial is read as "char" and not "int", the read value must be compared to character numbers
    //hence the quotes around the numbers in the case statement
    switch (ser) {
      case 'w':
        move(8);
        break;
      case 's':
        move(9);
        break;
      case 'a':
        move(10);
        break;
      case 'q':
        move(10);
        move(8);        
        break;
      case 'd':
        move(11);
        break;
      case 'e':
        move(11);
        move(8);
        break;
    }
  }
}

void move(int pin){
  Serial.print(pin);  
  digitalWrite(pin, HIGH);
  delay(1);
  digitalWrite(pin, LOW);
}

【问题讨论】:

  • 更新,从外观上看,arduino 没有检测到可用的串行端口。我不知道这是否有帮助。
  • 我的第一个想法是检测到串口并且工作(由于闪烁的 LED)。我的猜测是在发送端。尝试谷歌搜索“ComEmulDrv3”。它应该让您设置一个虚拟端口,让您验证您发送的内容。要查找的内容包括字符编码和空格。

标签: javascript node.js socket.io arduino node-serialport


【解决方案1】:

我最近涉足这个领域。当 Arduino 接收到来自 Arduino IDE 以外的大多数设备的串行通信时,它会自动重置。这就是为什么您可以从 IDE 发送但不能从 node.js 发送的原因。

我有一个 Uno,并在 Reset 和 Ground 之间放置了一个电容器。这是一个包含有关该主题的一些有用信息的页面。
祝你好运。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

【讨论】:

  • 嗯,但示例甚至要求您重新启动 arduino :S
  • 为了让 IDE 上传代码,它必须能够重新启动 Arduino。因此,无论何时进行上传,都必须卸下电容器,让它上传,然后更换电容器以使串行正常工作(无需重新启动)。您的代码看起来不错,尤其是在从 IDE 发送串行数据时可以正常工作时。
  • 嗯,但是当使用它发送的 IDE 时,当使用 node 时它不会。目前我正在等待一个逻辑电平转换器,以便我可以将它与我的 Raspberry Pi 上的串行端口一起使用。如果我这样做时它不起作用,那么我会再次发布;)
  • 完全正确,没有电容/电阻,串行通信的选择就很少。我很确定您的 node.JST 应用程序将在您尝试添加此应用程序后运行。
  • Visual Micro,我可以确认您关于在 C# 中禁用 DTR 并且适用于 Arduino 的评论。对于 node.js,我发现这篇文章 barryvandam.com/node-js-communicating-with-arduino 他们使用“flowControl: false”初始化串行端口,我希望这不应该在 DTR/DTS 引脚上发送任何信号:serialPort = new SerialPort(portName, { baudrate: 9600, dataBits :8,奇偶校验:'none',stopBits:1,flowControl:false});
【解决方案2】:

关于电容和复位问题... 在其中一条串行控制线之间有一个小电容器,并在后期型号的 Arduino 上复位。该电容器会在端口打开时使 Arduino 复位,但不会干扰正常的串行操作。

此重置技巧允许代码上传以在上传过程中重置 Arduino。当 Arduino 启动时,代码引导加载程序在加载的代码运行之前首先运行一小段时间。

上传过程是:重置启动boot loader的Arduino,在Arduino IDE中启动上传过程,建立通讯,上传,然后运行加载的代码。当 Arduino 启动时,它会等待上传一小段时间,如果没有收到,它会继续运行代码。

我发现这非常有用,因为它允许我们通过关闭和打开端口来有效地重置 Arduino。在旧的 Arduino 中,没有这个电容器,您必须在正确的时间按下重置按钮才能上传代码。而且时间安排使得 Arduino 在开始上传代码之前要花更多的时间等待。

在此处描述的问题中,我认为他不会因为使用了重置技巧而遇到任何麻烦。在他打开串口的时候应该只有重置Arduino的效果,从他的信息来看,这是一个期望的副作用。

【讨论】:

    【解决方案3】:

    我每天都使用 node 通过 usb 或 bt 向我的 Arduino 发送操作,它在这两种情况下都很好用。 我认为你的问题来自发送信件。您应该使用字母的 ascii 值发送一个缓冲区,就像这样:

    myPort.write(Buffer([myValueToBeSent]));
    

    另外,为此,我认为您最好使用一些“逻辑”接口,包括数据标题、操作数量等。这对您来说不是必需的,但它将使您的代码更加健壮,并且将来更容易修改。

    这是我如何做的一个例子。一、节点:

    var dataHeader = 0x0f, //beginning of the data stream, very useful if you intend to send a batch of actions
    myFirstAction = 0x01,
    mySecondAction = 0x02,
    myThirdAction = 0x03;
    

    然后你像以前一样打电话给他们:

    everyone.now.MyBatchOfActions = function() {
        sp.write(Buffer([dataHeader]));
    
        sp.write(Buffer([0x03])); // this is the number of actions for the Arduino code
    
        sp.write(Buffer([myFirstAction]));
        sp.write(Buffer([mySecondAction]));
        sp.write(Buffer([myThirdAction]));
    }
    

    这样在 Arduino 上很容易 Serial.read() 数据:(请注意,您需要在某处定义数据页眉和数据页脚)

    void readCommands(){
        while(Serial.available() > 0){
    
            // Read first byte of stream.
            uint8_t numberOfActions;
            uint8_t recievedByte = Serial.read();
    
            // If first byte is equal to dataHeader, lets do
            if(recievedByte == DATA_HEADER){
                delay(10);
    
                // Get the number of actions to execute
                numberOfActions = Serial.read();
    
                delay(10);
    
                // Execute each actions
                for (uint8_t i = 0 ; i < numberOfActions ; i++){
    
                    // Get action type
                    actionType = Serial.read();
    
                    if(actionType == 0x01){
                        // do you first action
                    }
                    else if(actionType == 0x02{
                        // do your second action
                    }
                    else if(actionType == 0x03){
                        // do your third action
                    }
                }
            }
        }
    }
    

    我希望我很清楚,希望对您有所帮助! 干杯!

    【讨论】:

      【解决方案4】:

      在我的情况下,问题是重置,但串行端口已打开 - 但在重置完成之前无法写入。在写入端口之前延迟 3 秒可以解决问题。写 ASCII 不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 2017-08-27
        相关资源
        最近更新 更多