Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Modbus
关于 freemodbus 里存在的一点问题分享
发布于 2018-01-27 15:38:41 浏览:6494
订阅该版
RTT 在组件里已经移植好了freemodbus。但在接收数据上面存在一点问题,当存在高优先级的中断时,会造成以后通信永远通不上的现象。 RTT里面的串口接收也是分为上半部分和下半部分。上半部分是串口关中断接收数据,然后在开中断。下半部分是通过回掉函数处理接收到的数据。 因为下半部分是没有关中断,所以存在被别的以及自身中断再次打断的问题,那么,freemodbus 接收处理的问题就来了。下面先说说freemodbus原有的接收处理。 下面是它的回掉函数, ```/** * This function is serial receive callback function * * @param dev the device of serial * @param size the data size that receive * * @return return RT_EOK */ static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size) { prvvUARTRxISR(); return RT_EOK; }```回掉函数里面调用了prvvUARTRxISR();我们继续看这个函数。 ```void prvvUARTRxISR(void) { pxMBMasterFrameCBByteReceived(); }```在继续跟踪,发现它是一个函数指针。找到它指向的函数,如下: ```BOOL xMBMasterRTUReceiveFSM( void ) { BOOL xTaskNeedSwitch = FALSE; UCHAR ucByte; assert_param(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR )); /* Always read the character. */
( void )xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte );
其他代码省略。。。。。。。。 }```看上面红色的代码,可以发现它是在这儿读取串口的数据。继续看这个函数。 ```BOOL xMBMasterPortSerialGetByte(CHAR * pucByte) {
serial->parent.read(&(serial->parent), 0, pucByte,
1
);
return TRUE; }```现在就可以发现它的bug呢。它每次只读取一个字节。刚开始已经说了,串口的中断分上下两部分,回掉函数在下半部分,可以被中断打断,而最终freemodbus 在回掉处理的时候, 只读取了串口接收区里面的一个字节,那么当存在其他中断打断freemodbus 回掉处理函数的时候。所有的数据将会可能会错位,那么以后的通信就全断了。 下面是我处理的方式: ```
BOOL xMBMasterPortSerialGetByte(UCHAR * pucByte,UCHAR *pSize)
{ *pSize = serial->parent.read(&(serial->parent), 0, pucByte, 64); return TRUE; }
```修改这个函数,每次将串口缓冲的数据读取完全。然后修改freemodbus回掉处理函数 ```BOOL xMBMasterRTUReceiveFSM( void ) { BOOL xTaskNeedSwitch = FALSE; //UCHAR ucByte;
UCHAR readSize;
assert_param(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR )); /* Always read the character. */
//( void )xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte );
switch ( eRcvState ) { /* If we have received a character in the init state we have to * wait until the frame is finished. */ case STATE_M_RX_INIT: vMBMasterPortTimersT35Enable( ); break; /* In the error state we wait until all characters in the * damaged frame are transmitted. */ case STATE_M_RX_ERROR: vMBMasterPortTimersT35Enable( ); break; /* In the idle state we wait for a new character. If a character * is received the t1.5 and t3.5 timers are started and the * receiver is in the state STATE_RX_RECEIVCE and disable early * the timer of respond timeout . */ case STATE_M_RX_IDLE: /* In time of respond timeout,the receiver receive a frame. * Disable timer of respond timeout and change the transmiter state to idle. */ vMBMasterPortTimersDisable( ); eSndState = STATE_M_TX_IDLE; usMasterRcvBufferPos = 0;
xMBMasterPortSerialGetByte((UCHAR *)&ucMasterRTURcvBuf[usMasterRcvBufferPos] ,&readSize); usMasterRcvBufferPos += readSize;
//ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte; eRcvState = STATE_M_RX_RCV; /* Enable t3.5 timers. */ vMBMasterPortTimersT35Enable( ); break; /* We are currently receiving a frame. Reset the timer after * every character received. If more than the maximum possible * number of bytes in a modbus frame is received the frame is * ignored. */ case STATE_M_RX_RCV: if( usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX ) { //ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte;
xMBMasterPortSerialGetByte((UCHAR *)&ucMasterRTURcvBuf[usMasterRcvBufferPos] ,&readSize); usMasterRcvBufferPos += readSize;
} else { eRcvState = STATE_M_RX_ERROR; } vMBMasterPortTimersT35Enable(); break; } return xTaskNeedSwitch; }```下面是跟踪出错的截图: ![111.png](/uploads/201801/27/153529of4z34gfetmtmbte.png) 图中红色的是串口入队指针,蓝色是出队指针,理论上 freemodbus 处理完后 这两个指针应该相等,而现在他俩不相等,就是上面问题造成的。 [qq]1274132245[/qq] the boy No name
查看更多
1
个回答
默认排序
按发布时间排序
chudy
2019-08-05
这家伙很懒,什么也没写!
调试时确实碰到了这样的问题,波特率高时没事,波特率低了就崩了
撰写答案
登录
注册新账号
关注者
1
被浏览
6.5k
关于作者
guoweilkd
这家伙很懒,什么也没写!
提问
18
回答
10
被采纳
0
关注TA
发私信
相关问题
1
ModbusRTU协议栈漏发送最后一个字节
2
3.0 增加freemodbus,编译不过
3
RT_THREAD上面的串口MODBUSRTU为啥没功能码?
4
请教如何使用组件里的FreeMODBUS
5
求一个FreeModbus的从机测试程序
6
FreeModbus的从机调试说明(含测试程序)
7
rtt_freemodbus
8
freemodbus怎么配置到uart
9
FreeModeBus从机调试问题
10
FreeModbus的从机可以使用一个端口模拟多个从机吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部