一、串口通信協議的組成部分
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