我在端口运行时更改波特率时遇到麻烦。所有通信都以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中运行最后一个命令,而不是在函数内部。
我的问题是这里究竟发生了什么以及如何避免它?我只需要一个函数来发送一个具有不同波特率的字符串,然后返回原始波特率......
答案 0 :(得分:2)
我的猜测是在实际发送数据之前波特率正在改变。一个好的选择是在尝试更改波特率之前强制发送数据。
根据docs,这是通过调用Serial.flush()
(而非flushInput()
或flushOutput()
来完成的,因为这些只会丢弃缓冲区内容。)
答案 1 :(得分:1)
您需要等待足够长的时间才能在重置BAUD速率之前发送字符串 - 否则它会更改,而其中一些仍然在串行端口(硬件)缓冲区中。
在最后一行之前添加time.sleep(0.01*len(string))
。
BTW尽量不要使用像string
这样的保留字作为变量名,因为它可能会导致问题。