armink / FreeModbus_Slave-Master-RTT-STM32

Add master mode to FreeModbus. | 在 FreeModbus 中添加主机模式
Other
1.6k stars 820 forks source link

Modbus-Master错误提出,疑问,建议 #55

Open wk4397922 opened 3 years ago

wk4397922 commented 3 years ago

库版本:2020-5-11版

错误提出:

  1. vMBMasterCBRequestScuuess函数单词错误success
  2. mb_m.c中没有实现eMBMasterRegisterCB函数

疑问:

  1. 根据Modbus协议规范,主机广播后,从机不用应答; 而在eMBMasterPoll函数中的case EV_MASTER_EXECUTE分支中为何检测到主机为广播时,要为所有从机地址执行(对应功能码的注册函数)?
  2. vMBMasterSetCBRunInMasterMode和xMBMasterGetCBRunInMasterMode是否仅用于如下情况: 同一功能码对应的同一处理函数被同时注册到了主机库和从机库中,在执行该注册函数时,需要判断主调者的(主机/从机)身份?
  3. xMBMasterRunResTake和xMBMasterRunResRlease函数使用了Semaphore机制,是否仅用于如下情况: 在多个任务同时使用Modbus-Master库时,实现该库资源的锁,保证同一时刻仅有一个任务可以使用Master库

建议:

  1. 应该很少能遇到同一终端同时使用Master和Slave模式吧,是否可以将Master和Slave库分成两个独立的库,这样使用和分析时都更简洁
  2. 我看该版本库使用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处理接收到的帧

wk4397922@gmail.com thanks

armink commented 3 years ago

感谢你的反馈,如果有错误欢迎提交 PR 哈。

对于你的疑问,这个库时间有些久远,我也记得不太清楚,一些细节建议参照 Modbus 规范进行对比确认。也可以在真机上进行验证,确认下自己的想法。

关于你的建议: