解決辦法:將原來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的方式使用這個讀功能,有哪位大神請留言指點一下。