1. 程式人生 > >stm32串列埠奇偶校驗時出現bug總結

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;