Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 串行端口不工作?_Javascript_Node.js_Socket.io_Arduino_Node Serialport - Fatal编程技术网

Javascript 串行端口不工作?

Javascript 串行端口不工作?,javascript,node.js,socket.io,arduino,node-serialport,Javascript,Node.js,Socket.io,Arduino,Node Serialport,我制作了一个程序,向我的arduino发送数据,arduino检测发送的内容,然后根据按下的键打开正确的pin 在windows计算机上使用arduino软件时,arduino草图工作正常,我可以通过发送W A S或D来打开和关闭每个管脚 通过节点发送时,arduino上的RX指示灯闪烁,但没有其他情况发生 有人能帮忙吗 Node.js程序: var httpServer = require('http').createServer(function(req, response){ /* Ser

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

在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从Arduino IDE以外的大多数设备接收串行通信时,Arduino会自动复位。这就是为什么您可以从IDE发送,但不能从node.js发送

我有一个Uno,在复位和接地之间放了一个电容器。这是一个关于这个主题的好信息页面。

祝你好运

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

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

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

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


在这里描述的问题中,我不认为他因为使用重置技巧而有任何问题。当他打开串行端口时,它应该只有重置Arduino的效果,从他的信息来看,这是一个期望的副作用

我每天使用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上很容易读取数据:(注意,您需要在某个地方定义数据头和数据脚)

void readCommands(){
while(Serial.available()>0){
//读取流的第一个字节。
uint8_t行动数;
uint8_t receivedbyte=Serial.read();
//若第一个字节等于dataHeader,那个么让我们这样做
if(receivedByte==数据头){
延迟(10);
//获取要执行的操作数
numberOfActions=Serial.read();
延迟(10);
//执行每个操作
对于(uint8_t i=0;i
我希望我是清楚的,我希望它有帮助!
干杯!

在我的例子中,问题是重置,但串行端口已打开-但在重置完成之前无法写入。在写入端口之前延迟3秒解决了问题。写入ASCII不是问题。

更新,从外观上看,arduino没有检测到串行端口可用。我不知道是否没有这有帮助。我的第一个想法是串行端口被检测到并工作(由于led闪烁)。我猜是在发送端。试试谷歌搜索“ComEmulDrv3”。它应该允许您设置一个虚拟组件,允许您验证发送的内容。需要查找的内容包括字符编码和空格。嗯,但示例甚至要求您重新启动arduino:为了让IDE上载代码,它必须能够重新启动arduino。因此,无论何时进行上载,您都必须删除capacitor,让它上传,然后更换电容器使串行正常工作(不重新启动)。您的代码看起来不错,尤其是当它从IDE发送串行数据时工作正常。嗯,但是当使用它发送的IDE时,当使用节点时,它不会。目前我正在等待一个逻辑电平转换器,以便我可以将它与我的Raspberry Pi上的串行端口一起使用。如果我这样做时它不工作,那么我将再次发布;)这是完全正确的,没有电容器/电阻器,串行通信几乎没有选择。我很确定,一旦你尝试添加这个,你的node.JST应用程序就会工作。VisualMicro,我可以证实你关于在C#中禁用DTR的评论,这对Arduino是有效的。对于node.js,我找到了这篇文章,其中他们使用“flowControl:false”初始化serialport,我希望这不会在DTR/DTS引脚上发送任何信号:serialport=newserialport(portName,{baudrate:9600,dataBits:8,奇偶校验:'none',stopBits:1,flowControl:false});
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
                }
            }
        }
    }
}