我有一个销售点,我尝试通过rs232将要用卡收取的金额发送到POS。但是不起作用,我不理解文档。
我尝试完全从文档示例发送,但是POS停留在PROCESSING中并返回02 = error。如果我发送了不错的POS显示金额并等待用卡触摸,但在我的情况下POS返回菜单。
我的脚本:
import serial
import crc16
import time
port =serial.Serial("COM7")
port.close()
port.open()
print(port.isOpen())
print("Port opened...")
if True:
port.write(b'\x05')
response = port.read()
print(ord(response))
if response is not None:
fdata = b'\x02 00 04 a0 00 01 01 03 06 35'
port.write(fdata)
print(ord(port.read()))
文档:
示例文档:
在我的情况下,POS答案:
SEND : 05
RECEIVE : 06
SEND : 02 00 04 a0 00 01 01 03 06 35
RECEIVE : 02
答案 0 :(得分:1)
您的问题在这一行:
fdata = b'\x02 00 04 a0 00 01 01 03 06 35'
写字节流的正确方法是:
fdataok = b'\x02\x00\x04\xa0\x00\x01\x01\x03\x06\x35'
您可以验证自己的身份
>>> fdata == fdataok
False
您可能遇到的另一个问题是,您可能在完成发送数据之前先读取数据。默认情况下,您应该会阻止写操作,但是在定义端口以确保完全确定时,可能需要添加writeTimeout
。
代码中还有最后一个基本缺陷:您正在用port.read()
读取一个字节,您需要用port.read(port.inWaiting())
或port.read(x)
来替换它,用{{1} }预期的字节数(您不需要精确,只需将其设置为比您期望的数字高的字节数即可)。读取超时可能也是个好主意。