使用 Pyserial 时的字符转换错误
Character conversion errors when using Pyserial
我一直在编写一个脚本,定期从串行设备中提取数据。除了我从设备收到的响应包含许多问号外,一切正常。由于根据设备文档(正确的字符数、逗号位置等)我得到的格式是正确的,所以我很确定我的代码以某种方式解释了错误的字符。这是我的代码:
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 控制的东西。
抱歉啰嗦 post,在此先感谢 any/all 的帮助!
代码看起来正确。
尝试使用 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)
您的代码正在使用 8 位数据字节,请尝试将其更改为 7,如文档所述:
bytesize = serial.SEVENBITS,
您使用的是什么硬件串行接口?请记住,有些需要在两者之间接地才能正常工作。
我一直在编写一个脚本,定期从串行设备中提取数据。除了我从设备收到的响应包含许多问号外,一切正常。由于根据设备文档(正确的字符数、逗号位置等)我得到的格式是正确的,所以我很确定我的代码以某种方式解释了错误的字符。这是我的代码:
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 控制的东西。
抱歉啰嗦 post,在此先感谢 any/all 的帮助!
代码看起来正确。
尝试使用 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)
您的代码正在使用 8 位数据字节,请尝试将其更改为 7,如文档所述:
bytesize = serial.SEVENBITS,
您使用的是什么硬件串行接口?请记住,有些需要在两者之间接地才能正常工作。