[英]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.