二、串口通信基础理论:RS232标准、波特率、数据位、停止位、校验位、串口通信协议模型
好,咱们进入正题。串口通信,说白了就是让两台设备之间能「说上话」。点钞机跟电脑之间怎么聊?就是靠串口。我最早接触串口是在大学实验室,当时觉得这东西又慢又土,后来做项目才发现——稳定才是王道。
2.1 RS232标准——老当益壮的通信协议
RS232标准,诞生于1960年代。你别看它老,工业设备里至今还在大量使用。为什么?因为它简单、可靠。
RS232定义了电压标准:
- 逻辑1(Mark):-3V ~ -15V
- 逻辑0(Space):+3V ~ +15V
嗯,这里要注意:RS232用的是负逻辑。跟咱们平时想的「高电平是1」正好相反。我第一次调试时就被这个坑过——示波器上看到波形明明是对的,但电脑就是收不到数据。后来才发现,我把电平搞反了。
RS232的接口形态,最常见的是DB9公头。引脚定义如下:
| 引脚号 | 信号名称 | 方向 | 说明 |
|---|---|---|---|
| 2 | RXD | 接收 | 接收数据 |
| 3 | TXD | 发送 | 发送数据 |
| 5 | GND | - | 信号地 |
| 7 | RTS | 输出 | 请求发送 |
| 8 | CTS | 输入 | 清除发送 |
实际跟点钞机通信,大多数情况下只用三根线:TXD、RXD、GND。够用了。
2.2 波特率——通信的「语速」
波特率,就是每秒传输的符号数。单位是bps(bits per second)。
常见的波特率有:9600、19200、38400、115200。
点钞机一般用9600或115200。我个人习惯先用9600调试,稳定后再切到高速。为什么?因为9600抗干扰能力强,调试时少很多麻烦。
怎么算波特率误差?举个例子:
实际波特率 = 系统时钟频率 / 分频系数
误差 = |实际波特率 - 标准波特率| / 标准波特率 × 100%
你想想看,如果单片机用11.0592MHz晶振,算9600波特率就很准。如果用12MHz晶振,算出来就有偏差。这就是为什么很多串口设备喜欢用11.0592MHz晶振的原因。
2.3 数据位——一次说几个bit
数据位,就是每个数据包携带的有效数据位数。常见的有7位和8位。
- 7位数据位:用于传输ASCII字符(0-127),老设备常用
- 8位数据位:可以传输0-255的数值,点钞机几乎都用这个
我建议你一律用8位数据位。为什么?因为点钞机传的数据通常是金额、张数、状态码,这些都需要0-255的范围。7位的话,128以上的数值就传不了。
2.4 停止位——说完话的「句号」
停止位,表示一个数据帧的结束。常见的有1位、1.5位、2位。
点钞机几乎都用1位停止位。1.5位很少见,我做了这么多年项目,只用过一次——跟一台老掉牙的票据打印机通信。
停止位越长,通信越可靠,但速度越慢。1位停止位是速度和可靠性的最佳平衡点。
2.5 校验位——数据对不对?
校验位,用来检测数据传输过程中有没有出错。常见的有:
| 校验方式 | 说明 | 适用场景 |
|---|---|---|
| 无校验(None) | 不添加校验位 | 短距离、干扰小的环境 |
| 奇校验(Odd) | 数据位+校验位中1的个数为奇数 | 对可靠性有一定要求 |
| 偶校验(Even) | 数据位+校验位中1的个数为偶数 | 跟奇校验类似,看协议怎么定 |
点钞机大多用无校验。为什么?因为点钞机通信距离短(一般就1-2米),干扰小。而且数据包里通常还有自己的校验机制(比如CRC),没必要在串口层再加一道。
波特率:9600 或 115200
数据位:8
停止位:1
校验位:None
简称「9600,8,N,1」
2.6 串口通信协议模型——数据怎么「打包」
光有物理层的参数还不够,两台设备还得约定好「说话的方式」。这就是协议模型。
串口通信协议模型,一般分三层:
- 物理层:RS232标准、波特率、电平这些。刚才讲过了。
- 数据链路层:数据帧的格式,包括帧头、数据长度、数据内容、校验码、帧尾。
- 应用层:数据的具体含义。比如0x01代表「开始点钞」,0x02代表「停止点钞」。
点钞机的典型数据帧格式长这样:
帧头(1字节) + 数据长度(1字节) + 命令字(1字节) + 数据体(N字节) + 校验码(1字节) + 帧尾(1字节)
举个例子:
AA 05 01 00 00 00 00 06 BB
解释一下:
AA:帧头,固定值05:数据长度,从命令字到校验码共5字节01:命令字,01表示查询状态00 00 00 00:数据体,4字节的占位06:校验码,前面所有字节的异或和BB:帧尾,固定值
我曾经在项目里遇到过一台点钞机,它的帧头不是AA,而是5A。我没仔细看文档,直接用AA去抓,结果抓了半天全是乱码。后来才发现,不同厂家的点钞机,帧头定义可能不一样。所以拿到设备第一件事——看协议文档。
好了,串口通信的基础理论就这些。说白了就是:定好电压、定好速度、定好数据格式,然后两边按规矩来。下一章咱们聊聊怎么用Python写代码,让电脑跟点钞机真正「聊起来」。