我有一个设备可以通过RS232串口以以下格式发送23个字符(数字和字母):
$ 02 T AAAAA Q CCC PP ZZZ S RR I I NFF $ 0D
(以上字符串中的空格仅供参考)
在这23个字符串中:
$ 02表示文本2十六进制的开头(我不确定这是什么十六进制?)
$ 0D代表回车的13位小数。
我目前大多数情况下都通过Python读取了此信息,但是我仍然觉得自己做得不好。我很少使用Python进行编程,但是我必须使用树莓派PI,因此决定使用python进行编码。
我使用以下功能设置RPI串行端口:
def setupSerialPort():
ser = serial.Serial(
port='/dev/ttyAMA0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1,
xonxoff=0,
rtscts=0
)
return ser
从while循环中,我读取端口如下:
# setup serial port
cSerial = setupSerialPort()
while 1:
inbuff = cSerial.inWaiting()
if inbuff > 0:
msgCOM = cSerial.read(inbuff)
#vMsgCOM = re.sub('[^A-Za-z0-9]+', '', msgCOM)
//insert value into database
sleep(1)
这时,在读取/接收数据时,我将值“ vMsgCOM”或“ msgCOM”字符串插入mysql数据库。最初,我认为这很好用,但经过一周的数据,很明显,有时我只捕获部分数据,这些数据分成两行,如前所述。我举一个例子:
正确的23个字符的字符串将如下所示:K00000E1120002000063B00。
现在有时候,字符串会分成两行,例如
(1)K00000E11200020
(2)00063B00
上述内容的另一种变化是将以下23个大块返回为:
K00000E1120002000063B00K00000E1120002000063B00K00000E1120002000063B00
在上述400次读取中,大约发生15次。
任何人都可以在编码方面帮助我,以某种方式确保在23个字符串到达时我总是正确读取缓冲区。我知道计时可能是一个问题,因此超时= 1,但是以某种方式我会在读取未完成时快速(或长时间)读取。
我看过这段代码(还没有尝试过):pySerial inWaiting returns incorrect number of bytes(def read_all(port,chunk_size = 200)函数部分)
,但我认为最好还是向有见识的人咨询。
在我的代码中,我有一些纠正代码可以合并这两行并在发生这些实例时拆分多个块事件,但我仍然认为这不是最好的处理方法。
如果有人可以帮助我提供一些示例代码,我将非常感谢。