sunnydragon
发表于 2015-11-21 20:20:06
xh2008email 发表于 2015-11-21 13:18
我没有理解,老大扫一下盲
不明白自己看文档吧,文档说的太清楚不过了。https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32#三api
litrtleway
发表于 2015-11-30 09:59:51
modbus主机从机协议栈,mark,谢谢楼主分享!牛!!
imjacob
发表于 2016-1-16 19:39:02
楼主你好,看了你的代码,写的非常好,佩服!
我有一些阅读体会,不知道是不是正确:
感觉是提供了一个modbus的框架,让应用者只需要 调用API接口功能函数,然后结果就在buffer了。解放了应用者。
核心任务poll就是个状态机,甚至可以理解成一个简单的调度器。这个调度器 一方面接收请求,另一方面输出响应,耦合小。
我还有点疑惑,想请求指教:
我觉得,如果请求方法是非阻塞的,我觉得这样用才能体现它的优势啊。代码上清晰移植性高,系统上无论是负荷还是响应速度都不影响,甚至更好。
如果是阻塞的,和我直接write,然后read 这种方式 没有什么优势啊,从对系统的负荷 和 响应速度上讲。
当然作为一个框架的作者,能支持所有的这些阻塞或者是非阻塞是最好了。这我也能够理解。
所以我看到你举的例子thread_entry_SysMonitor()里调用的那些接口都设成了RT_WAITING_FOREVER不太能显示出优势,是不是例子写成非阻塞的,至少是部分是非阻塞的话给使用者作为参考例子是不是更好呢。
sunnydragon
发表于 2016-1-16 23:14:27
imjacob 发表于 2016-1-16 19:39
楼主你好,看了你的代码,写的非常好,佩服!
我有一些阅读体会,不知道是不是正确:
感谢你的建议哈,不过我不太赞同你说的在非阻塞模式下:“代码上清晰移植性高,系统上无论是负荷还是响应速度都不影响,甚至更好”
1、非阻塞的代码都是异步方式执行,这种异步方式由于需要并行,往往需要同时考虑更多条件,这样就会增加代码量,影响代码结构,降低可读性及可移植性;
2、对于负荷及响应速度,写数据到从机肯定会提高,后期也可以对写操作增加非阻塞接口。但是读数据没有影响,即便非阻塞方式迅速返回,但此时用户也无法获取到当前最新的数据。所以我更建议用户能够有专门的数据刷新线程,在应用层与数据刷新线程有共用的数据缓冲区(PS:我之前还做过一个数据变化自动进行事件通知的库,就是用在 Modbus 数据刷新场景,如果有兴趣,可以再看下这里:https://github.com/armink/EasyDataManager)。
对于你说的“我看到你举的例子thread_entry_SysMonitor()里调用的那些接口都设成了RT_WAITING_FOREVER不太能显示出优势”,我没理解你说的优势是什么。
imjacob
发表于 2016-1-17 11:01:10
sunnydragon 发表于 2016-1-16 23:14
感谢你的建议哈,不过我不太赞同你说的在非阻塞模式下:“代码上清晰移植性高,系统上无论是负荷还是响应 ...
感谢回复,但看了后,我又有点疑问了,如下,
1.“后期也可以对写操作增加非阻塞接口”,我看了你在120楼说 是 支持非阻塞访问的,为何还说要 在后期增加。 然后 你在 1楼的介绍中第5条写 “目前的Modbus主机请求功能是异步模式”。 你在github的Readme中又这样描述“所有的主机请求方法都是线程安全的也是阻塞模式的” 。 我的理解 异步 就类似非阻塞的。同步类似 阻塞的。我有点搞不清楚状况了。
2.你现在写成了RT_WAITING_FOREVER, 不就是阻塞了吗? 我说的这种情况下“不太能显示出优势”,是和 不用你这种框架的情况比较,例如直接写出类似以下:
status = write();//非阻塞去写
status =read();//阻塞去读,当然要加超时判断。
这种思维方式简单明了,当然通用性不好。还有就是若两个线程都调用这段代码,会有问题。但如果限定在只会在同一个线程调用,也就不存在这个问题了。我就在想这种情况下,用你的框架 优势在哪里呢?
sunnydragon
发表于 2016-1-17 22:40:54
imjacob 发表于 2016-1-17 11:01
感谢回复,但看了后,我又有点疑问了,如下,
1.“后期也可以对写操作增加非阻塞接口”,我看了你在120 ...
1、是这样的,早期的代码就是非阻塞模式的,即1楼位置的代码,但后来统一修改为阻塞模式了,所以你在 Github 上看到的代码就是阻塞模式。
2、具体哪种方式更有优势,这个也要看用户的使用场景。有些时候用户写数据时,必须要求写成功才能执行接下来的业务,此时使用非阻塞模式是毫无意义的,但有些场景下,可能不需要关心写数据的结果。所以两种方式都支持,让用户自己选择,这样做更加灵活。
zhangshixing
发表于 2016-1-18 09:10:12
阻塞的方法更好写,非阻塞的很难实现统一,然后程序又比较复杂,而阻塞的方式无非就建立一个收发线程而已,与普通的单片机收发能统一起来
interstellar_tr
发表于 2016-2-19 22:10:37
谢谢楼主的代码!
有个问题想向楼主请教,
Modbus ascii中 要求串口的默认配置为 1起始位,7数据位,1位偶校验,1停止位
你公开的代码中,有MB_SLAVE_ASCII_ENABLED 和 MB_MASTER_ASCII_ENABLED,但串口的驱动中,没有体现出来7数据位
请问楼主有没有1起始位,7数据位,1位偶校验,1停止位的stm32串口驱动代码,或者如何实现?stm32函数库中只有8位和9位的
谢谢
dz_xinyu
发表于 2016-3-17 08:42:23
顶起这个太有用了
xinmulan
发表于 2016-4-21 16:29:44
谢谢楼主的分享,节约了好多时间
一杯茶2009
发表于 2016-4-21 21:49:16
狂顶一个
miscell
发表于 2016-7-4 21:20:00
if ((usAddress >= REG_HOLDING_START)
&& (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS))
{
iRegIndex = usAddress - usRegHoldStart;
switch (eMode)
{
/* read current register values from the protocol stack. */
case MB_REG_READ:
while (usNRegs > 0)
{
*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf >> 8);
*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf & 0xFF);
iRegIndex++;
usNRegs--;
}
break;
/* write current register values with new values from the protocol stack. */
case MB_REG_WRITE:
while (usNRegs > 0)
{
pusRegHoldingBuf = *pucRegBuffer++ << 8;
pusRegHoldingBuf |= *pucRegBuffer++;
iRegIndex++;
usNRegs--;
}
break;
}
}
从这程序来看读寄存器是把主机的发给从机?不是读从机的保持寄存器回来吗?
longjunyi
发表于 2016-7-4 21:32:57
非常不错,帮你顶。有时间研究研究
生来孤独
发表于 2016-7-29 08:51:56
撸主好强大威武,本屌丝要拿来慢慢学习一番~~~~哈哈哈哈哈{:lol:}
93434387@qq.com
发表于 2016-7-29 15:49:39
正好需要modbus 主机的程序。。。拿走研究下
93434387@qq.com
发表于 2016-7-29 15:50:29
正好需要modbus 主机的程序。。。拿走研究下
lyl520719
发表于 2016-7-30 18:04:57
非常不错,用到的时候很难找。
gzhua20088ssj
发表于 2016-8-1 13:37:16
东西太繁琐了,代码效率太低了,还是谢谢楼主分享
464050032
发表于 2016-8-11 15:29:38
好贴 学习了
lhaoyue
发表于 2016-8-27 09:07:54
mark FreeModbus主机+从机协议栈
longjunyi
发表于 2016-9-4 20:06:46
支持楼主,感谢共享!
holdkcsxym
发表于 2016-9-7 12:13:47
不改变字符间的超时判断机制以及其它的影响时序的因素注定MODBUS只能用在对时序要求低的场合MODBUS TCP也是,最大的优势是推出的时间早、开源、支持该协议的自动化厂家最多。
cjh930308
发表于 2016-9-7 14:31:51
谢谢了,下载来学习一下。
生来孤独
发表于 2016-10-13 14:46:12
楼主好,刚刚再看源码,有点疑问FreeModbus 的CRC校验检验这里是不是错了??
eMBErrorCode
eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
{
BOOL xFrameReceived = FALSE;
eMBErrorCode eStatus = MB_ENOERR;
ENTER_CRITICAL_SECTION();
assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
/* Length and CRC check */
if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
{
/* Save the address field. All frames are passed to the upper layed
* and the decision if a frame is used is done there.
*/
*pucRcvAddress = ucRTUBuf;
/* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus
* size of address field and CRC checksum.
*/
*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC );
/* Return the start of the Modbus PDU to the caller. */
*pucFrame = ( UCHAR * ) & ucRTUBuf;
xFrameReceived = TRUE;
}
else
{
eStatus = MB_EIO;
}
EXIT_CRITICAL_SECTION();
return eStatus;
}
usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 这里应该改成!=0 吧?
还有一点疑问,总感觉这样校验不稳妥,最好是不是应该把数据帧里面的CRC拿出来和自己计算的这个比对一下?
sunnydragon
发表于 2016-10-13 20:44:17
生来孤独 发表于 2016-10-13 14:46
楼主好,刚刚再看源码,有点疑问FreeModbus 的CRC校验检验这里是不是错了??
没有错误,这就是 CRC 的特性。简单点的理解可以认为是“正负”相互抵消。
xxc007
发表于 2016-10-13 22:59:30
这个下载学习
生来孤独
发表于 2016-10-14 08:05:52
sunnydragon 发表于 2016-10-13 20:44
没有错误,这就是 CRC 的特性。简单点的理解可以认为是“正负”相互抵消。 ...
奥,这样,基础不扎实,要去查阅学习一下了{:titter:}
sunnydragon
发表于 2016-10-14 08:31:36
生来孤独 发表于 2016-10-14 08:05
奥,这样,基础不扎实,要去查阅学习一下了
这也是个技巧,还可以降低代码量{:lol:}
596142041
发表于 2016-10-15 00:21:37
sunnydragon 发表于 2016-10-14 08:31
这也是个技巧,还可以降低代码量
楼主你好!如果我想将你的代码不用操作系统需要注意什么呢。
sunnydragon
发表于 2016-10-15 09:24:56
596142041 发表于 2016-10-15 00:21
楼主你好!如果我想将你的代码不用操作系统需要注意什么呢。
要注意主从机事件处理接口的移植。
shentqlf
发表于 2016-10-15 15:15:27
必须看下
596142041
发表于 2016-10-15 19:21:05
sunnydragon 发表于 2016-10-15 09:24
要注意主从机事件处理接口的移植。
是的,我能否按照原来官方提供的例程那样来处理呢。用一个全局变量来进行
sunnydragon
发表于 2016-10-15 19:52:30
596142041 发表于 2016-10-15 19:21
是的,我能否按照原来官方提供的例程那样来处理呢。用一个全局变量来进行 ...
从机肯定没问题,主机恐怕不行吧。
YuQingLiang
发表于 2016-12-19 19:47:24
学习一下
天行者
发表于 2017-4-6 14:44:32
高手呀,我不得不顶呀。大神呀
XUEPENGBIN
发表于 2017-5-14 02:45:01
今天测试了下,芯片换成STM32F103RCT6 发现 从机的 eMBPoll(); 函数执行第二遍的时候会死掉。仔细跟踪发现在第二次调用 xMBPortEventGet( &eEvent ) 这个函数判断后,void thread_entry_ModbusSlavePoll(void* parameter) 进程就会死掉,不执行。只剩下 void thread_entry_SysMonitor(void* parameter) 和 void thread_entry_ModbusMasterPoll(void* parameter) 在执行了。
// <o> Internal SRAM memory size <8-64>
// <i>Default: 64
#define STM32_SRAM_SIZE 48
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
赢更改。
XUEPENGBIN
发表于 2017-5-14 02:59:38
rt_event_recv(&xSlaveOsEvent,
EV_READY | EV_FRAME_RECEIVED | EV_EXECUTE | EV_FRAME_SENT,
RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
&recvedEvent);
在调用这个函数时候死掉的
Honey_comb
发表于 2017-6-15 22:42:05
谢谢,备用一下。modbus主从机
kgdso210
发表于 2017-6-16 09:28:18
先收着,谢谢了
游在云间
发表于 2017-10-11 16:49:38
为什么不使用DMA发送数据?
sanyuanwang
发表于 2017-10-17 10:19:27
主机模式一直通信不上,
ggggidtf520
发表于 2017-10-20 12:59:14
致敬,这样的帖子为啥不是精华了呢?
am_shui9jing
发表于 2017-12-13 08:48:46
FreeModbus主机源码,关注~ 支持~
cqfeiyu
发表于 2018-3-12 09:22:39
/**
* Modbus master holding register callback function.
*
* @param pucRegBuffer holding register buffer
* @param usAddress holding register address
* @param usNRegs holding register number
* @param eMode read or write
*
* @return result
*/
eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
USHORT usNRegs, eMBRegisterMode eMode)
{
eMBErrorCode eStatus = MB_ENOERR;
USHORT iRegIndex;
USHORT * pusRegHoldingBuf;
USHORT REG_HOLDING_START;
USHORT REG_HOLDING_NREGS;
USHORT usRegHoldStart;
pusRegHoldingBuf = usMRegHoldBuf;
REG_HOLDING_START = M_REG_HOLDING_START;
REG_HOLDING_NREGS = M_REG_HOLDING_NREGS;
usRegHoldStart = usMRegHoldStart;
/* if mode is read, the master will write the received date to buffer. */
eMode = MB_REG_WRITE;
/* it already plus one in modbus function method. */
usAddress--;
if ((usAddress >= REG_HOLDING_START)
&& (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS))
{
iRegIndex = usAddress - usRegHoldStart;
switch (eMode)
{
/* read current register values from the protocol stack. */
case MB_REG_READ:
while (usNRegs > 0)
{
*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf >> 8);
*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf & 0xFF);
iRegIndex++;
usNRegs--;
}
break;
/* write current register values with new values from the protocol stack. */
case MB_REG_WRITE:
while (usNRegs > 0)
{
pusRegHoldingBuf = *pucRegBuffer++ << 8;
pusRegHoldingBuf |= *pucRegBuffer++;
iRegIndex++;
usNRegs--;
}
break;
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
/**
主机模式的eMBMasterRegHoldingCB函数里的红色部分,被强制为写了,对吗?去掉这句,读回来的数据会被清掉,怎么解决?
**/
sunnydragon
发表于 2018-3-12 21:42:37
cqfeiyu 发表于 2018-3-12 09:22
/**
* Modbus master holding register callback function.
*
没问题的,那个只是为了缓存从机的寄存器数据
WinExt
发表于 2018-3-24 00:00:48
写得不错,这么多年了楼主也还热心解答问题,不知道读数据时缓冲区太大的问题解决了没有,有时候需要读取的寄存器地址范围比较宽,那么缓存就得开得很大,这样很浪费资源
sunnydragon
发表于 2018-3-24 12:53:55
WinExt 发表于 2018-3-24 00:00
写得不错,这么多年了楼主也还热心解答问题,不知道读数据时缓冲区太大的问题解决了没有,有时候需要读取的 ...
你是指的本地对 寄存器数据 缓存的那一堆数组吗?比如:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32/blob/master/FreeModbus/port/user_mb_app.c#L43
WinExt
发表于 2018-3-25 00:47:31
sunnydragon 发表于 2018-3-24 12:53
你是指的本地对 寄存器数据 缓存的那一堆数组吗?比如:https://github.com/armink/FreeModbus_Slave-Mas ...
作为主机去读从机的保持寄存器时定义了下面的数组
usMRegHoldBuf
在回调函数里是判断合法性:
if( ( usAddress >= REG_HOLDING_START ) &&
( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
{
iRegIndex = usAddress - usRegHoldStart;
}
下面取得从机寄存器的值
pusRegHoldingBuf = *pucRegBuffer++ << 8;
pusRegHoldingBuf |= *pucRegBuffer++;
关键在与iRegIndex的计算,例如我只需要读取0x0001和 0xF813这两个寄存器的时候,此时 REG_HOLDING_NREGS希望定义为 2(两个寄存器),但是这样地址合法性判断不通过,所以
REG_HOLDING_NREGS 需要定义为 0xF813或者更大,pusRegHoldingBuf的长度出能满足(也就是说 pusRegHoldingBuf不溢出)。
这样分析下来为了获取两个寄存器的数据却要定义一个很长的数组,很浪费资源。,不知我的理解是否有误?
另外,我移植主机部分到FreeRTOS上,跟电脑的SLAVE软件通信能正常读到数据,但是运行一定的时间(可能是10来秒)之后程序就挂了,
屏蔽掉读寄存器的语句后系统能正常运行(此时 eMBMasterPoll 没有屏蔽),这是什么原因呢?
sunnydragon
发表于 2018-3-25 16:16:17
WinExt 发表于 2018-3-25 00:47
作为主机去读从机的保持寄存器时定义了下面的数组
usMRegHoldBuf
其实数组方式只是 Modbus 寄存器数据一种缓冲方式,本身 FreeModbus 非常灵活,对于缓冲方式是可以由用户来决定的。只是数组模式作为顺序存储的模式,非常简单,容易实现,被作为最常见的 demo 提供出来。
比如 这里(https://github.com/armink/EasyDataManager) 有我之前专门为 Modbus 设计的一款数据缓存系统,采用链式存储的方式,支持数据变化主动通知,完全采用事件驱动模式编程。
你的程序具体挂掉的原因,要先定位到执行的代码才好接下来深入分析。
WinExt
发表于 2018-3-26 10:42:20
sunnydragon 发表于 2018-3-25 16:16
其实数组方式只是 Modbus 寄存器数据一种缓冲方式,本身 FreeModbus 非常灵活,对于缓冲方式是可以由用户 ...
程序挂掉的问题找到了,移入FreeRTOS时3.5定时器和串口中断没有做好临界保护,加上去就可以了。
接收缓存也根据自己的需求修改。
感谢你的热心解答和无私奉献。
sunnydragon
发表于 2018-3-26 12:39:59
WinExt 发表于 2018-3-26 10:42
程序挂掉的问题找到了,移入FreeRTOS时3.5定时器和串口中断没有做好临界保护,加上去就可以了。
接收缓 ...
接收缓存如果能做成通用方案,欢迎分享出来哈~
WinExt
发表于 2018-3-27 23:26:06
sunnydragon 发表于 2018-3-26 12:39
接收缓存如果能做成通用方案,欢迎分享出来哈~
抱歉我并没有做成通用的,只是根据自己需要,将需要通信的寄存器事先存入一个结构体数组里,结构体里寄存器与数据缓存一一对应,这样读寄存器时就存到对应的缓存上。
305546594
发表于 2018-4-21 22:40:37
sunnydragon 发表于 2018-3-26 12:39
接收缓存如果能做成通用方案,欢迎分享出来哈~
最新代码在哪里下载github 上不去了
sunnydragon
发表于 2018-4-22 09:04:05
305546594 发表于 2018-4-21 22:40
最新代码在哪里下载github 上不去了
OSChina 上也有同步 : https://gitee.com/Armink/FreeModbus_Slave-Master-RTT-STM32
true_elecom
发表于 2018-4-22 11:25:20
关注,支持。
305546594
发表于 2018-4-23 21:29:34
本帖最后由 305546594 于 2018-4-23 22:17 编辑
sunnydragon 发表于 2018-4-22 09:04
OSChina 上也有同步 : https://gitee.com/Armink/FreeModbus_Slave-Master-RTT-STM32
没有问题我的测试软件 的问题
305546594
发表于 2018-4-26 10:35:31
sunnydragon 发表于 2018-4-22 09:04
OSChina 上也有同步 : https://gitee.com/Armink/FreeModbus_Slave-Master-RTT-STM32
主机轮训有么有相关参考程序楼主能不能出个主机轮训相关的应用贴,体现错误重发机制。
lidg2014
发表于 2018-4-26 18:53:33
好资料!
sunnydragon
发表于 2018-4-26 19:22:43
305546594 发表于 2018-4-26 10:35
主机轮训有么有相关参考程序楼主能不能出个主机轮训相关的应用贴,体现错误重发机制。...
这里有主机测试函数:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32/blob/master/APP/src/app_task.c#L54-L62
这里也有说明文章:https://blog.csdn.net/arminkztl/article/details/11738395
关于应用贴,我都好几年没碰 Modbus 了,现在连测试环境都没了。如果你学会了,欢迎分享给大家哈。
chenweigang
发表于 2018-5-31 09:36:01
十分感谢,mark
Junsea
发表于 2018-6-9 10:49:22
sunnydragon 发表于 2018-4-26 19:22
这里有主机测试函数:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32/blob/master/APP/sr ...
你好,请问有裸机移植的代码吗?
chenweigang
发表于 2018-7-7 09:27:18
sunnydragon 发表于 2018-4-26 19:22
这里有主机测试函数:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32/blob/master/APP/sr ...
楼主,我现在发现,第一次发送数据会少了第一个字节,后面就好了,每次上电第一次发送都会少第一个字节,有碰到过吗
19711972f
发表于 2018-7-7 10:03:00
谢谢楼主分享。
sunnydragon
发表于 2018-7-7 11:12:00
chenweigang 发表于 2018-7-7 09:27
楼主,我现在发现,第一次发送数据会少了第一个字节,后面就好了,每次上电第一次发送都会少第一个字节, ...
这个是挺常见的驱动问题,你可以百度,关键词:STM32 串口发送 第一个字节 丢失
chenweigang
发表于 2018-7-7 15:43:23
sunnydragon 发表于 2018-7-7 11:12
这个是挺常见的驱动问题,你可以百度,关键词:STM32 串口发送 第一个字节 丢失
...
感谢楼主指点,敬大佬
myxiaonia
发表于 2018-7-17 13:00:16
兄台现在在rt thread,而且还是核心人物哦,挺厉害的
shunhedianzi
发表于 2018-7-17 13:13:42
感谢分享
myxiaonia
发表于 2018-7-21 11:08:49
本帖最后由 myxiaonia 于 2018-7-21 11:15 编辑
zhangshixing 发表于 2014-7-17 12:59
我发现freemodbus从机接收完一帧,并没有关闭接收,请问下楼主这样有没有问题啊。。。。
你说的有道理,确实存在这种问题,也就是协议存在安全漏洞,可能被不法者破坏网络运行。。。
但是从modbus的规范来看,这种情况是很大可能不会发生的,从机接收消息后,主机肯定是在等待响应,这个时间窗口应该足够从机响应的(指接收消息,处理,准备发送响应前的这段时间)。从机应该认真考虑主机等待响应的这个时间窗口。
我曾经也给rtx提过你说的这种bug,属于代码上有漏洞,但是原理上没问题。严格说也是bug,就看怎么看待了。
看过ucos和rtx的代码,就能发现这种巨大的思路差别,rtx代码很少有非法情况处理,ucos从头开始就不信任用户。是不是也反应了欧洲人和美国人的思维方式
myxiaonia
发表于 2018-7-23 10:47:19
不知道楼主还能够回复疑问不,主机模式下,如果要求读取消息,例如读输入寄存器
eMBException
eMBMasterReqReadInputRegister( UCHAR ucSlaveAddress, USHORT usRegAddr, USHORT usNRegs)
这个函数即使返回成功的话,请问读取的数据保存在哪里
sunnydragon
发表于 2018-7-23 11:04:33
myxiaonia 发表于 2018-7-23 10:47
不知道楼主还能够回复疑问不,主机模式下,如果要求读取消息,例如读输入寄存器
这个函数即使返回成功的话 ...
位于 Modbus 主机缓冲区中,在 GitHub 的 readme 有介绍哦
myxiaonia
发表于 2018-8-25 16:04:16
我提个意见,不知道对不对
lwip提供了3种接口,raw模式是基于回调的,socket模式是同步的,netcon我不清楚不讨论
类比对照,freemodbus的从机源代码也是基于回调的,姑且称为raw模式,改造成主机的话,如果提供同步模式,是不是也可以提供一套类似于socket的接口,现在armink的主机功能函数
是同步模式的,但是还是有回调,是不是把这些回调功能直接放入主机功能函数里,这样可以得到完全的同步,和socket类似
用这种方法后使用起来就真的爽了,用户代码会变得非常简洁
kinsno
发表于 2018-8-25 16:25:34
myxiaonia 发表于 2018-7-17 13:00
兄台现在在rt thread,而且还是核心人物哦,挺厉害的
你认识该作者? 我印象中他以前说过是在北京的啊,可是RT系统不是在上海的吗?
myxiaonia
发表于 2018-8-25 18:57:29
kinsno 发表于 2018-8-25 16:25
你认识该作者? 我印象中他以前说过是在北京的啊,可是RT系统不是在上海的吗?
哈哈哈都上新闻了啊搜一下就知道了我也是新闻上看到的
sunnydragon
发表于 2018-8-25 20:11:09
myxiaonia 发表于 2018-8-25 16:04
我提个意见,不知道对不对
lwip提供了3种接口,raw模式是基于回调的,socket模式是同步的,netcon我不清楚 ...
“这样可以得到完全的同步,和socket类似”
不太理解你说的这个同步大概长什么样,简单写一些伪代码吧
qiushui_007
发表于 2018-8-25 22:10:45
现在还更新不?
myxiaonia
发表于 2018-8-25 23:05:54
sunnydragon 发表于 2018-8-25 20:11
“这样可以得到完全的同步,和socket类似”
不太理解你说的这个同步大概长什么样,简单写一些伪代码吧 ...
比如读寄存器,这个函数直接提供缓冲区,读成功了数据就直接写到缓冲区,不用再进回调函数了
阿豪博士
发表于 2018-8-26 07:52:17
假如使用free的主机,从机,
阿豪博士
发表于 2018-8-26 07:52:57
大概能办证多久通讯无故障啊?通讯线2米以内,115200bps
TKZXJ
发表于 2018-12-13 09:30:58
收藏了,留着以后用
yinian
发表于 2019-5-12 12:11:45
非常感谢,很受用,学习中
eliterxzgxu
发表于 2019-7-12 09:42:23
感谢楼主分享
nianhua_m
发表于 2019-10-13 13:31:28
freemodbus主从机开源
moment
发表于 2020-1-7 10:43:28
下载了,正在看。谢谢大神。FreeModbus曾经让我成功做过项目。这个主机模式,现在学习一下。
kiss2024
发表于 2020-1-19 17:30:49
收藏FreeModbus主机+从机协议栈,感谢
cyjkai
发表于 2020-2-8 13:54:55
谢谢分享
andy_huang
发表于 2020-3-27 16:32:47
楼主有没有FreeRTOS版本的提供一份,从机成功了,主机移植到FreeRTOS不成功,感激不尽
WITSOFT
发表于 2020-6-22 12:39:27
谢谢分享!学习学习
68336016
发表于 2023-4-19 15:10:02
多谢大神10年前的开源精神,我修修改改把主机代码用到自己程序中了。
freemodbus+RTOS2+STM32F401,超时定时器时间太短,就没有使用OS的虚拟定时器了,直接用STM32的TIM。