Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败

解决办法:将原来115200的波特率修改为19200,然后主机读数据成功。

一、modbus主机读数据失败现象

添加freemodbus主机的时候遇到了奇怪的问题,记录下来。先说明一下情况,前两天按照RT例程把freemodbus主机移植完毕,添加modbus主机
并且与上位机modbus slave从机的写指令(10)通讯成功,把数据实时写进了上位机从机,然后想起来忘记测试读指令(03)通讯是否成功,便测试了一下,结果通讯不成功,代码效果如下:
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第1张图片

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(表示接收数据错误)。
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第2张图片
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第3张图片
调试了好多内容依旧如此,便决定修改一下波特率试试,先修改为9600,上位机同时修改为9600,结果程序便卡在读保持寄存器函数中最后的等待回应函数中。
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第4张图片
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第5张图片

二、尝试解决办法

无奈了再试试19200这个波特率吧,其他都保持不变8N1。结果就通讯成功了,主机通讯成功了。
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第6张图片
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第7张图片
既然通讯成功了,就再试试写数据是否成功吧。结果在这个波特率下读写都正常。
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第8张图片
这能是哪里的原因的,就目前这个现象来看,应该是程序判断一帧结束的标准出现了问题,在115200时总是数据接收出错,在9600就一直等待接收回应,也有可能是周边环境干扰。
出于好奇心,看看是不是就只有串口2(用于modbus主机)这样子呢,便换到串口4试一下。
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第9张图片
Rtthread学习笔记(十七)添加freemodbus主机遇到写数据成功,读数据失败_第10张图片
暂时没找到根本原因,就先按照修改波特率为19200的方式使用这个读功能,有哪位大神请留言指点一下。

你可能感兴趣的:(stm32,RT-Thread)