从单片机基础到程序框架(全集 2019pdf版).pdf - 第808页

00 00 00 0 7 代表整个指 令的数据长度 。 ED 是前面所有 字节数据的异 或结果,用来 作为校 验数据。 (2)下位机返 回十六 进制的数据: EB 01 0 0 00 00 0C X X XX XX X X ZZ。 EB 是数据头。 01 是指令类型 ,01 代表返回大 数组的容量大 小。 00 00 00 0 B 代表整个指 令的数据长度 XX XX XX X X 代表大数组 的容量大小 ZZ 是前面所有 字节数据的异…

100%1 / 836
上图 134.4.1 双机通讯的 232 串口接线图
上图 134.4.2 上位机的独立按键
上图 134.4.3 上位机的有源蜂鸣
【134.5 例程的通讯协议。
(一)通讯参数。波特率 9600,校验位 NONE(无),数据位 8,停止位 1。
(二)上位机读取下位机的数组容量的大小的指令。
(1)上位机发送十六进制的数据:EB 01 00 00 00 07 ED。
EB 是数据头。
01 是指令类型,01 代表请求下位机返回大数组的容量大小。
00 00 00 07 代表整个指令的数据长度
ED 是前面所有字节数据的异或结果,用来作为校验数据。
(2)下位机返回十六进制的数据:EB 01 00 00 00 0C XX XX XX XX ZZ。
EB 是数据头。
01 是指令类型,01 代表返回大数组的容量大小。
00 00 00 0B 代表整个指令的数据长度
XX XX XX XX 代表大数组的容量大小
ZZ 是前面所有字节数据的异或结果,用来作为校验数据。
(三)上位机读取下位机的大数组的分段数据的指令。
(1)上位机发送十六进制的数据:EB 02 00 00 00 0F RR RR RR RR YY YY YY YY ZZ
EB 是数据头
02 是指令类型,02 代表请求下位机返回当前分段的数据。
00 00 00 0F 代表整个指令的数据长度
RR RR RR RR 代表请求下位机返回的数据的“请求起始地址”
YY YY YY YY 代表请求下位机从“请求起始地址”一次返回的数据长度
ZZ 是前面所有字节数据的异或结果,用来作为校验数据。
(2)下位机返回十六进制的数据:EB 02 TT TT TT TT RR RR RR RR YY YY YY YY HH ...HH ZZ
EB 是数据头
02 是指令类型,02 代表返回大数组当前分段的数据
TT TT TT TT 代表整个指令的数据长度
RR RR RR RR 代表下位机返回数据时的“请求起始地址”
YY YY YY YY 代表下位机从“请求起始地址”一次返回的数据长度
HH ...HH 代表中间有效的数据内容
ZZ 是前面所有字节数据的异或结果,用来作为校验数据。
【134.6 解决本节例程编译不过去的方法。
因为本节用到的全局变量比较多,如果有初学者在编译的时候出现“error C249: 'DATA': SEGMENT TOO
LARGE”的提示,请按下图的窗口提示来设置一下编译的环境。
上图 134.5.1 设置编译的环境
【134.7 例程的上位机程序。
#include "REG52.H"
#define RECE_TIME_OUT 2000 //通讯过程中字节之间的超时时间 2000ms
#define REC_BUFFER_SIZE 30 //常规控制类数组的长度
#define KEY_FILTER_TIME 25 //按键滤波的“稳定时间”
void usart(void); //串口接收的中断函
void T0_time(); //定时器的中断函数
void BigBufferUsart(void); //读取下位机大数组的“通讯过程的控制涵数”。三大核心函数之
void QueueSend(void); //发送的队列驱动涵数。三大核心函数之一
void ReceDataHandle(void); //接收数据后的处理涵数。三大核心函数之一
void UsartTask(void); //串口收发的任务函数,放在主函数内
unsigned char CalculateXor(const unsigned char *pCu8Buffer, //异或的算法函
unsigned long u32BufferSize);
//比较两个数组的是否相等。返回 1 代表相等,返回 0 表不相等
//u32BufferSize 是参与对比的数组的大小
unsigned char CmpTwoBufferIsSame(const unsigned char *pCu8Buffer_1,
const unsigned char *pCu8Buffer_2,
unsigned long u32BufferSize);
void UsartSendByteData(unsigned char u8SendData); //发送一个字节的底层驱动函