stm32串列埠奇偶校驗時出現bug總結
做的是工業感測採集器,現場採集的引數查詢指令為FE FE 68 19 01 00 00 00 00 33 78 01 03 1F 90 01 E1 16 ,8位資料位,奇校驗模式
串列埠設定:
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
程式碼寫入:
index = 0;
Max3485SendBuf[index++] = 0xfe;
Max3485SendBuf[index++] = 0xfe;
Max3485SendBuf[index++] = 0x68;
Max3485SendBuf[index++] = 0x19;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x33;
Max3485SendBuf[index++] = 0x78;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0x03;
Max3485SendBuf[index++] = 0x1f;
Max3485SendBuf[index++] = 0x90;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0xe1;
Max3485SendBuf[index++] = 0x16;
UART4_SendLongData(Max3485SendBuf, index);
用串列埠除錯工具接收到的資料確是:
一直懷疑是不是現場採集的校驗方式錯了,或者是其他什麼問題。後來根據傳送接收的資料對比,發現接收的資料是把最高位
變成校驗位了。檢視資料手冊發現stm32的設定資料長度是把校驗位算在一起的,所以上圖設定的資料長度8位,其實是7位y有效資料位,1位停止位。而接收端設定的是8位有效資料位,1位停止位。所以在傳送的時候把校驗位覆蓋掉了最高位。
改為
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;