① SBUF的详细介绍!(51单片机)
这个不好讲...有两个SBUF...但地址是一样的...一个只能写,不能读...另一个只能写,不能读...但用的时候不用管它只管读就好了
② 8051单片机的串行口控制寄存器中有2个中断标志位 它们是什么和什么
8051单片机的串行口控制寄存器中有2个中断标志位 它们是RI和TI。TI是发送中断标志,RI是接收中断标志。标准51有5个中断向量(不算复位),分别是外部中断0,定时器0,外部中断1,定时器1,串行口;总共有6个中断标志,串行口的发送和接收共享一个中断向量。
(2)51单片机串口寄存器扩展阅读:
作用:SCON寄存器用来控制串行口的工作方式和状态,可以位寻址在复位时所有位被清零,字节地址98HPCON主要是为CHMOS型单片机的电源控制设置的专用寄存器,单位地址87H,不能位寻址,最高位SMOD,为波特率选择位。
8051单片机是PC 机的CPU 是基于冯诺伊曼的体系结构。单片机的存储器配置:
1、 一个8 位的微处理器(CPU)。
2、 片内数据存储器RAM(128B/256B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供1K 的RAM。
3、 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出。
4、 五个中断源的中断控制系统。新推出的单片机都不只5 个中断源,例如SST89E58RD 就有9 个中断源。
5、 一个全双工UART(通用异步接收发送器)的串行I/O 口,用于实现单片机之间或单机与微机之间的串行通信。
6、 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为12MHz。SST89V58RD 最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
参考资料来源:网络_8051单片机
③ 51单片机有串口吗
51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双陵清工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。
串口可以有底下四种工作方式
1、方式0
串行接口的工作方式0为移位寄存器I/O方式。在串行口外接移位寄存器以扩展I/O接口,也可以外接串行同步I/O的设备。
(1)方式0输出
串行口以方式0发送时,数据以RXD端串行输出,TXD端输出同步信号。当一个数据写入串行口发送缓冲器以后,就启动串行口发送器以振荡频率的十二分之一的波特率,将数据从RXD端串行输出。
(2)方式0输入
当串行口定义为方式0并置位REN后,便启动串行口以方式0接收数据,此时RXD端为数据输入端,TXD端为同步脉冲信号输出端。接收器以振荡率的十二分之一的波特率接收RXD端输入的数据信息。但接收器接收到8位数据时,置1中断标志RI。
2、方式1
串行接口定义为工作方式1时,则被控制为8位的异步通讯接口,传送一帧信息为10位,其中1位为起始位,8位数据位(先低位后高位),1位停止位。
(1)方式1输出
串行接口以方式1发送时,数据由TXD端输出。CPU执行一条数据写入发送缓冲
器SBUF的指令(例如,MOVSBUF,A),数据字节写入SBUF后,便启动串行口发送器发送,发送完一帧信息,置1放送中断标志TI。
(2)方式1输入
串行口以方式1接收时,数据从RXD端输入。在REN置1以后,就允许接收器接收。接收器以所建立的波特率的16倍分频计数器,以便实现时间同步。计数器的16个状态把一位的时间等分成16份,在每位时间的第7、8和9个计数状态,位检测器采样RXD的值,接收的值是3次采样中取至少二次相同的值,以排除噪声的干扰。如尺历前果在起始接收的值不是0,则起始位无效,复位接收电路。在检测到另一个1到0的跳变时,再重新启动接收器。如果接收到值为0,起始位有效,则开始接收本帧的其余信息。当RI=0并且接收到的停止位为1(或SM2=0)时,停止位进入RB8,接收到的8位数据进入接收缓冲器SBUF,置位RI中断标志。接着接收便搜索另一帧信息的起始位。
3、方式2和方式3
串行接口工作方式2和方式3时,则被定义为9位的异步通信接口。传送一帧信息为11位,其中1位起始位,8位数据位(从低位至高位),1位是附加的可程控为1或0的第9位数据,1位停止位。
方式2和方式3的差别仅仅在于波特率不一样,方式2的波特率是固定的,波特率为2SMOD/64(振荡频率);方式3的波特率是可变的,波特率=2SMOD/32(T1的溢出率)。
方式2和方式3在发送和接收时唯一的区别就是波特率不同烂仔。
(1)方式2和方式3发送
方式2或方式3发送时,数据由TXD端输出,发出一帧信息为11位,附加的第9位数据是SCON中的TB8,CPU执行一条数据写入发送缓冲器SBUF的指令,就启动发送器发送,发送完一帧信息,置“1”TI中断标志。
(2)方式2和方式3接收
串行口被定义为方式2或方式3接收时,数据从RXD端输入,置REN=1以后,开始接收过程。当检测到RXD端从高到低的负跳变时,确认起始位有效,开始接收本帧的其余信息。在接收完一帧信息后,在RI=0、SM2=0时,或接收到第9位数据为“1”时,8位数据装入接收缓冲器,第9位数据装入SCON中RB8,并置RI=1。若不满足上述的两个条件,接收到的信息将会丢失,也不置位RI
④ 51单片机串口发送“”是怎么回事
一、51单片机串口概念
1、51单片机的串行口
51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能。
2、51单片机的硬件连接
简单双向串口通信有两根数据通信线:
发送端TXD(Transmit Data)
接收端RXD(Receive Data)
TXD和RXD要交叉连接
3、51单片机串口通信的基本结构
51单片机的串行口主要是由两个独立的串行数据缓存器SUBF(一个发送缓存寄存器,一个接收缓存寄存器)和发送控制器、接收控制器、输入移位寄存器及若干控制门电路组成。串行口的基本结构如图所示:
关于SUBF:串口数据缓存寄存器,物理上是两个独立的寄存器,但是占用相同的地址。写操作时,写入的是发送寄存器;读操作时,读出的是接收寄存器。
①:接收端:数据通过RXD接收引脚,再通过移位寄存器将数据转存到接收寄存器中
②:发送端:讲数据从发送寄存器中移出,通过TXD发送引脚将数据发送出去
③:波特率:通过设置定时器1的初值,获取T1溢出率,通过SMOD模式的设置求取波特率
④:中断:通过发送中断标志位或接收中断标志位是否被置位,判断是否进入串口中断程序,在接收数据完成后,会将RI置位,产生一个接收中断;在发送完成后,会将TI置位,产生发送中断
4、传播速率——比特率
比特率是指每秒传送的比特(bit)数。单位为bps(bit per second)也可表示为b/s,比特率越高,单位时间传送的数据量(位数)越大。
5、波特率
在串口通信中,收发双方对发送或接收数据的速率有约定,即双方要有相同的波特率,我们可以通过编程对单片机串行口设定4中工作方式:
其中,T1的溢出率 = 1/T1溢出的时间
①:关于定时器1方式的选择
在说选取定时器1方式之前插一句:这里的定时器1方式2不是串口那4中方式中的方式2;
在学习定时器的相关知识的时候,我们知道定时器有4种不同的工作方式,在串口通信的实验中,我们选择的是定时器1的工作方式2;
定时器T1工作于方式0:溢出所需周期数=8192-x
定时器T1工作于方式1:溢出所需周期数=65536-x
定时器T1工作于方式2:溢出所需周期数=256-x
为什么不选择定时器1的工作方式1:
如果我们使用定时器1的工作方式1在中断中装初值的方法来T1溢出率的话,在进入中断、重装值、出中断这个过程中很容易产生时间上的微小的误差,当多次操作时微小的误差不断累积,终会产生错误;
为什么选择定时器1的工作方式2:
因为方式2为自动重装初值的8位定时器/计数器模式(自动重装载就是在定时器溢出后自动装入设定的初值,这样的好处当然是显而易见的,不需要在中断服务器里手动赋值了,所以可以精确的定时)所以用它来做波特率发生器最恰当。
②:波特率的计算
在上面介绍串口四种方式的时候提到了波特率的计算公式,由公式可以看出,串口方式0和方式2的波特率是固定的;方式1和方式3的波特率是可变的(根据定时器T1的溢出率来控制)
话不多说,根据题来理解:
根据已知波特率,如何计算定时器1方式2下计数寄存器中的初值:
已经波特率 = 9600,系统的晶振频率 = 12Mhz,求给TH1和TL1的初值:
由此可见,当系统的晶振频率为12Mhz时,定时器的初值不是整数;经过计算可得,当晶振频率为11.0592Mhz时,(256-x) = 3;
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
6、波特率与比特率关系与区别
码元:在数字通信中常常用时间间隔相同的符号来表示一个 二进制数字 ,这样的时间间隔内的信号称为 (二进制)码元。
在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。即波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示。每秒钟通过信道传输的信息量称为位传输速率,简称比特率。比特率表示有效数据的传输速率。波特率与比特率的关系是比特率=波特率X单个调制状态对应的二进制位数。波特率是传输通道频宽的指标。
二、串口通信有关寄存器
1、数据缓存寄存器
SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2、电源寄存器PCON
该寄存器是用来管理单片机的电源部分,包括上电复位检测,掉电模式,空闲模式等
在串口通信中,我们仅仅需要关注SMOD这一位
SMOD = 0且串口方式为1、2、3时,波特率正常
SMOD = 1且串口方式为1、2、3时,波特率加倍
3、状态寄存器SCON(98H)
SM0 SM1:工作方式选择位,串行口有四种工作方式,他们由SM0和SM1设定,其对应关系表如下:
SM2:多机通信时的接收允许标志位
REN:允许串行接收位
TB8,RB8:发送接收数据的第9位,当串口工作于方式2或3 时使用到,指向的是串行传输的第9位数据;
1)SM2=0,在方式2或3下,TB8、RB8 发送与接收第9位奇偶校验位;
2)SM2=1,多机通信时的接收允许位,并且在方式2或3下工作;
TI:发送中断标志位,在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由其内部硬件使TI置1,向CPU发出中断申请。在中断服务程序中,必须用软件将其清 0,取消此中断申请。
RI:接收中断标志位,在方式0时,当串行接收第8位数据结束时,或在其他方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发出中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。
三、串口通信代码
串行口在工作之前,应对其进行初始化,主要是设置产生波特率的定时器1,串行口控制和中断控制。
void usart_init()
{
TMOD = 0x20; //选择定时器1的工作方式2
TH1 = 0xF3; //通过设置定时器1的初值来选择波特率
TL1 = 0xf3;
TR1 = 1; //打开计数器
SCON = 0x50; //0101 0000
PCON = 0x80;
ES = 1; //打开通信中断 ①
EA = 1; //打开总中断 ②
}
或者
void usart_init()
{
TMOD = 0x20;
TH1 = 253;
TL1 = 253;
TR1 = 1;
SM0 = 0;
SM1 = 1;
// REN = 1
// EA = 1;
// ES = 1;
}
在编写串口发送端程序时,无需用到接收数据和中断服务函数,所以REN、EA、ES不需要对他们进行操作
⑤ 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
踩
分享