10993|19

21

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

非常好用的uart fifo ,使modbus协议编程变的简单 [复制链接]

刚开始不习惯用fifo,思维定式还是51那种一个字节中断一次的模式。后来理解了fifo的用意后,觉得fifo设计的非常棒,在lm3s虽然接收超时为3T与modbus的3.5T不同,但是经过反复测试3T完全可以满足要求。

最新回复

大侠,为何一去不复返? 下面一个疑点还请指教:我采用一般的接收中断来接收数据,即每接收一个字节进入中断;每次接收一字节前使能定时器,若在3.5个字符内优先进入接收中断,则在此关闭定时中断。如此反复。如果接收数据是小于等于八个字节,运行没问题;如果接收数据超过8个字节,接收8个字节后就进入定时中断了,无法正常接收剩余的字节了;但是调试时却是可以全部接受到超过的8个字节。  详情 回复 发表于 2013-2-26 08:36

点评

很赞同楼主想法,但是有些疑问,请大侠指教。:) https://bbs.eeworld.com.cn/thread-366011-1-1.html  详情 回复 发表于 2013-2-16 10:51
 
点赞 关注(1)

回复
举报

281

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不会。
 
个人签名[url=http://www.51great.org/]嵌入式培训[/url
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
:carnation: 撒花~交流下,俺也正在做这个~
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

4
 
rs485置发送后,只要发送fifo未满就往里面丢发送数据直至全部放入发送fifo,发送fifo发完后置接收并开超时定时器,如果定时器超时(一般为2秒)则从设备无响应、如果接收fifo满中断,读出fifo至开辟的缓冲区,如果fifo超时中断说明modbus包接收结束,处理缓冲区的数据,按modbus协议响应命令、错误处理或者丢弃数据包。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

5
 
嗯,我的疑问是,主机主动发,在发完一组数据后,切换485为收;那什么时候再切换回来发呢,以怎样的频率发?
在我收完之后,切方向为发;或者接收超时时就转为发;而不是以一个固定频率发。
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

6
 
一般modbus从设备手册里都有一个响应最大时间'一般都在100ms左右'发送设备也有一个设定的等待时间'plc编程一般默认2s'我的观点是只要超时就切换接收'如果没有接受到'2s后才能转回发送
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

7
 
嗯,最近忙,都没过来。已经实现了,接收完毕或者接收超时就转为发送。谢谢,是我想的太严重了,做起来才发现没那么复杂。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

8
 
朋友在么?遇到一个问题,帮帮忙么?

我使用UART时,设置了FIFO接收中断深度,同时使能接收超时中断。

请问,这个接收超时中断是什么情况下触发的?手册上有这样一句话,“当接收FIFO不为空时接收超时中断有效”。

我做了一块modbus主机板,没接从机的时候,也就没有接收,这个时候没有接收超时中断;这跟那句话是对得上的,也是合理的。

后来,调试好了,准备提交测试了,程序烧到另一块板上,诡异的事情出现了,没接从机,那个芯片却一直进入接收超时中断。。



因为接收中断RX和接收超时中断RT都是进入到接收处理函数里的,在接收处理函数里,我会清零通信超时计数器的;如果没有接从机也就是没有通信的时候,处理器一直有触发接收超时中断,在接收处理函数里,通信超时计数器一直清零,那通信超时就无法判断到了。



朋友,有木有遇到过这么纠结的情况,如何解决呢?

点评

当至少接收到一个或多个字节压入接收fifo中后,在正确接收的最后一个字节后,有超过3个字节的时间但没有接收到任何信息,即为超时中断,简单的将超时中断就是一个帧结束的标志。如果做modbus主机,当发送完后马  详情 回复 发表于 2013-2-16 22:28
 
 
 

回复

7243

帖子

192

TA的资源

五彩晶圆(高级)

9
 
MARK 学习了不少啊
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 楼主 mxfahm 的帖子

很赞同楼主想法,但是有些疑问,请大侠指教。

https://bbs.eeworld.com.cn/thread-366011-1-1.html

点评

回10楼: 接收中断意思是接收fifo满中断,如果设置6/8即12个字节,意思是当fifo中有正确的12字节时将产生接收中断。如果不配置默认是16个字节,一般设置12字节中断这样的好处是当有更高优先级中断或者更高优  详情 回复 发表于 2013-2-16 22:29
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

11
 
原帖由 暖暖美少 于 2011-12-14 15:44 发表
朋友在么?遇到一个问题,帮帮忙么?

我使用UART时,设置了FIFO接收中断深度,同时使能接收超时中断。

请问,这个接收超时中断是什么情况下触发的?手册上有这样一句话,“当接收FIFO不为空时接收超时中断有效 ...

   当至少接收到一个或多个字节压入接收fifo中后,在正确接收的最后一个字节后,有超过3个字节的时间但没有接收到任何信息,即为超时中断,简单的将超时中断就是一个帧结束的标志。如果做modbus主机,当发送完后马上转为接收状态,启动等待计时器,在等地一段时间后(从机最大相应时间,这个参数可设置)认为从机无响应,如果在规定的时间内有接收到正确的信息,则清计时器,处理通讯内容。其实有了超时中断大可不必再设置一个用于modbus协议里德那个3.5t的超时定时器。如果在没有从机的情况下仍然会进入超时中断,有可能是接收引脚有一个下拉脉冲,让接收器误认为有一个ox00进入接收fifo,但后面又无其他数据所以就进入了超时中断。以上是个人己见,本人才疏学浅难免有误,请大虾予以指正。
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

12
 
原帖由 benbending 于 2013-2-16 10:51 发表
很赞同楼主想法,但是有些疑问,请大侠指教。

https://bbs.eeworld.com.cn/thread-366011-1-1.html

回10楼:
    接收中断意思是接收fifo满中断,如果设置6/8即12个字节,意思是当fifo中有正确的12字节时将产生接收中断。如果不配置默认是16个字节,一般设置12字节中断这样的好处是当有更高优先级中断或者更高优先级的任务发生后并处理后,接收fifo不至于超出16个字节溢出而丢失接收数据。如果不启用超时中断无法判断一帧数据的结束。
    例如19个字节的一帧数据从主机发送过来,接收端配置为接收fifo中断6/8启用超时中断,当接收了12个字节到从机的接收fifo中后只触发接收中断,在中断程序中用while循环把接收fifo的数据全部读出,放入协议处理程序中开辟的缓冲区中,随即后面7个字节正确进入接收fifo中后,此时只触发超时中断,因为主机再无其他数据发出并且也未到达12个字节fifo满的接收中断。以上是一个帧接收的简单分析,本人才疏学浅难免有误,请大虾予以指正。


编辑修改错别字

[ 本帖最后由 mxfahm 于 2013-2-16 22:36 编辑 ]

点评

谢谢! 在中断程序中用while循环把接收fifo的数据全部读出,放入协议处理程序中开辟的缓冲区中。这里无法理解,在中断里面读取仅能读到最后一个字节的数据。您是怎么读到所有数据的,求解。:Sweat:  详情 回复 发表于 2013-2-17 08:02
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

13
 

回复 12楼 mxfahm 的帖子

谢谢!

在中断程序中用while循环把接收fifo的数据全部读出,放入协议处理程序中开辟的缓冲区中。这里无法理解,在中断里面读取仅能读到最后一个字节的数据。您是怎么读到所有数据的,求解。

点评

因为有fifo呀,如果你设定接收fifo中断深度6/8,那么当发生接收中断时接收fifo中就有12个字节在fifo中。 例如: void UART0IntHandler(void) { unsigned long ulStatus; //读中断源 ulStatus =  详情 回复 发表于 2013-2-17 18:23
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 13楼 benbending 的帖子

因为有fifo呀,如果你设定接收fifo中断深度6/8,那么当发生接收中断时接收fifo中就有12个字节在fifo中。
例如:
void
UART0IntHandler(void)
{
    unsigned long ulStatus;
    //读中断源
    ulStatus = UARTIntStatus(UART0_BASE, true);
    //清除中断源
    UARTIntClear(UART0_BASE, ulStatus);
    //判断中断源
     if(ulStatus & (UART_INT_RX | UART_INT_RT))
     {
        //如果是接收或者超时中断,读取fifo直到fifo空
        while(UARTCharsAvail(UART0_BASE))
        {
            g_pucUISerialReceive[g_ulUISerialReceiveWrite] =
                UARTCharGet(UART0_BASE);
        }
}

点评

大侠,下午好! 又出新问题,在从机接收完数据并发送之后,部分情况,从机发送的数据又被自己接收回来,怎么办?:puzzle: [ 本帖最后由 benbending 于 2013-2-18 15:38 编辑 ]  详情 回复 发表于 2013-2-18 15:20
好像可以了,函数选错了。谢谢。 [ 本帖最后由 benbending 于 2013-2-18 09:52 编辑 ]  详情 回复 发表于 2013-2-17 21:12
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

15
 

回复 14楼 mxfahm 的帖子

好像可以了,函数选错了。谢谢。

[ 本帖最后由 benbending 于 2013-2-18 09:52 编辑 ]
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

16
 

回复 14楼 mxfahm 的帖子

大侠,下午好!
又出新问题,在从机接收完数据并发送之后,部分情况,从机发送的数据又被自己接收回来,怎么办?

[ 本帖最后由 benbending 于 2013-2-18 15:38 编辑 ]
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

17
 
被你搞晕了,rs485通讯是半双工的,收发不同同时进行,怎么自己发出去的数据又被自己接收呢。我觉的你是不是引用错了接收和发送fifo或者是你自己开辟的缓冲区数据。

点评

谢谢您的回复。 UARTCharGet(UART0_BASE);也没有说获取的是TXfifo还是RXfifo中的数据啊。 这个还真没注意。关键是数据主机发送数据快了就会偶尔出现这种情况。而且是在从机接收一个请求,并响应请求之后,才有接收  详情 回复 发表于 2013-2-20 09:41
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

18
 

回复 17楼 mxfahm 的帖子

谢谢您的回复。
UARTCharGet(UART0_BASE);也没有说获取的是TXfifo还是RXfifo中的数据啊。
这个还真没注意。关键是数据主机发送数据快了就会偶尔出现这种情况。而且是在从机接收一个请求,并响应请求之后,才有接收了这段响应的数据。
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

19
 
你把你的工程打包发到39248122@qq.com,我帮你测试。

点评

大侠,为何一去不复返? 下面一个疑点还请指教:我采用一般的接收中断来接收数据,即每接收一个字节进入中断;每次接收一字节前使能定时器,若在3.5个字符内优先进入接收中断,则在此关闭定时中断。如此反复。如果  详情 回复 发表于 2013-2-26 08:36
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

20
 

回复 19楼 mxfahm 的帖子

大侠,为何一去不复返?
下面一个疑点还请指教:我采用一般的接收中断来接收数据,即每接收一个字节进入中断;每次接收一字节前使能定时器,若在3.5个字符内优先进入接收中断,则在此关闭定时中断。如此反复。如果接收数据是小于等于八个字节,运行没问题;如果接收数据超过8个字节,接收8个字节后就进入定时中断了,无法正常接收剩余的字节了;但是调试时却是可以全部接受到超过的8个字节。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
中星联华&ADI明日直播
直播主题:大咖面对面,轻松玩转高速ADC性能测试
直播时间:3月25日(周二)14:00
活动奖励:京东卡、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表