RT Thread Free Modbus移植问题整理
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移植问题整理相关推荐
- 正点原子delay函数移植到rt thread操作系统(HAL库)
正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32
1.前言 [2014年4月重写该博文] 经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...
- RT Thread根据开发板制作BSP方法
之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...
- 基于rt thread smart构建EtherCAT主站
我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...
- RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程
(1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...
- xpt 2046的触摸屏 rt thread设备驱动框架
1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...
- 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)
最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...
- 关于RT thread系统节拍时钟的配置
关于RT thread系统节拍时钟的配置 -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...
最新文章
- Bugku—web题解
- python引用传递产生的问题_理解Python中传递值和引用时出现问题
- 【机器学习实战】第2章 k-近邻算法(kNN)
- HTML5之webSocket使用
- Python高性能HTTP客户端库requests的使用
- python生成热度图_Python数据可视化 热力图
- cuda stream
- AngularJs ui-router 路由的简单介绍
- PHP 扩展 Mongo 与 MongoDB
- linux 联合编译,在Linux上编译UEFI SDK 2018/OVMF的方法
- 微信小程序UI组件库集合(个人收藏)
- 计量经济学及Stata应用 陈强 第七章异方差习题7.2
- vue项目在ie浏览器下运行显示空白页面
- win8.1 or win server 2012 安装python3.5以上导致Error 0x80240017
- 深度学习远程服务器配置
- Win10离线安装.NET Framework 3.5的方法技巧(附离线安装包下载)
- java计算平面度,计算产品面的平面度和平行度(C#代码)
- jupyter内核无法连接,出现error,代码无法运行解决办法
- [风云人物]三年挣850万,你也可以复制!
- 【附源码】计算机毕业设计java校园新闻发布系统设计与实现
热门文章
- 通达信公式改成python_python转换通达信股票数据
- Elasticsearch错误 “low disk watermark [85%]”或“high disk watermark [90%]”
- 《Python极客项目编程 》——第2章 万花尺 2.1 参数方程
- TDS 以及 FDS 光谱系统的成像光束
- 惠普将为问题笔记本延长保修甚至退机
- teamcenter 异步服务_Teamcenter 11版本最新特征
- fork: retry:资源暂时不可用
- 最好用的_古书制作工具_古籍排版工具_古文排版_自动生成古书_多种古书风格_古籍制作工具
- 前端使用 xlsx 结合yxg-xlsx-style 实现带样式的导出
- sqoop导入hive_李孟_新浪博客