使用Pyserial时的字符转换错误

python serial-port ascii pyserial parity

919 观看

2回复

我一直在编写一个脚本,定期地从串行设备中提取数据。除了从设备接收到的响应中包含许多问号之外,我一切正常。由于根据设备文档获取的格式正确(正确的字符数,逗号位置等),因此我很确定我的代码以某种方式解释了错误的字符。这是我的代码:

import serial, time

ser = serial.Serial(
    '/dev/cu.usbserial',
    baudrate = 9600, 
    bytesize = 8, 
    timeout = 3, 
    stopbits = serial.STOPBITS_ONE, 
    parity = serial.PARITY_ODD, 
)

if(ser.isOpen() == False):
    ser.open()

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'


while 1 :
    # get keyboard input
    input = raw_input(">> ")

    if input == 'exit':
        ser.close()
        exit()
    else:
        ser.write(input + chr(13) + chr(10))
        out = ''

        time.sleep(3)

        while ser.inWaiting() > 0:
            out += ser.read(1)

        if out != '':
            print '>>' + out

和用户手册中的示例输出:

ENTER COMMAND? KRDG? 
RESPONSE: +273.15

ENTER COMMAND? *IDN?
RESPONSE: LSCI,MODEL331S,123456,020399

以及输出如下所示:

COMPUTERNAME$ python serialTest.py
Enter your commands below.
Insert "exit" to leave the application.
>> KRDG?
?>??4?2?8
>> KRDG?   
?>??4?2??
>> *IDN?
?>L?CI,?O?EL??1?,??????,12?4?7

需要特别注意的是,在我输出的最后一行上,我代码中的“ >>”与从串行设备读取的输出串联在一起,变成了“?>”,这有点令人困惑。作为参考,该手册指定端口应配置如下:

*波特率:9600 *字符位:1个开始,7个数据,1个奇偶校验,1个停止*奇偶校验:奇数*终结符:CR(0DH)LF(0AH)

我已经尝试了端口设置的所有合理排列。看起来这可能是一个奇偶校验问题(正如我看到的其他具有相似外观的输出(归因于在线奇偶校验错误)一样),但是我尝试了所有可用的奇偶校验设置。我想知道这是否与起始位有关,因为这是我无法通过Pyserial进行控制的唯一方法。

抱歉,发帖时间长,在此先感谢您提供的所有帮助!

作者: oirectine 的来源 发布者: 2019 年 10 月 27 日

回应 (2)


1

决定

该代码看起来正确。尝试使用ord以了解您获得的字节(字节可能不对应于ASCII符号),如下所示:

out = []
while self.conn.inWaiting() > 0:
    out.append(ord(self.conn.read(1)))
if len(out) > 0:
    print out

编辑:

答案是(对于7位ASCII):

out.append(self.conn.read(1) & 0x7F)
作者: Konstantin Purtov 发布者: 01.03.2016 08:32

0

您的代码使用8位数据字节,请尝试将其更改为7,如文档所述:

bytesize = serial.SEVENBITS,

您正在使用什么硬件串行接口?请记住,需要将两者之间的地面连接起来才能正常工作。

作者: J. P. Petersen 发布者: 02.03.2016 10:17
32x32