Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Modbus
BSP下的 stm32 使用modbus问题
发布于 2019-01-31 08:43:52 浏览:3202
订阅该版
* 本帖最后由 40259574 于 2019-1-31 11:51 编辑 * 在 BSP中 stm32 下 modbus 组件不兼容 初始化过程中 堆栈溢出 函数如下 void modbus_test(void) { eMBInit( MB_RTU, 0x01,3, 9600, MB_PAR_NONE ); //初始化 // eMBPoll(); } eMBInit 函数中 堆栈溢出 输入如下  跟踪代码 到 portserial.c 73行 ```#if defined(RT_USING_UART3) extern struct rt_serial_device serial3; serial = &serial3; #endif```需要开启宏定义RT_USING_UART3 于是 开启了这个宏定义 继续跟踪 同函数中 100行 ``` serial->ops->configure(serial, &(serial->config));```在继续 就进入 contest_rvds.S 汇编了 ```rt_hw_interrupt_thread_switch PROC EXPORT rt_hw_interrupt_thread_switch BX lr ENDP IMPORT rt_hw_hard_fault_exception EXPORT HardFault_Handler HardFault_Handler PROC ; get current context TST lr, #0x04 ; if(!EXC_RETURN[2]) ITE EQ MRSEQ r0, msp ; [2]=0 ==> Z=1, get fault context from handler. MRSNE r0, psp ; [2]=1 ==> Z=0, get fault context from thread. STMFD r0!, {r4 - r11} ; push r4 - r11 register IF {FPU} != "SoftVFP" STMFD r0!, {lr} ; push dummy for flag ENDIF STMFD r0!, {lr} ; push exec_return register TST lr, #0x04 ; if(!EXC_RETURN[2]) ITE EQ MSREQ msp, r0 ; [2]=0 ==> Z=1, update stack pointer to MSP. MSRNE psp, r0 ; [2]=1 ==> Z=0, update stack pointer to PSP. PUSH {lr} BL rt_hw_hard_fault_exception POP {lr} ORR lr, lr, #0x04 BX lr ENDP ALIGN 4 END```在 242行 BL rt_hw_hard_fault_exception 进 堆栈溢出了 跟踪了一下 drv_usart.c 文件 int rt_hw_usart_init(void) 函数 ```int rt_hw_usart_init(void) { rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart); struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; rt_err_t result = 0; stm32_uart_get_dma_config(); for (int i = 0; i < obj_num; i++) { uart_obj*.config = &uart_config*; uart_obj*.serial.ops = &stm32_uart_ops; uart_obj*.serial.config = config; #if defined(RT_SERIAL_USING_DMA) if(uart_obj*.uart_dma_flag) { /* register UART device */ result = rt_hw_serial_register(&uart_obj*.serial,uart_obj*.config->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX| RT_DEVICE_FLAG_DMA_RX ,&uart_obj*); } else #endif { /* register UART device */ result = rt_hw_serial_register(&uart_obj*.serial,uart_obj*.config->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX ,&uart_obj*); #if defined(RT_USING_UART3) //自定义添加的 用于获取serial3 结构体配置 跟踪代码 可以进入到这个阶段 并且找到uart3 但是 运行 struct rt_serial_device serial3; if((rt_memcmp(uart_obj*.config->name,"uart3",5))==0) { //rt_kprintf("%s
",uart_obj*.config->name); rt_memcpy(&serial3,&uart_obj*.serial,sizeof(struct rt_serial_device)); } #endif } RT_ASSERT(result == RT_EOK); } return result; }```其中 struct rt_serial_device serial3; #if defined(RT_USING_UART3) if((rt_memcmp(uart_obj*.config->name,"uart3",5))==0)** { //rt_kprintf("%s
",uart_obj*.config->name);** rt_memcpy(&serial3,&uart_obj*.serial,sizeof(struct rt_serial_device));** } #endif 这样就不溢出了 不知道有没有什么 更好的方法 可以不修改 drv_usart.c 的 rt_hw_usart_init 函数呢? 另外 通过modbus 调试工具 进行调试 shell 输出 断言错误***[attach]7413[/attach]  *好像 stm32 这个BSP 使用modbus 组件存在很多不兼容的问题 不知道 应该如何解决 有哪位大神 使用过stm32这个BSP modbus 组件?* *经过调试后 发现一个解决方法 drv_usart.c 定义 一个 struct rt_serial_device * serial3; 在 rt_hw_usart_init 中 注册设备后 查找 modbus 使用的串口设备 然后 serial3 指向这个设备的 rt_serial_device 结构体 if((rt_memcmp(uart_obj*.config->name,"uart3",5))==0) { serial3=&uart_obj*.serial; } 这是第一步 下一步 需要修改 portserial.c xMBPortSerialInit 函数 #if defined(RT_USING_UART3) extern struct rt_serial_device * serial3; //原来的结构体 变量换成指针 serial = serial3; 也就是说 这里使用的 rt_serial_device 驱动结构体 直接引用 串口设备注册的结构体 我测试 这样使用 就可以 *不过通过调试助手调试 发现一个问题 ModScan32 调试 收到的数据有问题 不能继续轮询 而使用Modbus Poll 可以 通过 检测工具 发现 数据是是这个样子的   我感觉 我这个解决方法 比较笨 也不太好 另外通过检测 观察软件接收的数据 怪怪的 分成了3部分 不知道问题出在哪里 不知道 哪位大神 帮忙分析下 给些建议 谢谢!
查看更多
6
个回答
默认排序
按发布时间排序
flyboy
2019-01-31
Do my self();
帮顶
我夏了夏天
认证专家
2019-01-31
Life isn't about finding yourself, life is about creating yourself.
你说的是具体哪个 BSP?
40259574
2019-01-31
这家伙很懒,什么也没写!
>你说的是具体哪个 BSP? --- BSP/STM32/ \rt-thread-master\bsp\stm32 这个BSP
MTYGH
2019-02-15
这家伙很懒,什么也没写!
>BSP/STM32/ > >\rt-thread-master\bsp\stm32 这个BSP --- 请问有没有什么简便的解决方法呢?4.0的确是好像有溢出的问题
独角戏
2019-03-22
这家伙很懒,什么也没写!
确实不兼容的
还没想好
2019-03-23
这家伙很懒,什么也没写!
楼主把堆栈改大点试试?
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
40259574
这家伙很懒,什么也没写!
提问
5
回答
6
被采纳
0
关注TA
发私信
相关问题
1
ModbusRTU协议栈漏发送最后一个字节
2
3.0 增加freemodbus,编译不过
3
RT_THREAD上面的串口MODBUSRTU为啥没功能码?
4
关于 freemodbus 里存在的一点问题分享
5
请教如何使用组件里的FreeMODBUS
6
求一个FreeModbus的从机测试程序
7
FreeModbus的从机调试说明(含测试程序)
8
rtt_freemodbus
9
freemodbus怎么配置到uart
10
FreeModeBus从机调试问题
推荐文章
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
pkgs --upgrade报错SSL未验证问题解决记录
2
CherryUSB STM32 glue 新增初始化
3
在LPC1114上移植 RT-Thread Nano 3.1.5
4
求助can通讯下怎末运用485
5
STM32F407ZGT适配串口V2驱动
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
cubemx
I2C_IIC
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
flashDB
编译报错
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
818
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
10
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部