我正在尝试让我的Raspberry Pi / Node.js与一个人进行通信 Arduino的 </跨度> Uno使用node-serialport。我遇到以下代码块时遇到问题:
覆盆子皮
var SerialPort = require鈥;); });});
Arduino的 </跨度>
//引脚12上的LEDint led = 12;
//传入的串行数据int data = 0;
void setup(){ //引脚12设置为OUTPUT pinMode(led,OUTPUT);
//开始收听序列端口
问题与Arduino的“AutoReset”有关,请参阅更多内容 这里 。
我实际上并没有禁用自动复制...我继续执行上面发布的代码。我需要用户交互来触发SerialPort.write()。只要打开串行连接和第一次写入之间有几秒钟,这就可以工作。
我的猜测是 new Buffer('4','ascii') 正在执行ASCII字符串,而不是ASCII字符。不同之处在于你没有发送 4 , 要么 44444444鈥r 使用你的循环但是 4\0 要么 4\04\04\04\04\04\04\0鈥r 使用你的循环。
new Buffer('4','ascii')
4
44444444鈥r
4\0
4\04\04\04\04\04\04\0鈥r
所以,当你这样做 Serial.available() ,它返回2,因为它有两个字节缓冲,但你只读了一个字节。由于Arduino的缓冲区是一个循环缓冲区,随着时间的推移被新数据覆盖,可能会发生的是你只是在阅读 \0 s,直到时间的推移,时间的变化,你只能阅读 4 秒。
Serial.available()
\0
我的建议是读取缓冲区中的字符数,或者简单地丢弃无效读取 Serial.read() 返回 -1 当缓冲区为空时:
Serial.read()
-1
const int led=12; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { // Read from serialport int data = Serial.read(); // Check and see if data received == 4 // and thus discard data==-1 or data==`\0` if(data=='4') { // Blink the LED 3 times for(int i=0;i<3;i++){ digitalWrite(led, HIGH); delay(1000); digitalWrite(led,LOW); delay(1000); } } }