为什么Arduino和Raspberry Pi之间通过串行方式进行的通讯如此缓慢

时间:2019-07-10 05:03:56

标签: arduino communication

我正在尝试通过串行连接从树莓派向arduino发送一些数据,但速度似乎太慢。我要做的就是打开和关闭arduino板上的灯,然后通过串行连接发送切换灯的信号。

按以下代码所示的时间间隔打开和关闭灯。当延迟大于1时,它可以正常工作,指示灯会打开和关闭,但是当我将延迟更改为小于1时,指示灯根本不会闪烁。我尝试更改波特率,但这无济于事。这两块板上的波特率相同。 下面的代码在树莓派上。

import serial
import time

serial_light = serial.Serial('/dev/ttyACM0', 250000)

delay = float (2)

while(1):
    inp = "60"
    print ("On\n")
    serial_light.write(inp.encode())
    time.sleep(float (delay))
    inp = "61"
    print ("Off\n")
    serial_light.write(inp.encode())
    time.sleep(float (delay))

// Arduino代码

int light = 13;

void setup()
{
    Serial.begin(250000);
    pinMode(light, OUTPUT);
}

void loop()
{
    int in = 0;
    while(Serial.available() == 0);
    in = Serial.parseInt();

    if(in == 60)
    {
        digitalWrite(light, HIGH);
    }
    else if(in == 61)
    {
        digitalWrite(light, LOW);
    }
}

再次,它适用于延迟值> = 1,但不在0到1之间。

1 个答案:

答案 0 :(得分:1)

我更喜欢将String或int用作命令类型,而不是使用int的String。

您只需要在Python脚本中创建一个具有所需延迟的循环来发送开/关操作,然后在Arduino端只需接收命令并采取适当的操作即可。

Python脚本:

import serial
import time

delay = 2
serial_light = serial.Serial('/dev/ttyACM0', 9600)
serial_light.open()
# flush serial for unprocessed data
serial_light.flushInput()
while(1):
    print("On")
    serial_light.write(b"on")
    time.sleep(delay)
    print("Off")
    serial_light.write(b"off")
    time.sleep(delay)

Arduino代码:

int light = 13;

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

void loop()
{
    // check if we have input command
    if (Serial.available())
    {
        // read input
        String command = Serial.readString();
        if (command == "on")
        {
            digitalWrite(light, HIGH);
        }
        else if (command == "off")
        {
            digitalWrite(light, LOW);
        }
    }
}