標(biāo)題: stm32f103單片機串口連續(xù)發(fā)送多字節(jié)程序求分析問題 [打印本頁]

作者: liuliangdt    時間: 2021-5-6 15:53
標(biāo)題: stm32f103單片機串口連續(xù)發(fā)送多字節(jié)程序求分析問題
stm32f103單片機做通信控制,發(fā)送的數(shù)據(jù)總是不對。抄了網(wǎng)上各種發(fā)送程序,禁止編譯器優(yōu)化等都試遍了。實在不知道錯在哪里,請網(wǎng)友幫忙指教。比如說我要發(fā)送的數(shù)據(jù):0x5a  0xa5  0x03  0x10  0x20  0x30  ;
上面0x5a  0xa5是幀頭,0x03是后面要發(fā)送的數(shù)據(jù)量(這里是3個), 0x10  0x20  0x30  就是要發(fā)送的數(shù)據(jù)了。
下面的圖片是我試著從發(fā)送一個字節(jié)到發(fā)送7個字節(jié)時收到了數(shù)據(jù)截圖,好給大伙分析;
最先發(fā)送一個字節(jié),是外圍接了一個按鈕,按一次發(fā)送一次。


發(fā)送一個字節(jié)后串口助手接收到正確的數(shù)據(jù)


從一次發(fā)送兩個字節(jié)開始接收就不對了


第一次按按鈕,接收到的是0x5a。沒錯,第一次只能收到一個字節(jié),按道理應(yīng)該接收到0x5a  0xa5。從第二次開始接收到的數(shù)據(jù)時0xa5  0x5a,這是一次收到了兩個字節(jié)但反了順序。不知道程序錯在哪里,求指點!


后面是發(fā)送3個字節(jié)


沒讓我失望,接收的還是2個字節(jié)。但從這里開始,接收到的都已經(jīng)不是原來發(fā)送了的數(shù)據(jù)了。發(fā)送的0x5a  0xa5  0x03已經(jīng)變成了0x5a  0x3f兩個字節(jié)了。


后面的我也懶得打字了,都是少了一個字節(jié)。0xa5  0x03 都變成了 0x3f。
















請大神們幫我分析一下問題出在哪里了?


作者: liuliangdt    時間: 2021-5-6 15:59
求一份可以一次正確發(fā)送多字節(jié)的程序范例,稍微改一下還能發(fā)送MODBUS協(xié)議的多字節(jié)程序。
作者: xu2509674896    時間: 2021-5-6 19:29
恕我太菜看不出什么問題來,但是從你程序的大括號上看,我發(fā)現(xiàn)你的程序一直在初始化硬件,然后再發(fā)送,我建議你把硬件的初始化配置只執(zhí)行一次,發(fā)送部分放在一個while(1)循環(huán)里,最好加一個按鍵條件判斷發(fā)送,方便調(diào)試。最后,我把一個確定沒有問題的函數(shù)給你,你應(yīng)該也是標(biāo)準(zhǔn)庫寫的,你看看試一試。
/*****************  發(fā)送一個字節(jié) **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)//選擇哪一個串口,選擇發(fā)送哪一個數(shù)據(jù)
{
        /* 發(fā)送一個字節(jié)數(shù)據(jù)到USART */
        USART_SendData(pUSARTx,ch);
               
        /* 等待發(fā)送數(shù)據(jù)寄存器為空 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);       
}

/****************** 發(fā)送指定長度的數(shù)組 ************************/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)//選擇哪一個串口,數(shù)組名或者指針,數(shù)據(jù)長度即有幾個發(fā)送的數(shù)據(jù)
{
  uint8_t i;
       
        for(i=0; i<num; i++)
  {
            /* 發(fā)送一個字節(jié)數(shù)據(jù)到USART */
            Usart_SendByte(pUSARTx,array[i]);       

  }
        /* 等待發(fā)送完成 */
        while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);

}
modbus通信的部分,

作者: birdzhyli    時間: 2021-5-6 20:21
51的過來學(xué)習(xí)一下,確定兩邊的波特率是一樣的?
作者: liuliangdt    時間: 2021-5-9 10:35
xu2509674896 發(fā)表于 2021-5-6 19:29
恕我太菜看不出什么問題來,但是從你程序的大括號上看,我發(fā)現(xiàn)你的程序一直在初始化硬件,然后再發(fā)送,我建 ...

謝謝!我現(xiàn)在只是想把功能實現(xiàn),上面是在開關(guān)步進電機。現(xiàn)在外地出差還沒試你說可以正常用的程序,我看了一下大概率是不正常的,因為那段程序我已經(jīng)試過了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1