找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2910|回复: 19
打印 上一主题 下一主题
收起左侧

请教:modbus发送数据,有时两帧断不开,怎么写好

[复制链接]
跳转到指定楼层
楼主
ID:972085 发表于 2021-10-14 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void SendData(u8 *buff,u8 len)
{
  while(len--)
  {
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
    USART_SendData(USART2,*(buff++));
  }
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
   Dela(24*72000);
}

void Delay(uint32_t nCount)
{
  for (; nCount !=0; nCount--);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:972085 发表于 2021-10-14 18:52 | 只看该作者
delay,少打了个y,抄错了,本身程序没写错
回复

使用道具 举报

板凳
ID:597106 发表于 2021-10-15 10:02 | 只看该作者
你的len干嘛用的
回复

使用道具 举报

地板
ID:883242 发表于 2021-10-15 12:12 | 只看该作者
到底是ASC还是RTU???
回复

使用道具 举报

5#
ID:972085 发表于 2021-10-15 13:24 | 只看该作者
Hephaestus 发表于 2021-10-15 12:12
到底是ASC还是RTU???

RTU,是RTU
回复

使用道具 举报

6#
ID:972085 发表于 2021-10-15 13:39 | 只看该作者
syy520 发表于 2021-10-15 10:02
你的len干嘛用的

数据帧长度
回复

使用道具 举报

7#
ID:294886 发表于 2021-10-15 14:35 | 只看该作者
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!
回复

使用道具 举报

8#
ID:972085 发表于 2021-10-15 15:12 | 只看该作者
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

这个间隔怎么做?
回复

使用道具 举报

9#
ID:972085 发表于 2021-10-15 15:13 | 只看该作者
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

是一帧一帧发的
回复

使用道具 举报

10#
ID:123289 发表于 2021-10-15 15:37 | 只看该作者
modbus协议中是如果定义两帧之间的间隔的呢?
回复

使用道具 举报

11#
ID:883242 发表于 2021-10-15 21:27 | 只看该作者
MODBUS/RTU的规定是超过3.5字节时间的总线空闲后,第一个收到的数据字节为帧头。

MODBUS/ASC不定义两帧之间时间间隔,可以连续发送,用不会出现在帧中间的特殊字符来表示帧头帧尾。
回复

使用道具 举报

12#
ID:972085 发表于 2021-10-18 11:11 | 只看该作者
我不明白的点在于:接收间隔是用中断做的,以串口中断中,是以 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据,做为定时器启动条件的,不是485,如果是全双工的情况,发送做延时要怎么做?
回复

使用道具 举报

13#
ID:972085 发表于 2021-10-18 11:19 | 只看该作者
当然是不是也可以把它当成收发不同时处理,会不会经常错过接收,那么应该怎么补救?相应的我们的发送没有收到正常反馈的时候是不是要重发,有可能同时又有新的发送任务,那又怎么对应,有没有那位大佬有相关代码学习一下?
回复

使用道具 举报

14#
ID:972085 发表于 2021-10-18 11:30 | 只看该作者
当然这是解决了两帧间断开问题后考虑的,其实同样的问题,我看网上很多发送DELAY的时间超过接收3.5字节时间差不多有10倍,按要求是不是也是3.5字节就够了,这么长的时间DELAY会造成迟缓,其实也会造成接收丢包,不知是怎么处理的
回复

使用道具 举报

15#
ID:883242 发表于 2021-10-18 15:52 | 只看该作者
Delay写法有问题,C51可以按你的意愿编译,但是MDK这种编译器会认为你的Delay是无意义代码而优化掉。
回复

使用道具 举报

16#
ID:972085 发表于 2021-10-21 09:12 | 只看该作者
Hephaestus 发表于 2021-10-18 15:52
Delay写法有问题,C51可以按你的意愿编译,但是MDK这种编译器会认为你的Delay是无意义代码而优化掉。

请教一下,那怎么写才好呢?
回复

使用道具 举报

17#
ID:429003 发表于 2021-10-21 09:42 | 只看该作者
发送函数里面,没必要加延迟! MODBUS 是半双工通讯,都是一问一答,怎么会出现连续应答? 需要做的只是收到指令后立即快速处理并应答,莫让主机等待超时而重复操作指令。
回复

使用道具 举报

18#
ID:972085 发表于 2021-10-21 14:05 | 只看该作者
xstong 发表于 2021-10-21 09:42
发送函数里面,没必要加延迟! MODBUS 是半双工通讯,都是一问一答,怎么会出现连续应答? 需要做的只是收 ...

应该不算是标准MODBUS,有主动上报,就是即可以应答接收到的指令,也可以主动发指令
回复

使用道具 举报

19#
ID:429003 发表于 2021-10-21 14:52 | 只看该作者
既然从端有主动连续发送数据帧的功能需求,那么主机端就应该有处理连续包甚至连续字节流的能力!
否则,无论你从端如何延迟,主机都有可能出现不能处理的情况。解决这个问题应该放在主机端,而不是从端。
回复

使用道具 举报

20#
ID:972085 发表于 2021-10-21 17:55 | 只看该作者
主端不受我控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表