标题: 请教:modbus发送数据,有时两帧断不开,怎么写好 [打印本页]

作者: sarayang    时间: 2021-10-14 18:49
标题: 请教:modbus发送数据,有时两帧断不开,怎么写好
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--);
}

作者: sarayang    时间: 2021-10-14 18:52
delay,少打了个y,抄错了,本身程序没写错
作者: syy520    时间: 2021-10-15 10:02
你的len干嘛用的
作者: Hephaestus    时间: 2021-10-15 12:12
到底是ASC还是RTU???
作者: sarayang    时间: 2021-10-15 13:24
Hephaestus 发表于 2021-10-15 12:12
到底是ASC还是RTU???

RTU,是RTU
作者: sarayang    时间: 2021-10-15 13:39
syy520 发表于 2021-10-15 10:02
你的len干嘛用的

数据帧长度
作者: xzh5508    时间: 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!
作者: sarayang    时间: 2021-10-15 15:12
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

这个间隔怎么做?
作者: sarayang    时间: 2021-10-15 15:13
xzh5508 发表于 2021-10-15 14:35
两帧数据之间不是该有一个间隔吗?既然是两帧,你就一帧一帧发啊!

是一帧一帧发的
作者: yzwzfyz    时间: 2021-10-15 15:37
modbus协议中是如果定义两帧之间的间隔的呢?
作者: Hephaestus    时间: 2021-10-15 21:27
MODBUS/RTU的规定是超过3.5字节时间的总线空闲后,第一个收到的数据字节为帧头。

MODBUS/ASC不定义两帧之间时间间隔,可以连续发送,用不会出现在帧中间的特殊字符来表示帧头帧尾。
作者: sarayang    时间: 2021-10-18 11:11
我不明白的点在于:接收间隔是用中断做的,以串口中断中,是以 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据,做为定时器启动条件的,不是485,如果是全双工的情况,发送做延时要怎么做?

作者: sarayang    时间: 2021-10-18 11:19
当然是不是也可以把它当成收发不同时处理,会不会经常错过接收,那么应该怎么补救?相应的我们的发送没有收到正常反馈的时候是不是要重发,有可能同时又有新的发送任务,那又怎么对应,有没有那位大佬有相关代码学习一下?
作者: sarayang    时间: 2021-10-18 11:30
当然这是解决了两帧间断开问题后考虑的,其实同样的问题,我看网上很多发送DELAY的时间超过接收3.5字节时间差不多有10倍,按要求是不是也是3.5字节就够了,这么长的时间DELAY会造成迟缓,其实也会造成接收丢包,不知是怎么处理的
作者: Hephaestus    时间: 2021-10-18 15:52
Delay写法有问题,C51可以按你的意愿编译,但是MDK这种编译器会认为你的Delay是无意义代码而优化掉。
作者: sarayang    时间: 2021-10-21 09:12
Hephaestus 发表于 2021-10-18 15:52
Delay写法有问题,C51可以按你的意愿编译,但是MDK这种编译器会认为你的Delay是无意义代码而优化掉。

请教一下,那怎么写才好呢?
作者: xstong    时间: 2021-10-21 09:42
发送函数里面,没必要加延迟! MODBUS 是半双工通讯,都是一问一答,怎么会出现连续应答? 需要做的只是收到指令后立即快速处理并应答,莫让主机等待超时而重复操作指令。
作者: sarayang    时间: 2021-10-21 14:05
xstong 发表于 2021-10-21 09:42
发送函数里面,没必要加延迟! MODBUS 是半双工通讯,都是一问一答,怎么会出现连续应答? 需要做的只是收 ...

应该不算是标准MODBUS,有主动上报,就是即可以应答接收到的指令,也可以主动发指令
作者: xstong    时间: 2021-10-21 14:52
既然从端有主动连续发送数据帧的功能需求,那么主机端就应该有处理连续包甚至连续字节流的能力!
否则,无论你从端如何延迟,主机都有可能出现不能处理的情况。解决这个问题应该放在主机端,而不是从端。
作者: sarayang    时间: 2021-10-21 17:55
主端不受我控制




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1