❶ 51单片机串口发送u32丢数量
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
单片机
打开APP
C51单片机串口丢包的几种情况分析! 转载
2021-03-22 11:29:28
3点赞
嵌入式资讯精选
码龄败租5年
关注
今天来总结一下C51单片机串口驱动层丢包的几种情况.
---C51单片机串拦枯衫口收发数据的原理---
1、串口驱动模块组成
(1)串口数据收发器,串口收发数据时,底层执行实际收发动作的硬件单元;
(2) 串口相关寄存器,
SBUF:串口数据寄存器,当有数据收或发时,用来装载收或发的数据,实际底层是分开收和发两个不同寄存器的,用户(程序员)只用SBUF就可以了;
RI:串口接收中断标志,告诉CPU现在串口收到数据了
TI:串口发简腔送中断标志,告诉CPU现在串口有数据要发了;
TI和RI都是系统产生用户软件清零的。
(3)串口中断服务函数;串口收数据和发数据的中断是一个,收和发在同一个中断服务函数进行,在RI为1时把寄存器SBUF里的数据拷贝到用户缓存里,在TI为1 时,把用户要发的数据装载到SBUF里。
2、收数据过程
(1)对端串口发送器发了1byte数据
(2) 串口接收器收到1byte数据,存到SBUF寄存器,并把寄存器中RI位置1
(3)系统产生一个中断,CPU内核轮询发现RI为1是串口中断,从用户程序跳转至串口中断服务函数
(4)串口中断服务函数中,把SBUF寄存器中的这1byte数据拷贝至用户缓存
收数据过程是1byte产生一个中断,也就是说数据是1byte 1byte收的。
数据流向过程如下图:
3、发数据过程
(1)用户把TI置1
(2) 系统产生中断,内核轮询到TI为1,跳转至串口中断服务函数
(3) 用户把1byte要发的数据装载至SBUF
(4)硬件发送器发送数据,发送完成自动把TI置1
(5)系统产生中断,重复(2)~(4)
(6) 当用户不再往SBUF装数据时,发送数据过程结束
发数据也是1byte 1byte发,每1byte先产生中断再装载数据。
数据流向过程如下图:
---串口丢包总结---
说明下,这是无操作系统的单片机程序。
我 = 串口硬件收发器+串口软件中断服务函数+串口相关寄存器。
用户 = 应用程序
1、我的硬件收发器在收发数据,用户把系统总中断关了
先说收数据的情况,系统中断被用户关了,我的硬件部分还是能收数据的,我仍然会把RI置1,但是现在总中断关了,就不会产生中断了,不会去调起我的软件中断服务函数了,那这样就会造成我放到SBUF里的数据还没有传给用户,如果关中断期间,我又收到了新的1byte数据,我就会把新的数据放到SBUF里,覆盖了老的数据了。
这样老的那1byte数据就丢掉了。
举例:串口正在收数据时,用户要写一些掉电记忆的参数到Flash,操作Flash会关总中断,此时如果串口在收数据可能会丢包。
解决:关总中断之前判断一下串口是不是在忙,串口无数据收到连续累计一段时间才认为闲。
发数据的情况会不会有问题?如果我的硬件在发数据,用户把总中断关了,我发完这1byte数据仍然会把TI置1,但是此时不会产生中断,不会再进入我的软件中断服务函数继续发数据,等中断恢复了,CPU会马上进入我的中断服务函数,又会继续发数据,所以发数据过程关总中断不会造成发数据丢包。
2、有人在中断服务函数里待太久,耽误我的软件收数据
我的硬件收到了数据,我把他放到了SBUF里,同时也置起了RI标志位,但不巧,这时候CPU在另一个中断服务函数里在执行代码,更不巧,这个中断服务函数很长,有很多代码要执行,要很久很久!
这不就误事了吗,CPU还没从那个中断服务函数出来,我的硬件又收到了新的1byte数据,我又把他装到了SBUF里,置起了RI,老的那1byte数据还在SBUF,没传给用户缓存呢,新的把他覆盖掉了。
举例:某MCU LED驱动用调光模式(即可调亮度模式),由于其中断服务函数太长,造成串口收数据丢包
解决:设置串口中断优先级高于LED中断优先级,C51中高优先级中断可以抢断低优先级中断,这样串口就不会丢包了。
3、大量数据又收又发,我的软件部分不够聪明,忙不过来了
同时有数据在收和发,我也是能应付的,因为咱是全双工的啊,收数据和发数据可以同时进行,是不同的硬件单元;此时RI和TI都会被我置成1,系统会进去中断服务函数,但系统是不知道这次进去是TI还是RI事件的,只管其中一个为1就进去了。
我的软件中断服务函数进去一次可以把收和发的数据都处理了,出来后就不会再次进中断服务函数了,
如果程序员把我的软件写成进一次中断服务函数只处理RI或者TI一个事件,那就效率很低啊!数据很多时极有可能会丢包!
比如如果优先处理TI事件,下次再进来想处理RI了但此时TI事件又有了,RI事件就又没处理到了。
如果优先处理RI事件,收到的数据不会丢,但是下次进来RI事件又产生了,又要处理RI事件,想发的数据一直没机会发。
所以,串口中断服务函数里要能同时处理RI 和TI 中断事件,下图中的else if 应改成if。
又如果,串口中断服务函数里面太长,前一次还没处理完,新的中断又到了,就会自己耽误自己。
4、当前数据还没发完,用户又把新数据装到我的SBUF中
我的硬件在发数据,此时TI已经被用户程序清0了,
如果程序员逻辑不够清晰,马上又要发一包新数据,把TI置1 了,那么CPU会马上进入中断服务函数,中断服务函数马上会把新的1byte 数据装到我的SBUF里,我刚刚正在发的那1byte 数据还没发完就被新数据覆盖弄丢了。
解决:程序串口驱动层接口发数据前,先判断当前是否处于发送数据过程中,若正在发送过程中,不用再将TI置1.
5、 我们这里总中断关了,对方还发数据给我
总中断关了,对方给我发数据,我的硬件还是能收到数据的,我也会把RI置1,但是此时就不会产生中断,不会进入中断服务函数了,如果对方马上又给我发了新的1byte数据,用户这时还是没有把总中断打开,刚刚那1byte数据还在SBUF中会被新来的数据覆盖,用户没取走丢掉了。
解决:对方增加重发逻辑。
6、我硬件能力不够,收发速度跟不上
用户竟然选择了系统时钟才2M,我的波特率却被设置成了115200这么大,
此时我的波特率发生器产生的波特率已经不能达到115200了,数据还是能1byte 1byte的发出去,只是就是发出去的数据电平的长度可能不对了,
标准串口每1byte数据 = 1bit起始位+ 8bit数据位+奇偶校验位(1或1.5或2或无)+停止位(1bit),起始电平是低电平,无数据时是高电平。
波特率115200即115200 bit/s,波特率决定了电平0/1的长度,波特率确定了1bit电平的长度就确定了,波特率越大,长度越短。
如果电平长度不对了,对方串口接收器收到这一串电平后经过解析可能就不认为这是一包正确的数据来了,因此丢弃了(底层电路具体是怎么样不是很了解)。
1.外媒谈英伟达-Arm并购案~
2.这里聚焦了全球嵌入式技术风景~
3.航天器、导弹喜欢用单片机?
4.工程师的硬核单片机编程思想~
5.嵌入式开发需要架构设计吗?
6.【技术转管理必备】嵌入式产品的研发流程
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。
文章知识点与官方知识档案匹配
Java技能树首页概览
87773 人正在系统学习中
打开CSDN,阅读体验更佳
串口丢包受什么影响_总结一下曾经在串口方面犯的错误_weixin_39772652的...
串口接收端丢包严重时,如果不是因为明显错误导致,一般都是由于数据传输速度快,主控处理不过来造成的,想办法降低传输速度: (1)波特率: 最直接的方法就是降低波特率,我做过一个小实验,用帧序号来判断丢包情况,当丢包时亮起一盏灯,波特率...
Qt串口QSerialPort丢包问题,QSerialPort和QTimer定时器中断冲突的解决...
1.利用QTimer进行图像显示,每隔一定时间刷新图像 2.另一个线程同步读取串口中IMU的数据 3.测量时间可知,读取串口的线程在QTimer中断时耗时会大幅增加 还有一个问题是QSerialPort丢包。Qt5加入了QSerialPort的串口类,但经常会丢包,例如:...
51系列单片机串口缓存
51系列单片机串口缓存,已测试的单片机包括AT89C55WD、NXP89C669、STC11F60XE; buffer具有互锁机制,完美解决串口中断丢失数据,缓存数据等问题
填一个STC15F单片机串口通信的坑
STC单片机串口通信填坑最近在做个串口通信的案子,双方约定通信波特率为115200,进行过程中,双方按照50Hz频率发送数据包,包长最大30byte,接收时,为了不掉数据,我使用了环形FIFO,数据在串口中断写入,主程序通过读取FIFO来提取数据,使用FIFO读取数据时,为了保证数据可靠性,不能同时写入,所以需要将串口中断暂时关闭语句内容大致如下:{ES=0;语句1,语句2,ES=1}语句1和语句...
继续访问
Qt串口处理数据丢包问题_少安的砖厂的博客_qt 串口数据...
1.将串口类的readyRead信号连接到自定义的readData函数 connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData); 2.readData函数:数据包格式为2位开始位,这个函数中使用有限状态机方法实现开始位判断。
linux嵌入式串口通信丢包,IMX6 Linux系统下串口丢包错包问题研究_墨菲...
无硬件流控串口丢包发生时机点: 处理当前串口中断的CPU被其他中断抢占 IMX6系列CPU,默认的IRQ中断优先级,是中断号小的,优先级高,可以优先处理。所以,如果当串口的数据已经来临,FIFO接受到的数据,已经达到触发中断的阈值,此时应该是产生串口...
51单片机串口打印乱码的解决方法
我使用的是stc的89c52rc型号,晶振是12m。是因为买的最小系统就是这个频率。使用波特率位9600,将TL、TH都设置成0xfd后不管是英文还是中文的都是乱码。
QT串口与51单片机通信
QT串口与51单片机通信 qt与单片机的串口通信 qt与单片机的串口通信 qt与单片机的串口通信
STC51单片机串口下载软件
STC51单片机的高级版本烧录器,包含串口开发助手功能,可选择发送多字节数据
串口通信丢包分析
RS232/RS422/RS485 异步通信通常使用一个UART 来发送和接受数据,用UART 芯片来控制串口的传输。UART芯片内部有一个FIFO缓冲区,用于存储软件驱动程序的输入数据。 FIFO的大小为1、16、64或128个字节,具体取决于UART类型。 FIFO用于通过缓冲数据来提高两个串行端口之间的通信吞吐量。接收和发送FIFO是独立的。 数据流向 (RX) 外部的串口设备-------> UART芯片的FIFO,FIFO数据到达trigger level ,触发中断-...
继续访问
最新发布 对于串口接收数据有丢包如何处理
对于串口接收数据有丢包如何处理
继续访问
单片机串口中断函数中,如果在里面时间过长,后面来的数据会被自动丢弃吗?答案是会丢数。很多串口测试实例上位机发送成功,但是下位机接收失败
单片机串口中断函数中,如果在里面时间过长,后面来的数据会被自动丢弃吗 我来答 分享 举报 2个回答 #热议#夫妻之间该做到绝对坦诚吗? 网络网友b30480f 高粉答主 推荐于2017-09-18·繁杂信息太多,你要学会辨别 关注 不是自动丢弃,而是反复接收,导致后来的数据将先收到、未处理的数据给覆盖了。 例如对方发给你一串0x01、0x02、0x03,假如你中断函数太过磨叽,可能在将0x01从缓冲区中取出后、在处理的过程中又先后收到了0x02、0x03,那么0x03...
继续访问
STM32串口通讯数据丢失原因分析及解决办法
在进行串口通讯实验时,一时不仔细可能会发现通讯不正常,数据丢失的现象,包括丢失第一个字符,或只收到最后一个字符等等,本文接下来将就这类问题展开讨论。 首先是通过MCU向上位机发送数据: 若程序如下图所示, 直接发送数据,由于数据缓冲区(TDR)向移位寄存器发送数据是并行发送,时间较快,而从移位寄存器向外传输数据是串行输出,耗时较长,如此可能导致数据丢失多个,或只接收到最后一个,因为后面并行传输的快,还没等数据发送完成,下一个数据就覆盖住了上一个数据。如此,有两种解决办法;一,添加发送...
继续访问
C51单片机多机串口通信,带数据校验
C51单片机多机串口通信,带数据校验,我自己全部编写的好东西适合你们下载
stc51单片机串口接收多字节数据
stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include "stc8.h" unsigned char flag=0; //定义标志位,用来判断接收了多少个字符 void UartInit(void) //[email protected] { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T
继续访问
51单片机的串口参数
常用模式为模式1和模式3 1. 波特率可变 2. 起始位为1,停止位为1,数据位为8, 3. 模式3可以选择奇偶校验位 ====================================================================== 最近刚好有项目使用到51的串口,整理了一下资料,固先记下,留待后用 模式0: 常用扩展IO 模式1: 波
继续访问
51中断(数据丢失)
51中断在没有执行完的情况下,中断再次发生这时是不会响应第二次中断的。或者说中断使能置没有打开这是来的中断变不会响应。 其实这是一个很明显的问题,只是在写程序的时候,特别遇到多中断处理的程序时便会产生数据的丢失。而且又是很容易被忽略这么简单的问题。
继续访问
单片机串口调试丢包验证过程记录 已解决
单片机串口调试丢包验证过程记录 已解决
继续访问
串口方面犯的错误
串口方面犯的错误 项目虽然做得不算多,但是关于串口的程序倒是写了不少,可能是我太笨了吧,每次写,每次错,错得五花八门,应有尽有,很少能一次性顺顺当当地搞定,更好笑的是有些错误是犯了好几次的,每次找到这样的错误,我都想给自己一个耳光。就在几个小时前,我又犯了一个愚蠢的错误,痛定思痛,这次一定要总结起来,算是给自己敲个警钟吧。 程序逻辑错误 我通常在串口接收中断里进行协议的判断,用不同的状态量来记录接收的情况,当完整地接收到一帧数据时,主控部分就可以对数据进行操作了。 假设要接收的数据协议格式为
继续访问
记一次串口丢包问题排查
1.项目中需要stm32和JN5169做串口通信,经测试大概有千分之一的丢包率。 2.排查步骤: 2.1.去掉关中断的地方 2.2.提高串口中断优先级 2.3.确定非线路问题 2.4.剪除系统,用裸机跑 3.最终发现,是相同优先级的中断抢占了串口中断,导致丢包。 ...
继续访问
关于Qt5 SerialPort串口传输丢失数据问题。
什么是Qt5 serialPort? 虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 Qt5 serialPort存在的问题。
继续访问
串行口数据缓冲寄存器 SBUF 之 初步了解
c52系列的SBUF 有两个缓冲器 写SBUF 的操作完成待发送数据的加载,读SBUF 的操作可获得已接收到的数据。 两个操作分别对应两个不同的寄存器,一个是只写寄存器,一个是只读寄存器 在所有的串行通信方式中,在写入SBUF信号的控制下,把数据装入相同的九尾移位寄存器,前面八位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将1或TB8的值装入移位寄存器的第九位,并进行发送 串...
继续访问
串口丢包
单片机
嵌入式
写评论
评论
10
3
踩
分享
❷ 51单片机与rs485连接电路在串口程序中怎么驱动485在线等!!!谢谢
驱动485有硬件驱动方式和软件方式。
软件方式的话硬件电路比较简单,吧485的2、3脚连在一起,并接在51单片机的一脚上(比如P1_0),单片机发送脚TX接485的DI脚(也就是4脚),单片机的串口接收RX接485的RO脚(1脚)。
默认P1_0为低电平,当发送数据之前先把P1_0置高,发送结束后再置低。