FreeModbus_Slave-Master-RTT-STM32
FreeModbus_Slave-Master-RTT-STM32 copied to clipboard
Modbus-Master错误提出,疑问,建议
库版本:2020-5-11版
错误提出:
- vMBMasterCBRequestScuuess函数单词错误success
- mb_m.c中没有实现eMBMasterRegisterCB函数
疑问:
- 根据Modbus协议规范,主机广播后,从机不用应答; 而在eMBMasterPoll函数中的case EV_MASTER_EXECUTE分支中为何检测到主机为广播时,要为所有从机地址执行(对应功能码的注册函数)?
- vMBMasterSetCBRunInMasterMode和xMBMasterGetCBRunInMasterMode是否仅用于如下情况: 同一功能码对应的同一处理函数被同时注册到了主机库和从机库中,在执行该注册函数时,需要判断主调者的(主机/从机)身份?
- xMBMasterRunResTake和xMBMasterRunResRlease函数使用了Semaphore机制,是否仅用于如下情况: 在多个任务同时使用Modbus-Master库时,实现该库资源的锁,保证同一时刻仅有一个任务可以使用Master库
建议:
- 应该很少能遇到同一终端同时使用Master和Slave模式吧,是否可以将Master和Slave库分成两个独立的库,这样使用和分析时都更简洁
- 我看该版本库使用STM3210x单片机; STM32的UART_Rx_DMA有Idle中断,可以直接接收不定长bytes,同时STM32有UART_Tx_DMA. 因此(xMBMasterPortSerialPutByte/GetByte, xMBRTUReceiveFSM/TransmitFSM状态机)都可不用. 将UART_Tx_DMA和UART_Rx_DMA的buffer都指向ucRTUBuf帧缓冲后. 使能Tx_DMA即可发出帧. 在Rx_DMA中断中发出EV_MASTER_FRAME_RECEIVED事件,就可去驱动eMBMasterPoll处理接收到的帧
[email protected] thanks
感谢你的反馈,如果有错误欢迎提交 PR 哈。
对于你的疑问,这个库时间有些久远,我也记得不太清楚,一些细节建议参照 Modbus 规范进行对比确认。也可以在真机上进行验证,确认下自己的想法。
关于你的建议:
- 第一条,其实却是存在即用主机也用从机的项目,同时主机和从机很多数据结构是可以共用的,所以放在一起可以保证内聚性
- 第二条,对于产品中,是要保证一个软件组件,能在多个硬件平台上共用,所以会有些抽象的实现在里面,你也可以针对自己的平台进行优化