解决办法:将原来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的方式使用这个读功能,有哪位大神请留言指点一下。