繁体   English   中英

串口无法正常工作?

[英]Serial port not working?

我制作了一个程序,将数据发送到我的arduino,检测发送的内容,然后根据按下的键打开正确的引脚。

当我从我的Windows计算机上使用arduino软件时,arduino草图工作正常,我可以通过发送WAS或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从Arduino IDE以外的大多数东西接收串行通信时,它会自动重置。 这就是您可以从IDE而不是node.js发送的原因。

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

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

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

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

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

在这里描述的问题中,由于使用了重置技巧,我不相信他有任何麻烦。 它应该只有在打开串口时重置Arduino的效果,从他的信息看起来,这是一个理想的副作用。

我每天都使用节点通过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
                }
            }
        }
    }
}

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

在我的情况下,问题是重置,但串口已打开 - 但在重置完成之前无法写入。 在写入端口之前放置3秒延迟修复了问题。 编写ASCII不是问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM