系列文章目录-串口通讯
/C51串口通讯调试目录:/
第5章:#C51串口通讯5-#一串数据#中断定时+超时接收+接收应答+CRC校验
第4章:#C51串口通讯4-#一串数据#中断即时解析用户自定义协议(握手接收应答)
第3章:#C51串口通讯3-#一串数据#中断即时解析用户自定义协议
第2章:#C51串口通讯2-#一串数据#定时中断实现超时接收(推荐)
第1章:#C51串口通讯1-#一串数据#接收与发送(基础概念)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
本章前言
简介:
1.在#2章基础上(中断定时+超时接收)升级版
2.增加CRC校验方式及接收应答处理
3.指令解析,主函数执行
提示:以下是本篇文章正文内容,下面案例可供参考
一、场景
示例:
主机下发命令,从机解析并应答,CRC校验
二、编程实现
1.自定义协议
如:
| 地址 | 数据类型 | 数据区 | CRCL | CRCH |
|---|---|---|---|---|
| 01 | 01~03 |
##1
数据类型(功能码):
控制数码管显示0x01、蜂鸣器控制0x02
##2从机握手应答:
a.地址错误:
不予理睬
b.CRC校验正确:
完整数据返回
数据区数值显示在数码管上,仅作最大2组显示为例
c.CRC校验错误:
地址+[数据类型高位置1]+数据区+CRC
2.代码设计
第一步:#C51串口通讯2-#一串数据#定时中断实现超时接收(推荐)
样例工程的基础上继续开发,验证数据收发正确性。
第二步:添加数码管显示、led功能
第三步:验证CRC校验,样例采用CRC16-MODBUS(8005,FFFF,0000)
附上CRC代码(查表法):
unsigned int GetCRC16(unsigned char *puchMsg, unsigned int usDataLen)
{
unsigned char uchCRCHi = 0xFF ; //*高CRC字节初始化
unsigned char uchCRCLo = 0xFF ; //*低CRC字节初始化
unsigned long uIndex ; // CRC循环中的索引
// CRC 高位字节值表
unsigned char code auchCRCHi[260] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01,<

本章节详细介绍了如何在C51单片机上实现串口通讯,包括中断定时超时接收、自定义协议解析、CRC校验以及接收应答处理。通过中断即时解析用户自定义协议,增加了CRC校验以提高数据准确性,并针对地址错误、CRC校验正确和错误的情况设定了不同响应策略。同时,提供了CRC16-MODBUS的查表法实现代码,以及错误校验时的数据处理流程。

1796

被折叠的 条评论
为什么被折叠?



