打印

关于串口FIFO的使用

[复制链接]
4853|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
djz1992|  楼主 | 2016-6-24 13:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
if(Re[num-1]==0x7e)
{action();}我在使用串口时候,是这样的逻辑,中断内接收,主函数内判断是否接收完毕,然后进入处理函数
然而如果两个指令连发,01 02 03 04 05 06 0 08 7e 01 02 03 04 05 06 0 08 09 7e,就会出错。
FIFO设成7/8,是14字节,就不再出错。
1.默认的FIFO是8字节,这是什么意思?FIFO的深度具体有哪些影响?
2.接收中断为什么进的这么慢?收完第一帧,出了中断,进入action函数都运行了一大半了,第二帧数据还没有读出来,知道action快结束才又进中断读取到第二帧。
照理说不是先进中断么?





相关帖子

沙发
dirtwillfly| | 2016-6-24 16:28 | 只看该作者
1、8个字节FIFO缓存就满了,不及时读出就会丢失数据

使用特权

评论回复
板凳
dirtwillfly| | 2016-6-24 16:29 | 只看该作者
2、第二个问题没看懂,能提供更多的代码或相关说明吗

使用特权

评论回复
地板
djz1992|  楼主 | 2016-6-24 16:55 | 只看该作者
dirtwillfly 发表于 2016-6-24 16:29
2、第二个问题没看懂,能提供更多的代码或相关说明吗

代码太长了。。。比如说就是16长度的数据,收完8个,主函数中的处理函数开始处理了,处理程序运行了一大半了,还没有进中断把后8个取出来。处理函数运行到最后几句才去读取,按理说中断的优先级高,不会在主函数里运行这么久而不进中断

使用特权

评论回复
5
dirtwillfly| | 2016-6-24 17:01 | 只看该作者
djz1992 发表于 2016-6-24 16:55
代码太长了。。。比如说就是16长度的数据,收完8个,主函数中的处理函数开始处理了,处理程序运行了一大 ...

你追踪一下,看看业务逻辑有没有问题。
没看明白你的主函数的处理函数为么还要进中断读数据,看不懂这个逻辑。。
也不知道你这个中断是什么中断,什么时候触发

使用特权

评论回复
6
baimiaocun2015| | 2016-6-24 17:08 | 只看该作者
FIFO机制的比较不错的选择,先入先出的。

使用特权

评论回复
7
yklstudent| | 2016-6-25 10:51 | 只看该作者
FIFO,中断只负责数据的存入;
while(1)任务内不断判断FIFO缓冲区数据,然后不断解析;
控制要写入与写出的速度

使用特权

评论回复
8
ligoxyz| | 2016-6-25 16:10 | 只看该作者
中断可能被关闭了,另外程序运行也很快的,FIFO没有引起中断,程序就运行完了,也是可能的

使用特权

评论回复
9
mmbs| | 2016-6-26 23:19 | 只看该作者
如果存储满了就不能在存了。

使用特权

评论回复
10
mmbs| | 2016-6-26 23:20 | 只看该作者
这个是为了能够加快处理速度。

使用特权

评论回复
11
djz1992|  楼主 | 2016-6-27 08:36 | 只看该作者
dirtwillfly 发表于 2016-6-24 17:01
你追踪一下,看看业务逻辑有没有问题。
没看明白你的主函数的处理函数为么还要进中断读数据,看不懂这个 ...

。。。串口接收中断,数据很长的时候并不是一次性接收完,收完第一次会出中断,在主函数里运行一会儿再进去接收。触发条件 文中说默认二分之一的话满八个字节才会触发一次接收中断,但是我只收两个字节也是可以进入接收中断的。这就是问题1,fifo到底起了什么作用。问题2,为什么两次进中断之间,在主函数呆了那么久。

使用特权

评论回复
12
djz1992|  楼主 | 2016-6-27 08:38 | 只看该作者
baimiaocun2015 发表于 2016-6-24 17:08
FIFO机制的比较不错的选择,先入先出的。

那fifo深度是长一点好还是短一点好?

使用特权

评论回复
13
djz1992|  楼主 | 2016-6-27 08:40 | 只看该作者
yklstudent 发表于 2016-6-25 10:51
FIFO,中断只负责数据的存入;
while(1)任务内不断判断FIFO缓冲区数据,然后不断解析;
控制要写入与写出 ...

在主函数判断缓冲区吗?不是利用FIFO存满自动获取么?
另外我的fifo深度是8字节,为什么收到2个字节也会进中断。然而文档里是这么说的,深度为4时,收到4个才会触发一个中断,那收到两个是不是不会触发

使用特权

评论回复
14
djz1992|  楼主 | 2016-6-27 08:41 | 只看该作者
ligoxyz 发表于 2016-6-25 16:10
中断可能被关闭了,另外程序运行也很快的,FIFO没有引起中断,程序就运行完了,也是可能的 ...

所以就奇怪了,中断优先级那么高,为什么引起的这么慢

使用特权

评论回复
15
djz1992|  楼主 | 2016-6-27 08:43 | 只看该作者
mmbs 发表于 2016-6-26 23:19
如果存储满了就不能在存了。

也就是没有及时把缓冲区的数据读出来,下一段数据来就会把之前的覆盖掉?
那这么说fifo深度越深越好了?
另外我的fifo深度是8字节,为什么收到2个字节也会进中断。然而文档里是这么说的,深度为4时,收到4个才会触发一个中断,那收到两个是不是不会触发

使用特权

评论回复
16
lzbf| | 2016-6-27 22:31 | 只看该作者
存满了之后不能再存取了,需要及时读取

使用特权

评论回复
17
lzbf| | 2016-6-27 22:33 | 只看该作者
这个fifo还是很好用的

使用特权

评论回复
18
djz1992|  楼主 | 2016-7-6 13:01 | 只看该作者
在主函数判断缓冲区吗?不是利用FIFO存满自动获取么?
另外我的fifo深度是8字节,为什么收到2个字节也会进中断。然而文档里是这么说的,深度为4时,收到4个才会触发一个中断,那收到两个是不是不会触发  

使用特权

评论回复
19
djz1992|  楼主 | 2016-7-11 08:40 | 只看该作者
lzbf 发表于 2016-6-27 22:33
这个fifo还是很好用的

深度为8的话,我只收到一个字节的时候也可以进中断读取到
但是手册上写的是“举例来说,若设置接收FIFO的触发深度为1/4,则当UART连续收到4个数据字节后即会产生一个接收中断。”
这不是说满了四个才会触发中断么,为什么我只收到一个也会触发中断

使用特权

评论回复
20
angerbird| | 2016-7-11 11:59 | 只看该作者
这个具体的怎样操作的?我参考下的

使用特权

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

本版积分规则

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

115

主题

620

帖子

5

粉丝