Python,串行 - 改变波特率,奇怪的行为

时间:2015-01-18 20:48:42

标签: python pyserial

我在端口运行时更改波特率时遇到麻烦。所有通信都以100k波特率运行,但我还需要以10k波特率发送一些数据。我已经读过我应该使用setBaudrate方法,所以我尝试了这个:

ser = serial.Serial(2, baudrate=BAUD, timeout=TIMEOUT)

def reset(string):
    if string:
        ser.flushInput() #erase input and output buffers
        ser.flushOutput()
        ser.setBaudrate(RESET_BAUD) #change baudrate to 10k
        ser.write(string)
        ser.setBaudrate(BAUD) #go back to 100k

问题是,它不能正常工作。我不知道这里有什么问题,但是字符串没有被正确接收。但这里有趣的部分 - 如果我删除最后一行(返回到100k)并从shell运行此函数,一切都很好。然后我可以直接在shell中运行最后一个命令,而不是在函数内部。

我的问题是这里究竟发生了什么以及如何避免它?我只需要一个函数来发送一个具有不同波特率的字符串,然后返回原始波特率......

2 个答案:

答案 0 :(得分:2)

我的猜测是在实际发送数据之前波特率正在改变。一个好的选择是在尝试更改波特率之前强制发送数据。

根据docs,这是通过调用Serial.flush()(而非flushInput()flushOutput()来完成的,因为这些只会丢弃缓冲区内容。)

答案 1 :(得分:1)

您需要等待足够长的时间才能在重置BAUD速率之前发送字符串 - 否则它会更改,而其中一些仍然在串行端口(硬件)缓冲区中。

在最后一行之前添加time.sleep(0.01*len(string))

BTW尽量不要使用像string这样的保留字作为变量名,因为它可能会导致问题。