如何解码BioPhotometer面向打印机输出的串行数据并提取测量值
我尝试使用USB转RS232转换线读取BioPhotometer的输出信号,实现测量结果自动采集,无需手动录入显示屏数据。据了解该设备串口原本仅用于连接打印机,不支持直连接收数据,设备的“Printer”选项可设置为“Serial”或“DPU-414”两种模式。我将设备接入USB后,使用如下命令采集了两种模式下的样本测量输出:
(stty raw; cat > [format]_format.log) < /dev/ttyUSB0
两种模式的输出文件已分别保存。
我找到了DPU-414打印机手册,其中提到的IBM字符集我认为是CP 437字符集,因此尝试用如下Python代码读取日志文件:
with open('serial_format.log', 'r', encoding='cp437') as file: file_lines = [line for line in file]
之后我发现间隔取字符可以得到部分可读结果:
for line in file_lines: print(line[1::2])

从输出可见,15:42我做了空白测量,15:43做了第006号样本测量,吸光度为0.246A。目前我不清楚完整输出的标准格式,仅需要提取测量时间、样本编号、吸光度读数三个字段。
请问输出中的其他字符是什么?该问题是信号读取方式导致的还是文件解码方式导致的?我应该使用“Serial”还是“DPU-414”模式更合适?
补充
在Señor CMasMas的帮助下我重新查看了终端的串口读取设置,发现使用screen /dev/ttyUSB0 9600命令可以得到正确输出,十六进制转储文件已保存,如果需要其他格式的文件请告知。
另外运行screen后直接执行cat /dev/ttyUSB0也可以正常读取数据,我分别在运行screen前后执行stty -F /dev/ttyUSB0,对比得到的配置差异如下:
运行前配置:
speed 9600 baud; line = 0; -brkint -imaxbel
运行后配置:
speed 9600 baud; line = 0; min = 100; time = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo
查阅stty手册得知,选项前带“-”表示该功能未启用,我对配置的理解如下:
- brkint:中断信号触发规则,原配置的
-brkint消失,说明当前中断可触发信号 - icrnl:回车转换行功能,当前为
-icrnl,说明回车不会被转换为换行 - opost:输出后处理功能,当前为
-opost,说明输出不会经过后处理流程 - onlcr:换行转回车换行功能,当前为
-onlcr,说明该转换功能已关闭 - isig:中断、退出、挂起特殊字符启用开关,当前为
-isig,说明这些特殊字符不会生效 - icanon:擦除、删除等特殊字符处理开关,当前为
-icanon,说明这些特殊字符功能已关闭 - echo:输入字符回显功能,当前为
-echo,说明输入字符不会回显
我不太理解为什么关闭这些功能反而能得到正确输出,麻烦帮忙解释原因。
内容的提问来源于stack exchange,提问作者Noah Sprent

