打印
[STM32F1]

485发送控制的问题

[复制链接]
3306|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
djz1992|  楼主 | 2017-5-2 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人菜鸟,请各位指点。
我在写485 modbus的函数,485的发送和接收有一个控制脚,在发送函数中应该先拉高控制脚进入发送模式,发送完后应该拉低控制脚进入接收模式。
如果用非中断写发送函数,那进函数内先拉高,出函数前拉低,就可以了。
1.现在我用中断模式发送和接收,我该如何判断是否发送完毕,需要拉低进入接收模式?
2.另外,非中断模式下,两次发送可以控制不出现连在一起,如果用中断模式,在主函数中多次发送,是否需要考虑两次发送连在一起,这个又该如何判断是否发送完毕?
3.有的485代码里写了3.5个周期时间间隔以上无数据代表一帧完毕,有的代码里没有此部分,到底是怎么回事呢?
沙发
胡慧海| | 2017-5-2 10:04 | 只看该作者
串口有有个寄存器标志位表示串口发送完成的标志位

使用特权

评论回复
板凳
djz1992|  楼主 | 2017-5-2 10:28 | 只看该作者
胡慧海 发表于 2017-5-2 10:04
串口有有个寄存器标志位表示串口发送完成的标志位

厉害了,库开发的话是哪个函数啊

使用特权

评论回复
地板
huzi2099| | 2017-5-2 10:30 | 只看该作者
1.现在我用中断模式发送和接收,我该如何判断是否发送完毕,需要拉低进入接收模式?

发送完毕中断并且没有再要发送的数据了就转为接收

2.另外,非中断模式下,两次发送可以控制不出现连在一起,如果用中断模式,在主函数中多次发送,是否需要考虑两次发送连在一起,这个又该如何判断是否发送完毕?

分包必须要插入间隔啊,没明白你意思

3.有的485代码里写了3.5个周期时间间隔以上无数据代表一帧完毕,有的代码里没有此部分,到底是怎么回事呢?

完整的分包检测必须有

使用特权

评论回复
5
djz1992|  楼主 | 2017-5-2 10:41 | 只看该作者
本帖最后由 djz1992 于 2017-5-2 10:46 编辑

使用特权

评论回复
6
djz1992|  楼主 | 2017-5-2 10:42 | 只看该作者
huzi2099 发表于 2017-5-2 10:30
1.现在我用中断模式发送和接收,我该如何判断是否发送完毕,需要拉低进入接收模式?

发送完毕中断并且没有 ...

谢谢你的回复

使用特权

评论回复
7
mmuuss586| | 2017-5-2 12:30 | 只看该作者
3.5个字节延时还是要有的

使用特权

评论回复
8
djz1992|  楼主 | 2017-5-2 13:03 | 只看该作者
mmuuss586 发表于 2017-5-2 12:30
3.5个字节延时还是要有的

是指接收函数要收完之后要等3.5周期,看看是不是真的结束了?

使用特权

评论回复
9
guyues1| | 2017-5-2 13:58 | 只看该作者
跟中不中断关系不大吧 既然是发数据,即使是在中断函数里面,每次发送一个字节都是相应的寄存器标志位吧,若果是连续发送,等到最后一个字节发送完毕,考虑到时序,延时一会后,拉低进入接收模式。

以前做的毕设就是参考开发板例程编写的。

使用特权

评论回复
10
djz1992|  楼主 | 2017-5-2 16:54 | 只看该作者
guyues1 发表于 2017-5-2 13:58
跟中不中断关系不大吧 既然是发数据,即使是在中断函数里面,每次发送一个字节都是相应的寄存器标志位吧, ...

我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个字节的发送前后都开关一次。不知道GPIO的拉高和拉低是否来得及?
GPIO_SetBits(GPIOB,GPIO_Pin_0);//拉高进入发送
USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]); //发送一个字节
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//拉低

使用特权

评论回复
11
玄德| | 2017-5-2 21:54 | 只看该作者
djz1992 发表于 2017-5-2 13:03
是指接收函数要收完之后要等3.5周期,看看是不是真的结束了?


这是收发双方的约定,用来对数据分为帧。

也许modbus协议有这个约定。
如果没有,完全可以设计别的方式,不一定非要3.5周期空白。


使用特权

评论回复
12
zyj9490| | 2017-5-2 23:37 | 只看该作者
huzi2099 发表于 2017-5-2 10:30
1.现在我用中断模式发送和接收,我该如何判断是否发送完毕,需要拉低进入接收模式?

发送完毕中断并且没有 ...

发送前,要填TXBUF,再启用发送中断,这样,产生TXE中断,送BUF的数据,当数据没有送时,发送完成时,会产生TC中断,此时可以切换控制脚了.当然,BUF里的发送头要控制好才对。关键是回调FUNCTION。

使用特权

评论回复
13
zyj9490| | 2017-5-2 23:39 | 只看该作者
还有何时,接收一裭完成,根据MODBUS的协议,应用空闲时间计数,在接收时,接收中断不断清0,计时计数器,

使用特权

评论回复
14
djz1992|  楼主 | 2017-5-3 09:22 | 只看该作者
zyj9490 发表于 2017-5-2 23:39
还有何时,接收一裭完成,根据MODBUS的协议,应用空闲时间计数,在接收时,接收中断不断清0,计时计数器, ...

厉害了,大神回复很详细。
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个字节的发送前后都开关一次。不知道GPIO的拉高和拉低是否来得及?这样不等一帧发完拉低,而是每发一个字节都拉低,行不行?
GPIO_SetBits(GPIOB,GPIO_Pin_0);//拉高进入发送
USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]); //发送一个字节
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//拉低

使用特权

评论回复
15
smileage| | 2017-5-3 09:44 | 只看该作者
djz1992 发表于 2017-5-3 09:22
厉害了,大神回复很详细。
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个 ...

发送的时候不用每个字节都操作发送使能脚,发送前开启,发送完禁止就行,平时默认都是接收模式。

使用特权

评论回复
16
huzi2099| | 2017-5-3 10:17 | 只看该作者
本帖最后由 huzi2099 于 2017-5-3 10:22 编辑
djz1992 发表于 2017-5-3 09:22
厉害了,大神回复很详细。
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个 ...

每接收一个字节都切换不合适,比较好的做法是接收到一个完整的帧以后(地址和crc校验都通过)即转入帧处理,帧处理前切换到发送模式,mosdbus里有帧就必有响应回复。
modbus可以简单做,也可以复杂做,看你需不需要过认证,认证也有简单的和复杂的。
各种情况不漏不丢不错,波特率还挺高就不容易。

使用特权

评论回复
17
zyj9490| | 2017-5-3 11:55 | 只看该作者
djz1992 发表于 2017-5-3 09:22
厉害了,大神回复很详细。
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个 ...

不对的,发送状态时,有数据未发时,不应去控制切换脚。

使用特权

评论回复
18
guyues1| | 2017-5-4 13:57 | 只看该作者
djz1992 发表于 2017-5-2 16:54
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个字节的发送前后都开关一次。 ...

目测不行 要有延时

使用特权

评论回复
19
guyues1| | 2017-5-4 13:58 | 只看该作者
djz1992 发表于 2017-5-2 16:54
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个字节的发送前后都开关一次。 ...

还有比较好奇为何不等到所有字节都发送完了再拉低

使用特权

评论回复
20
guyues1| | 2017-5-4 14:00 | 只看该作者
djz1992 发表于 2017-5-2 16:54
我找到了案例中的发送语句,中断发送也是一个字节一个字节发的,所以在每一个字节的发送前后都开关一次。 ...

我看到坛子里不少大神说的挺对的 你写完实际调试几次就知道了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人生苦短,冬日苦长,正是青葱,却无骄阳

115

主题

620

帖子

5

粉丝