如何将热敏打印机ESC/POS状态命令结果存入BASH变量?
问题描述
我在为运行精简版Ubuntu的瘦客户端编写脚本,用来检测RS232(ttyS0)连接的打印机是否正常。目前能向打印机打印内容,但无法读取打印机设置。
现有BASH脚本如下:
#!/bin/bash # Gather information ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1) locdate=$(date) drstatus="To be implemented yet" #[Set serial port speed] stty -F /dev/ttyS0 38400; #listen to the port report # cat /dev/ttyS0& #[Send print test to the printer] #initialize printer echo -e '\x1b\x40'>/dev/ttyS0 # send printer data echo -e '\x1b\x45 TM88 Hardware Test:\x1b\x46\xa'>/dev/ttyS0 echo -e $locdate'' >/dev/ttyS0 echo -e 'Hostname: '$HOSTNAME'' >/dev/ttyS0 echo -e 'Endpoint IP address: '$ip4''>/dev/ttyS0 echo -e '\x1d\x6b\x04000\x00'>/dev/ttyS0 echo -e 'Printer connected to COM1 / ttyS0'>/dev/ttyS0 echo -e 'Comm. speed 38400 bps'>/dev/ttyS0 echo -e 'Cash drawer status:'$drstatus'\xa'>/dev/ttyS0 echo -e '\xa\xa\xa\xa\xa\xa\x1bm'>/dev/ttyS0
发送读取设置的ESC/POS命令为:
echo -e '\x1d\x49\x01'>/dev/ttyS0
之后用cat < /dev/ttyS0查看响应,但没有任何输出。想知道如何将ESC/POS命令的响应存入BASH变量?
解决方案
1. 完善串口参数配置
串口通信仅设置波特率不够,必须匹配打印机的数据位、停止位、奇偶校验(常见为8N1:8数据位、无校验、1停止位,可参考打印机手册调整)。执行完整配置:
stty -F /dev/ttyS0 38400 cs8 -cstopb -parenb -icanon -echo
参数说明:
cs8:设置8位数据位-cstopb:使用1位停止位-parenb:关闭奇偶校验-icanon:关闭规范模式,避免系统缓冲干扰响应读取-echo:关闭回显,防止发送的命令被回读干扰结果
2. 读取响应并存入变量
直接用cat会无限阻塞等待输入,需结合超时或固定长度读取:
方法1:超时读取(推荐)
# 发送查询命令 echo -e '\x1d\x49\x01' > /dev/ttyS0 # 等待1秒读取响应,存入变量 printer_response=$(timeout 1 cat /dev/ttyS0) # 打印变量内容(响应含非ASCII字符,需用双引号包裹) echo "$printer_response"
timeout 1限制最多等待1秒,避免脚本长时间阻塞。
方法2:固定字节数读取
若已知响应的固定长度(比如手册说明为16字节),可直接指定:
echo -e '\x1d\x49\x01' > /dev/ttyS0 # 读取16字节响应,忽略dd的错误输出 printer_response=$(dd if=/dev/ttyS0 bs=1 count=16 2>/dev/null)
3. 排查要点
- 确认打印机支持该查询命令,且处于就绪状态(比如执行初始化命令
\x1b\x40后) - 检查串口线缆是否为双向通信线(部分廉价打印线仅含发送线,无接收线)
- 用
minicom或screen手动测试:执行screen /dev/ttyS0 38400连接串口,发送命令验证是否有响应,排除脚本逻辑问题
内容的提问来源于stack exchange,提问作者Eki
相关产品推荐
相关产品推荐

