串行读取未给出预期输出

问题描述 投票:0回答:1

我编写了一个从压力传感器串行读取 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
循环中犯了一些错误。 为了澄清以下设备手册中的消息格式: Manual

python raspberry-pi serial-port
1个回答
0
投票

我会一次读取 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格式化风格

© www.soinside.com 2019 - 2024. All rights reserved.