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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章