RT Thread Free Modbus移植问题整理

问题描述:

在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常。

在移植过程中发现串口(或RS485)数据接收长度异常。

一、环境描述

通信模式 RS485

波特率 115200

校验模式 EVEN

停止位 1

版本 free modbus 1.6

二、问题追溯

1、写数据

调用如下函数,

/* Test Modbus Master */
data[0] = (USHORT)(rt_tick_get() / 10);
data[1] = (USHORT)(rt_tick_get() % 10);
data[0] ++;
data[1]++;
error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR,/* salve address */                                               MB_SEND_REG_START,/* register start address */                                             MB_SEND_REG_NUM,    /* register total number */                                             data,                /* data to be written */                                               RT_WAITING_FOREVER); /* timeout */
if (error_code != MB_MRE_NO_ERR)             {                   error_count++;             }

可以正常的对数据进行写操作。

2、读操作

使用如下代码进行操作

error_code = eMBMasterReqReadHoldingRegister(SLAVE_ADDR,                                                                                 0,                                                                                         100,                                                                                       1000);
/* Record the number of errors */
if (error_code != MB_MRE_NO_ERR)        {             error_count++;
}

在测试过程中当出现异常,数据会一直报错,无法收到有效寄存器的数值。

三、问题分析

1、数据接收BUFFER

在问题分析过程中发现数据的接收出现问题。在数据发送没有完成前,定时器就触发超时中断,从而使得数据接收异常。

2、增加接收定时器的超时时间

修改接收的打包的超时时间,其代码 如下。修改usTimerT35_50us变量为350,手动增加超时时间。

修改usTimerT35_50us变量为350

/* ----------------------- Start implementation -----------------------------*/
eMBErrorCode
eMBMasterRTUInit(UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity)
{eMBErrorCode eStatus = MB_ENOERR;ULONG usTimerT35_50us;ENTER_CRITICAL_SECTION();/* Modbus RTU uses 8 Databits. */if (xMBMasterPortSerialInit(ucPort, ulBaudRate, 8, eParity) != TRUE){eStatus = MB_EPORTERR;}else{/* If baudrate > 19200 then we should use the fixed timer values* t35 = 1750us. Otherwise t35 must be 3.5 times the character time.*/if (ulBaudRate > 19200){// usTimerT35_50us = 35;       /* 1800us. */usTimerT35_50us = 350; /* 1800us. */ //TODO SYT}else{/* The timer reload value for a character is given by:** ChTimeValue = Ticks_per_1s / ( Baudrate / 11 )*             = 11 * Ticks_per_1s / Baudrate*             = 220000 / Baudrate* The reload for t3.5 is 1.5 times this value and similary* for t3.5.*/usTimerT35_50us = (7UL * 220000UL) / (2UL * ulBaudRate);}if (xMBMasterPortTimersInit((USHORT)usTimerT35_50us) != TRUE){eStatus = MB_EPORTERR;}}EXIT_CRITICAL_SECTION();return eStatus;
}

3、验证

寄存器接收数据正常

四、解决方案

修改接收的打包的超时时间,其代码 如下。修改usTimerT35_50us变量为350,手动增加超时时间。

五、声明

该方法仅是临时方案,但是超时时间增长了。如有更好解决方案,还请与我分享。后续如有优化,会对本文进行更新。

RT Thread Free Modbus移植问题整理相关推荐

  1. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  2. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  3. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  4. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  5. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  6. RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程

    (1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...

  7. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  8. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  9. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

最新文章

  1. Bugku—web题解
  2. python引用传递产生的问题_理解Python中传递值和引用时出现问题
  3. 【机器学习实战】第2章 k-近邻算法(kNN)
  4. HTML5之webSocket使用
  5. Python高性能HTTP客户端库requests的使用
  6. python生成热度图_Python数据可视化 热力图
  7. cuda stream
  8. AngularJs ui-router 路由的简单介绍
  9. PHP 扩展 Mongo 与 MongoDB
  10. linux 联合编译,在Linux上编译UEFI SDK 2018/OVMF的方法
  11. 微信小程序UI组件库集合(个人收藏)
  12. 计量经济学及Stata应用 陈强 第七章异方差习题7.2
  13. vue项目在ie浏览器下运行显示空白页面
  14. win8.1 or win server 2012 安装python3.5以上导致Error 0x80240017
  15. 深度学习远程服务器配置
  16. Win10离线安装.NET Framework 3.5的方法技巧(附离线安装包下载)
  17. java计算平面度,计算产品面的平面度和平行度(C#代码)
  18. jupyter内核无法连接,出现error,代码无法运行解决办法
  19. [风云人物]三年挣850万,你也可以复制!
  20. 【附源码】计算机毕业设计java校园新闻发布系统设计与实现

热门文章

  1. 通达信公式改成python_python转换通达信股票数据
  2. Elasticsearch错误 “low disk watermark [85%]”或“high disk watermark [90%]”
  3. 《Python极客项目编程 》——第2章 万花尺 2.1 参数方程
  4. TDS 以及 FDS 光谱系统的成像光束
  5. 惠普将为问题笔记本延长保修甚至退机
  6. teamcenter 异步服务_Teamcenter 11版本最新特征
  7. fork: retry:资源暂时不可用
  8. 最好用的_古书制作工具_古籍排版工具_古文排版_自动生成古书_多种古书风格_古籍制作工具
  9. 前端使用 xlsx 结合yxg-xlsx-style 实现带样式的导出
  10. sqoop导入hive_李孟_新浪博客