找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 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--);
}
回复

使用道具 举报

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???
回复

使用道具 举报

ID:972085 发表于 2021-10-15 13:24 | 显示全部楼层
Hephaestus 发表于 2021-10-15 12:12
到底是ASC还是RTU???

RTU,是RTU
回复

使用道具 举报

ID:972085 发表于 2021-10-15 13:39 | 显示全部楼层
syy520 发表于 2021-10-15 10:02
你的len干嘛用的

数据帧长度
回复

使用道具 举报

ID:294886 发表于 2021-10-15 14:35 | 显示全部楼层
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!
回复

使用道具 举报

ID:972085 发表于 2021-10-15 15:12 | 显示全部楼层
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

这个间隔怎么做?
回复

使用道具 举报

ID:972085 发表于 2021-10-15 15:13 | 显示全部楼层
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

是一帧一帧发的
回复

使用道具 举报

ID:123289 发表于 2021-10-15 15:37 | 显示全部楼层
modbus协议中是如果定义两帧之间的间隔的呢?
回复

使用道具 举报

ID:883242 发表于 2021-10-15 21:27 | 显示全部楼层
MODBUS/RTU的规定是超过3.5字节时间的总线空闲后,第一个收到的数据字节为帧头。

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

ID:972085 发表于 2021-10-21 17:55 | 显示全部楼层
主端不受我控制
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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