串口不工作?串口不工作?(Serial port not working?)

2019-05-17 08:34发布

我做了发出数据到我的Arduino检测什么被发送,然后按什么键被按下开启正确的引脚上的程序。

当使用从我的Windows电脑软件的Arduino Arduino的素描作品很好,我可以通过发送已经或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);
}

Answer 1:

我最近涉足到这个。 当收到比Arduino的IDE其他大部分事情串行通信Arduino的自动复位。 这就是为什么你可以从IDE发送但是无法Node.js的

我有一个乌诺,把复位和Ground.Here的页面之间的电容关于这个问题的一些好的信息。
祝好运。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection



Answer 2:

在电容和复位的问题...有串行控制线之一,并在以后的型号的Arduino的复位之间的小电容。 这个电容器导致的Arduino端口打开时复位,而是以其他方式不与正常的串行操作。

该复位招允许代码上传到Arduino复位作为上传过程的一部分。 当Arduino的启动代码引导装载程序第一次运行的时间很短的加载代码运行之前。

上载过程是:复位这将启动引导装载程序的Arduino,开始在Arduino的IDE上传过程中,建立通信,上传,然后运行加载代码。 当Arduino的启动等待上传的时间很短,如果没有收到,它移动到运行的代码。

我觉得这是非常有用的,因为它使我们能够仅仅通过关闭和打开的端口有效复位Arduino的。 在老的Arduino的,如果没有这个电容,你必须在正确的时间按下复位按钮,让代码上传。 和时机使得Arduino的花很长时间等前开始与上传的代码。

在这里描述的问题,我不相信他有因使用复位伎俩任何麻烦。 它应该有重置的Arduino当他打开串口之功效,并从他的信息外观上来看,这是一个预期的副作用。



Answer 3:

我日常使用的基础上,节点通过USB或通过蓝牙发送行动,以我的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
                }
            }
        }
    }
}

我希望我是清楚的,我希望它能帮助! 干杯!



Answer 4:

在我的情况的问题是复位,但串行端口被打开了 - 但直到复位完成不适用于写。 把一个3秒延迟写入端口之前固定的问题。 写ASCII是不是一个问题。



文章来源: Serial port not working?