减少Arduino和Python之间串行通信的延迟

3

在使用串口通信时,Arduino和Python之间需要进行通信。Python程序需要等待一秒钟或更长时间,如下所示:

import serial as ser


prt = ser.Serial(
port='COM18',
baudrate=9600,
parity=ser.PARITY_NONE,
stopbits=ser.STOPBITS_ONE,
bytesize=ser.EIGHTBITS
)


while 1:
    prt.write(str(0) + '\r\n')
    time.sleep(1) #I want to reduce this time
    prt.write(str(1) + '\r\n')
    time.sleep(1)

这段代码中有 sleep(1)。它会使我的Python程序停顿一秒钟。我想要移除或缩短这个时间。我尝试将其改为0.9,但Arduino没有正确响应。

这是我的Arduino程序:

#define led 13

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);

}

void loop() {
byte incomingByte;

if (Serial.available() > 0) {
  incomingByte = Serial.read();
  switch (incomingByte) {
    case '1':
      digitalWrite(led, HIGH);
      break;
    case '0':
      digitalWrite(led, LOW);
      break;
    }

  }

  }

如何减少或消除这个延迟?为什么每次发送后都需要一个超过1秒的延迟?


1
你说的“arduino未正确响应”是什么意思?请具体说明。此外,树莓派还在做什么?你正在输出三个字符,这应该只需要大约3毫秒的时间发送,所以你应该能够将睡眠时间降至0.005,它仍然可以工作 - 但你可能难以看到LED以100Hz的速率闪烁。 - DisappointedByUnaccountableMod
1
你能配置Arduino使用更快的波特率吗?9600是相当标准但也非常慢。根据我的经验,115200现在相当普遍,但我不了解Arduino。 - CivFan
@CivFan .. Arduino可以使用更高的波特率。但据我所知,它决定了传输速度。传输速度在这个系统中不是问题。问题是为什么每次发送后需要延迟(超过1秒)? - user119o
1
“为什么每次发送后需要延迟...?” - 这样的延迟通常是一种粗糙/无知的方法,用于延迟写操作完成(也称为draining,不应与flushing混淆)。 - sawdust
1
让Arduino回显它接收到的内容,它能快速完成吗?顺便说一句,在发送字符时不需要添加\r\n,这只是Arduino所关心的噪音。 - DisappointedByUnaccountableMod
显示剩余4条评论
1个回答

0

你可以告诉Arduino在接收到每个传入消息后发送一个短(1-2字节)的确认消息,即所谓的确认。在树莓派端,在每次发送后等待此确认,并且在从Arduino接收到确认之前不发送任何内容。这种技术在许多消费者和工业串行协议中使用。

如果需要,您还可以增加数据传输速率。但是,请注意不要超过115200的速度。如果使用长的未屏蔽电线,则连接可能不稳定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接