PySerial read()未命中帧d的开头

2024-04-27 20:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个程序,通过Meter-Bus协议与智能仪表(电、热等)通信。我有一个M总线<;->;RS232转换器和RS232<;->;USB。在

当我用heatmeter测试Python脚本时,通过向它发送一个命令,它会用一个很长但正确的帧来响应我,如果我在只得到部分frame response之后不久再次查询它。等待30秒左右有助于正确获取整个帧。这种部分响应总是相同的。Heat meter respond frames

但是电能表总是一样的,虽然整个正确的帧要比热量表短,但我总是只得到相同的部分(略超过一半字节,从来没有开始)。Electricity meter respond frames

还有一个命令初始化slave-slave用'\xE5'响应,即使我看到Rx二极管在闪烁,我也捕捉不到这个字节。在

我所做的:

  1. 我尝试读取比缓冲区中更多的字节,比如ser.read(500)

  2. 尝试使用ser.inwaiting,但它将返回0,直到我在它之前使用time.sleep(1)

  3. 正在从pySerial inWaiting returns incorrect number of bytes加载字节块

  4. 操作xonxoff参数和timeout

一切都没有效果。在

import serial
import time

def ser_to_mbus():
    ser = serial.Serial(
        port='COM4', 
        baudrate=2400, 
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_ONE,
        timeout=2,
        #write_timeout=1,
        xonxoff=False,
        rtscts=False,
        dsrdtr=False,
        #inter_byte_timeout=0.01,
        )
    # Should receive a hex response '\xE5' with command below.
    #to_send = b'\x68\x0B\x0B\x68\x73\xFD\x52\x84\x11\x10\x00\xFF\xFF\xFF\xFF\x63\x16'
    #to_send = b'\x10\x7B\x01\x7C\x16' # heat meter request frame
    to_send = b'\x10\x7B\xFD\x78\x16' # electricity meter request frame
    ser.write(to_send)
    ser.close()

def mbus_to_ser():
    ser = serial.Serial(
        port='COM4', 
        baudrate=2400, 
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_ONE,
        timeout=1,
        #write_timeout=1,
        xonxoff=1,
        rtscts=False,
        dsrdtr=False,
        #inter_byte_timeout=0.2,
        )
    time.sleep(1) # Otherwise ser.in_waiting is empty. 
    buffer_size = ser.in_waiting
    frame = ser.read(buffer_size)
    return frame

ser_to_mbus()
frame = mbus_to_ser()
print(frame)

我用EMU监视M总线帧,用Serial Port Monitor监视串行端口。EMU发送和接收的帧总是正确的,串行监视器也是如此。如果我用我的代码发送和接收帧,串行监视器会得到和我在终端上一样的结果——它会看到错误的“切片”帧。在

设备只有在接收到正确的请求后才会响应(我看到Rx二极管闪烁)。在

我不知道线程是否有问题,或者缓冲区有问题,或者Python脚本不够快,无法捕获缓冲区中的所有字节?在


Tags: tosendfalse字节timetimeoutserialframe