我编写了一个从压力传感器串行读取 RPi 的代码。不知何故,我的代码从串行传感器读取原始数据,但我的
while
循环不起作用,我打赌是空白屏幕。
我做错了什么?完整代码如下:
import serial
import sys
import time
gauge = serial.Serial(
port = '/dev/serial0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout = 1
)
while(True):
while(True):
input_string = list(gauge.read(2)) #watch for two magic bytes
if(input_string[0] == 7 and input_string[1] == 5):
input_string += list(gauge.read(9-2)) #append the rest of the data
if((sum(input_string[1:8]) % 256) == input_string[8]): #compute checksum
break
gauge_value = 10.0**((input_string[4] * 256.0 + input_string[5]) / 4000.0 - 12.5)
if(len(sys.argv) > 2):
print("mBar: {} Pa: {} Status: {} ({}) Error: {} ({})".format(gauge_value,gauge_value*100000.0,
input_string[2],bin(input_string[2]),
input_string[3],bin(input_string[3])))
else:
print("{},{}".format(time.time(), gauge_value))
这是读取原始数据的代码:
import serial
import time
ser = serial.Serial(
port='/dev/serial0',#Replace ttyUSB0 with ttyAMA0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
while 1:
x=ser.readline()
print (x)
原始数据如下:
'\n'
b'\x8e\x07\x05@\x08\xbcI(!\xfe\x15A\x00\xec\x1c\x00\x8d\xbc\x87\x1c\x1c\xf4!\x00\n'
b'\x1c\x07\x05\x00\x00\xec\x95\x94\xb5\xf8\x144\x15\xec\x0e\x00\n'
b'\t\x07\x05 \x88n8H$\xa8\x1c\x00\xec\x03\x00\xca{\x07\x15\x90\xb0\xb5?\n'
b'\xf3P\x10\x00\xeb\xb6\x08\x95\xbc(\x1c\x1c\xb4\xfa\x00\n'
所以我的猜测是我在
while
循环中犯了一些错误。
为了澄清以下设备手册中的消息格式:
我会一次读取 1 个字节,直到得到
0x7
和 0x5
。由于我没有设备,所以我无法真正测试这个,所以...
# Helper function that does not yield (return) until it has a good message
def next_msg(guage):
while True:
# Look for 7,5 combo
msg_start = [None, None]
while msg_start != [7, 5]:
msg_start[0] = msg_start[1]
msg_start[1] = guage.read(1)[0]
# If we are here, we have a valid 7,5 start of message
payload = guage.read(6)
checksum = guage.read(1)[0]
if sum(payload) % 255 == checksum:
yield (payload[0], payload[1], payload[2] * 256 + payload[3], payload[4], payload[5])
for status,error,measurement,version,sensor_type in next_msg(guage):
# Do something with the data...
print(status, error, measurement, version, sensor_type)
旁注:请注意
if
和 while
语句中缺少括号以及关键字后面的空格。更符合Python格式化风格。