关于串口通信中 FIFO的问题

aadfh54 2014-03-12 07:59:08
FIFO缓存的作用是 用来确保高速设备和低速设备之间 通信的稳定性 对于单片机来说 它有接收FIFO缓存和 发送FIFO缓存 PC是高速设备 单片机是低速设备 当我们通过pc向单片机发送数据时 会用到单片机的接收缓存 但是当我们用单片机给PC发送数据 也用不到 发送缓存啊 这个发送缓存 什么情况下用啊??还有 FIFO 功能在什么情况下 才有使用的必要??
...全文
1530 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2015-03-16
  • 打赏
  • 举报
回复
降低中断频率用
of123 2015-03-16
  • 打赏
  • 举报
回复
引用 5 楼 ACK_ACK 的回复:
不知楼主是怎样解决的? 我现在也遇到了这种问题。。PC发送的数据比较多,进串口中断的次数特别频繁,而且还有数据丢失的情况。。不知道FIFO是什么情况.
一般来说,单片机应该能够处理串口通讯这种极低速的事务。 如果你的应用是多任务的,特别是有多个外部发起的通讯接口的,要很好地规划你的系统架构,使所有的中断请求都能被及时响应。如果连串口通讯的这样的事件都不能及时处理,说明你的程序架构有较大的问题。 * 首先,最好不要在中断服务中直接进行任务处理,要做成状态机架构,中断服务只负责收集信息和维护状态机。任务的执行都在主流程中依靠状态机来处理。以保证所有的中断都及时被服务,而不是被其他中断挂起。 只有那些可以即时完成的操作,才可以在中断中直接处理。这要很好地评估。 * 绝不要在中断服务进行延时操作,特别是很长时间的延时。凡是操作中需要等待的情况,都用中断的方式分成多个阶段来实现。 在单片机中,即使有串口 FIFO,也很少。因此,不要依赖它而采用不合理的程序架构。
of123 2015-03-16
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
[quote=引用 4 楼 of123 的回复:] 像串口这种极低速的接口,一般不需要 FIFO 缓存。即使是多任务的芯片系统,在使用中断的情况下,应该可以很好地处理串口的收发。
如果单片机只有在收到 “ABC“ 后要执行打开电机的操作,此时也不用缓存吗?[/quote] 在应用中使用状态机等方式将可以处理了。这里说的“缓存”是硬件 FIFO。单片机一般说来,在执行单一应用任务的情况下,对于只有串口这类极低速通讯接口,大部分时间是在“空转”查询等待。每字节处理还可以增加系统的灵活性。 另外,有些芯片的 UART 模块是没有 FIFO 的。强制使用 FIFO 的方案反而限制了对低成本芯片的使用。
worldy 2015-03-13
  • 打赏
  • 举报
回复
引用 4 楼 of123 的回复:
像串口这种极低速的接口,一般不需要 FIFO 缓存。即使是多任务的芯片系统,在使用中断的情况下,应该可以很好地处理串口的收发。
如果单片机只有在收到 “ABC“ 后要执行打开电机的操作,此时也不用缓存吗?
Pou光明 2015-03-13
  • 打赏
  • 举报
回复
不知楼主是怎样解决的? 我现在也遇到了这种问题。。PC发送的数据比较多,进串口中断的次数特别频繁,而且还有数据丢失的情况。。不知道FIFO是什么情况.
dceacho 2014-03-13
  • 打赏
  • 举报
回复
如果没有发送缓存,当数据多的时候你得发送一个字节后你得中断一下去发送下一个字节, 如果有1K字节的话,你就得中断1000次去处理发送的数据
Binzo 2014-03-13
  • 打赏
  • 举报
回复
fifo和队列很像,pc与单片机通过串口通信,怎么说也是个队列;所以数据量比较大时,用fifo是自然而然的事,一端只顾发,一端只顾收,很省事。 fifo既可以是数据结构,也可以是实在的RAM单元。
of123 2014-03-13
  • 打赏
  • 举报
回复
像串口这种极低速的接口,一般不需要 FIFO 缓存。即使是多任务的芯片系统,在使用中断的情况下,应该可以很好地处理串口的收发。
mangoalx 2014-03-12
  • 打赏
  • 举报
回复
假定以9600bps通讯,大概1ms传一个字符。如果没有缓存,程序要保证在1ms内处理一次通讯才能保证不丢数据。对发送来说处理不及时相对好些,只是发送有间隙,效率下降。 如果有16bytes缓存,那么只要16ms处理一次就可以了。所以从提高效率,保证可靠性,节约处理器时间来说,无论收发都应该使用缓存。 PC虽然高速,但不是实时系统,好在资源海量,也是要用大缓存的
根据原作 https://pan.quark.cn/s/1f2aa2083eb2 的源码改编 标题的“fpga串口通信,利用fifo转发”是指通过FPGA(Field-Programmable Gate Array,现场可编程门阵列)硬件架构,构建一个串行通信接口,并借助FIFO(First In First Out,先进先出)存储机制来暂存接收到的数据,随后将这些数据传递给上位机。 此类设计常应用于高速数据交换的场景,旨在保障数据的完整性与准确性。 串行通信作为电子设备间普遍采用的一种交互方式,其基础是串行数据传输,通常遵循UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器/发送器)协议。 UART是一种简便且应用广泛的串行通信接口,适用于实现低速数据交换,常见的波特率设定值包括9600、19200、38400等。 在FPGA构建串口通信功能,首要任务是确立UART接口的规格,涵盖数据线、时钟信号、起始位、停止位以及校验位等要素。 Verilog作为硬件描述语言,被用于编写FPGA的逻辑电路。 在Verilog语言环境,必须定义功能模块,完成UART接收器和发送器的构建任务,同时还需应对数据同步挑战,因为FPGA内部时钟频率与外部串口时钟频率可能存在不一致性。 FIFO作为数据缓存装置,能够有效协调数据传输速率的不匹配状况。 一旦FPGA捕获到串口传输的数据,这些信息会被暂时存储在FIFO,直至上位机具备接收条件。 FIFO通常通过读写指针进行管理,读指针指示待读取的数据位置,写指针标记待写入的新数据位置。 当写指针超越读指针时,表明FIFO已满;相对地,若读指针超过写指针,则意味着FIFO为空。 Quartus II是...

27,520

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧