北京交通大学海滨学院电子与电气工程学院 沈 敏 张 静 王东振 金 钰
串口是单片机与其他单片机或计算机系统进行异步串行通信的标准I/O接口,在系统设计中应用非常广泛。以教学中使用的CPU字长是8位的51单片机为例,实现双机间多数据串行传输,在多数据发送时为每个数据增加特征值,接收的时候通过特征值判断接收的数据,此方法最多可以实现双机间16个数据的传送,适用于5-8个通道的数据采集系统。将此设计思想应用在0-999s的秒表系统设计中,系统运行稳定,实现预期效果。
单片机串口是异步串行通信,发送方发送数据并不考虑接收方什么时候接收,如果是传送1个数据比较好处理,串口无论工作在查询方式下还是中断方式下,接收方的CPU只要检测RI=1,就可以接收数据。
如果发送方发送的是多个数据,接收方接收的是发送方发送的多个数据的哪一个?发送方发送的多个数据是动态变化的,尽管发送方发送多个数据的顺序在编程中是固定不变的,但是串口通信是异步的,接收方接收时,无法知道此次接收的数据是发送方发送的哪一个数据,所以接收方必须有能力判断接收到的是哪一个数据才能真正实现异步串行通信多数据的正确传送。
要想让接收方有能力判断接收的数据是哪一个数据,可以对要发送的数据做加密处理,数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性。本设计借用数据加密的思想,对要发送的数据采用增加特征值的加密处理方法,乙机接收数据后,通过解密获取特征值,就可以知道接收的是哪一个数据了。特征值的选取要视发送数据的范围,本文以发送压缩BCD码说明数据加密的原理及编程实现。
压缩BCD码是用4位二进制表示1位十进制,由于设计中使用的单片机CPU的字长是8位的,所以一次可以处理1个字节数据,用字节表示1位BCD码的时候,高4位一定是“0”,低4位是”0-9”中的1个数字,这样用高4位的“0”就可以实现对数据加密处理。使用逻辑或指令,对传送数据的高4位用1-4个“1”做逻辑或的运算,增加一个特征值。从0001一直到1111,一共可以加密15个数据,如果加上0000,则可以实现对16个BCD码数据的高4位做加密处理。在实际双机通信系统中,下位机在现场检测数据,并把检测的数据做二进制到十进制的转换,将转换的结果通过串口发送给上位机进行显示,如果检测数据范围在0-999的范围,则上述加密方法可以对5个数据采集通道的数据做加密处理;如果检测数据范围在0-99的范围,则可以对8个数据采集通道的数据加密,该加密方法可以满足大部分双机通信系统设计中。
图1 数据加密及发送流程图
本文以0-999秒的秒表作为应用背景,发送方相当于下位机检测数据,发送方使用51单片机的定时器0工作在方式1、12MHZ晶振下,再利用“软计数”做1S定时,定时秒数的个位、十位和百位分别用R1、R2、R3分别存放,数据发送时串口工作方式2下,以查询的方式发送数据,对这3个数据做加密和发送的流程图如图1所示。
如果要发送的数据比较多,可以使用单片机集成的片内RAM来存放要发送的数据,具体的处理过程是一样的,只是可以使用寄存器间接寻址,通过循环的方式来加密、发送多个数据。
对图1流程图的汇编语言编程实现如下:
图2 数据接收算法流程图
MOV A,R1;取要发送的第1个数据
ORL A,#80H;加密,特征值是80H
MOV SBUF,A;发送
JNB TI,$;等待发送完成
CLR TI;清发送标志位,准备发送第2个数据
MOV A,R2;取要发送的第2个数
ORL A,#40H;加密,特征值是40H
MOV SBUF,A;发送
JNB TI,$;等待发送完成
CLR TI;清发送标志位,准备发送第3个数据
MOV A,R3;取第3个数据
ORL A,#20H;加密,特征值是20H
MOV SBUF,A;发送
JNB TI,$;等待发送完成
CLR TI;清发送标志位
51单片机的串口是异步通信,发送方与接收方工作时序不同步,所以当发送方发送多个数据时,接收方需要能判断接收的是哪一个数据,后续才能做出正确的处理。
接收数据的解密要根据发送方加密数据的方法进行,由于数据加密是利用压缩BCD码的高4位全是“0”,通过给高4位补充0-4个“1”的特征值的方法进行的,接收方接收的数据通过提取特征值的方法,就可以判断当前接收的数据是哪一个数据,接收方接收数据也是工作在查询方式下,具体的算法流程图如图2所示。
LP:JNB RI,$;等待接收完成
CLR RI;接收完成,清接收标志位,准备接收下一个数据
MOV A,SBUF;接收数据
MOV 30H,A;保存
ANL A,#0F0H;提取特征值
CJNE A,#80H,NEXT;与特征值80H比较,不相等继续比较,否则是第1个数据
MOV A,30H;取回保存在30H中的数据
ANL A,#0FH;提取第1个数据
MOV R1,A;保存第1个数据
SJMP XIAN
NEXT:CJNE A,#40H,NEXT1;与特征值40H比较,不相等继续比较,否则是第2个数据
MOV A,30H;取回保存在30H中的数据
ANL A,#0FH;提取第2个数据
MOV R2,A;保存第2个数据
SJMP XIAN
NEXT1:CJNE A,#20H,AGAIN;与特征值20H比较,不相等等待接收数据,否则是第3个数据
MOV A,30H;取回保存在30H中的数据
ANL A,#0FH;提取第3个数据
MOV R3,A;保存第3个数据
XIAN:ACALL DISP
AGAIN:SJMP LP
接收方在识别出接收的是哪一个数据后,通过调用显示子程序可以把识别的数据送到乙机数码管上显示,这样乙机上0-999s的秒数可以稳定的显示。
总结:保证双机通信多数据正确传输的关键是对发送的多个数据“加密”,具体的处理方法可以是对每个发送数据分别“加密”,然后接收方对接收的数据解密后根据加密特征值逐一对比,也可以只对发送一组数据的首个数据做特征值的“加密”处理,接收时只在接收到包含特征值的数据后才开始逐一接收,这样对发送数据的个数就没有限制了。