二、串口通信基础理论:RS232标准、波特率、数据位、停止位、校验位、串口通信协议模型

好,咱们进入正题。串口通信,说白了就是让两台设备之间能「说上话」。点钞机跟电脑之间怎么聊?就是靠串口。我最早接触串口是在大学实验室,当时觉得这东西又慢又土,后来做项目才发现——稳定才是王道。

2.1 RS232标准——老当益壮的通信协议

RS232标准,诞生于1960年代。你别看它老,工业设备里至今还在大量使用。为什么?因为它简单、可靠。

RS232定义了电压标准:

  • 逻辑1(Mark):-3V ~ -15V
  • 逻辑0(Space):+3V ~ +15V

嗯,这里要注意:RS232用的是负逻辑。跟咱们平时想的「高电平是1」正好相反。我第一次调试时就被这个坑过——示波器上看到波形明明是对的,但电脑就是收不到数据。后来才发现,我把电平搞反了。

⚠️ 避坑指南:我曾经在项目中直接用TTL电平(0-5V)去接RS232接口,结果烧了一块主板的串口芯片。记住:RS232和TTL电平不兼容,必须用MAX232这类芯片做电平转换。

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抗干扰能力强,调试时少很多麻烦。

💡 小技巧:收发双方的波特率必须一致,误差不能超过±2%。我曾经遇到过一台点钞机,标称9600,实际测出来是9580。差了0.2%,没问题。但如果差到5%,数据就全乱了。

怎么算波特率误差?举个例子:

实际波特率 = 系统时钟频率 / 分频系数
误差 = |实际波特率 - 标准波特率| / 标准波特率 × 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 串口通信协议模型——数据怎么「打包」

光有物理层的参数还不够,两台设备还得约定好「说话的方式」。这就是协议模型。

串口通信协议模型,一般分三层:

  1. 物理层:RS232标准、波特率、电平这些。刚才讲过了。
  2. 数据链路层:数据帧的格式,包括帧头、数据长度、数据内容、校验码、帧尾。
  3. 应用层:数据的具体含义。比如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去抓,结果抓了半天全是乱码。后来才发现,不同厂家的点钞机,帧头定义可能不一样。所以拿到设备第一件事——看协议文档。

💡 调试建议:用串口调试助手抓一下原始数据,看看帧头是什么、帧尾是什么。这是最直接的方法。我每次接新设备,都会先抓10分钟数据,摸清它的「说话习惯」。

好了,串口通信的基础理论就这些。说白了就是:定好电压、定好速度、定好数据格式,然后两边按规矩来。下一章咱们聊聊怎么用Python写代码,让电脑跟点钞机真正「聊起来」。