使用Pyseri时出现字符转换错误

2024-05-08 14:11:25 发布

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

我一直在写一个脚本,定期从串行设备中提取数据。我的一切都在工作,除了我从设备收到的回复中有许多问号。根据设备的文档,我得到的格式是正确的(正确的字符数,逗号的位置等等),我很确定我的代码在某种程度上解释了字符错误。这是我的代码:

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

以及用户手册中的示例输出:

^{pr2}$

以及输出结果:

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

需要特别注意的是,在我的输出的最后一行,我的代码中的“>>;”与从串行设备读取的输出连接在一起,被更改为“?&这有点令人费解。作为参考,手册规定端口配置如下:

奇偶校验(奇数)*0LF奇偶校验:1位奇偶校验*0比特率终止符

我试过所有合理的端口设置。它看起来可能是一个奇偶校验问题(正如我在网上看到的另一个类似的输出是由于奇偶校验错误引起的),但是我已经尝试了所有可用的奇偶校验设置。我想知道这是否与起始位有关,因为这是我唯一不能通过Pyserial控制的东西。在

很抱歉我发了一篇冗长的帖子,并提前感谢你的帮助!在


Tags: 代码inputyouriftime错误exitserial
2条回答

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

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

编辑:

答案是(对于7位ASCII):

^{pr2}$

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

bytesize = serial.SEVENBITS,

你用什么硬件串行接口?请记住,有些需要接地才能使两者正常工作。在

相关问题 更多 >