Rtthread學習筆記(十七)添加freemodbus主機遇到寫數據成功,讀數據失敗

解決辦法:將原來115200的波特率修改爲19200,然後主機讀數據成功。

一、modbus主機讀數據失敗現象

添加freemodbus主機的時候遇到了奇怪的問題,記錄下來。先說明一下情況,前兩天按照RT例程把freemodbus主機移植完畢,添加modbus主機
並且與上位機modbus slave從機的寫指令(10)通訊成功,把數據實時寫進了上位機從機,然後想起來忘記測試讀指令(03)通訊是否成功,便測試了一下,結果通訊不成功,代碼效果如下:
在這裏插入圖片描述

extern USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];
static void send_thread_entry(void *parameter)
{
    eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
    rt_uint16_t error_count = 0;
    //USHORT data[3] = {0};
    while (1)
    {   //讀取從機
        error_code = eMBMasterReqReadHoldingRegister(SLAVE_ADDR, MB_SEND_REG_START,4,RT_WAITING_FOREVER);//讀多個保持寄存器
        rt_kprintf("error_code: %d \n",error_code);//一直出錯,我便把錯誤返回值打印出來
        rt_kprintf("%d,%d,%d,%d,%d\n\r",usMRegHoldBuf[0][1],usMRegHoldBuf[0][2],usMRegHoldBuf[0][3],usMRegHoldBuf[0][4],usMRegHoldBuf[0][5]);//0代表從機ID=1
        rt_thread_mdelay(1000);
        /* Record the number of errors */
        if (error_code != MB_MRE_NO_ERR)
        {
            error_count++;
        }
    }
}

此時的波特率爲115200,然後就出現瞭如下的現象,檢測主機發送間隔大於1s,從機迴應及時且數據正確,但主機就是反饋錯誤代碼3(表示接收數據錯誤)。
在這裏插入圖片描述
在這裏插入圖片描述
調試了好多內容依舊如此,便決定修改一下波特率試試,先修改爲9600,上位機同時修改爲9600,結果程序便卡在讀保持寄存器函數中最後的等待迴應函數中。
在這裏插入圖片描述
在這裏插入圖片描述

二、嘗試解決辦法

無奈了再試試19200這個波特率吧,其他都保持不變8N1。結果就通訊成功了,主機通訊成功了。
在這裏插入圖片描述
在這裏插入圖片描述
既然通訊成功了,就再試試寫數據是否成功吧。結果在這個波特率下讀寫都正常。
在這裏插入圖片描述
這能是哪裏的原因的,就目前這個現象來看,應該是程序判斷一幀結束的標準出現了問題,在115200時總是數據接收出錯,在9600就一直等待接收回應,也有可能是周邊環境干擾。
出於好奇心,看看是不是就只有串口2(用於modbus主機)這樣子呢,便換到串口4試一下。
在這裏插入圖片描述
在這裏插入圖片描述
暫時沒找到根本原因,就先按照修改波特率爲19200的方式使用這個讀功能,有哪位大神請留言指點一下。

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