串口不工作?
我做了一个程序,向我的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);
}
我最近涉足到这个。 Arduino从Arduino IDE以外的大多数产品接收串行通信时会自动重置。这就是为什么你可以从IDE发送而不是node.js.
我有一个Uno,并在Reset和Ground之间放置了一个电容。这里有一些关于这个主题的好消息。
祝你好运。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
嗯,但这些例子甚至要求您重新启动arduino:S –
为了让IDE上传代码,它必须能够重启Arduino。因此,无论何时进行上传,您都必须移除电容,让其上传,然后更换电容串行以正常工作(无需重新启动)。你的代码看起来不错,特别是当它从IDE发送串行数据时能正常工作。 – ZnArK
嗯,但是当使用它发送的IDE时,使用节点时它不会。目前我正在等待一个逻辑电平转换器,这样我就可以将其与Raspberry Pi上的串行端口一起使用。如果我不这样做,那么我会再次发布;) –
关于电容器和复位问题... 在其中一个串行控制线之间有一个小电容,并在后面的型号中的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
}
}
}
}
}
我希望我很清楚,我希望它有帮助! 干杯!
更新,通过它的外观arduino没有检测到可用的串行端口。我不知道这是否有帮助。 –
我的第一个想法是,串行端口被检测到并正在工作(由于led闪烁)。我的猜测是在发送端。尝试使用谷歌搜索“ComEmulDrv3”。它应该让你建立一个虚拟comport让你验证你的发送。要寻找的东西包括字符编码和空格。 – cstrutton