一、串口通信协议的组成部分
1、起始帧头
2、帧长(包含帧头帧尾的长度)
3、指令位
4、数据位
5、校验
6、结束帧尾
二、关于CRC循环冗余校验
将多项式按阶数定义为一串二进制数,与待校验数做模二除法,得出余数则为CRC码。
stm32自带硬件CRC。
stm32硬件CRC的操作步骤(基于标准库):
1、开启CRC时钟单元(具体挂载在哪条总线上请参考你使用的芯片。我用的是STM32F411,挂在AHB1上,所以初始化AHB1)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE)
2、复位CRC模块。这个操作把CRC寄存器的余数初始化为0xFFFFFFFF
3、把要计算的数据写入CRC_DR寄存器。
4、写完数据后,从CRC_DR寄存器中读出结果。
STM32F4XX中提供了如下函数:
void CRC_ResetDR(void) //复位CRC
uint32_t CRC_CalcCRC(uint32_t Data) //将一个数据写入CRC
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
//计算一个数组的CRC值
uint32_t CRC_GetCRC(void) //读取CRC计算结果
void CRC_SetIDRegister(uint8_t IDValue)
uint8_t CRC_GetIDRegister(void)
//分别是写CRC_IDR和读 CRC_IDR 寄存器。
目前32的硬件 CRC校验有个致命问题,就是得出来的结果我找遍全网竟然找不出一个和他结果一样的CRC校验。这样的话没法写上位机的。
三、定义
1、起始帧头
当接收到0x77时开始判断数据
2、功能位
指令名称 | 数据 |
电机控制 | 0X38 |
LED控制 | 0x39 |
3、数据位
电机控制数据格式:
前进0x01+脉冲数
后退0x02+脉冲数
左转0x03+角度
右转0x04+角度
LED 控制:
R:0x0A+亮度
G:0x0B+亮度
B:0x0C+亮度
4、校验位
CRC校验
5、结束帧0xAA