如何实现单片机 串口接受不同长度氛数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现单片机 串口接受不同长度氛数据相关的知识,希望对你有一定的参考价值。
串口接收数据的时候 接收一个字节进入一次中断,此时SBUF寄存器里面存放的是接收的数据,只要把SBUF里面的数据取出来就可以了,同时中断里要把RI清零,以便下次进入中断接收数据,
上面数据的是一个字节一个字节的接收数据, 接收一串数据,有成一帧数据的时候,怎么接收呢
。定义一个足够长的数组,比如 一帧数据 最长会有20个字节,那么定义的数组长度,要大于等于20 ;
定义一个计数变量,在中断里 对接收的数据进行计数 ; 例如
void interruptUartS1() interrupt 4
if(RI)
RI = 0;
bufS1Rxd[cntS1Rxd++] = SBUF;
idletmrS1 = 0;
if(TI)
TI = 0;
flagS1Txd = 1;
bufS1Rxd 就是定义的一个数组,用于存放数据, cntS1Rxd 就是计数变量,用于记录接收的数据长度,
3,。那么如何判断一帧数据什么时候接收完毕呢 , 这里就用到了idletmr这个变量,,这个就是在定时器中端里 不停的累加的一个计时变量,,定时器初值1ms 累加一次就是1ms 的时间, 一般是判断间隔30ms左右的时间 没有接收数据,那么 就表示一帧数据接收完毕,,,这个间隔时间跟波特率有关的,,因为,,波特率就是数据传输的速度,,,
void interrupttimer0() interrupt 1
static uint16 t = 0;
t++;
if(t >= 1000)
t = 0;
if(idletmrS1 < 10)
idletmrS1++;
if(idletmrS1 >= 10)
CmdArrivedS1 = 1;
上面就是定时器中断的内容, 采用的是16位自动重装模式,是STC15系列单片机独有的定时器模式, 我这里是9600的波特率,10ms没有接收数据就会把 CmdArrived 这个标志位置1 ,用此判断 已经一帧数据接收完毕, 如果在10ms以内接收到数据,就会把idletmr清零,重新计时的
4, 一般防止干扰引起的数据错误,会加入校验位,这里有奇偶校验,CRC校验== ,很多校验方式, 一般采用CRC校验,,还有更简单的和校验,, 和校验就是把一帧数据中的不是校验位的数据 累加起来,取和的低8位,这个就是和校验的高字节,,和校验的低字节就是 高字节的补码‘
以上就是简单的介绍些一帧数据的接收原理,,
实际应用中, 还会有加入固定数据 进行判断,==之类的校验,,都是防止数据被干扰
参考技术A 只要在发送的开始给一个通知就行了,比如发送的第一个字节就是通知接收端,下面要发送的数据长度。本回答被提问者采纳stm32-浅谈串口
额!!!今天谈谈串口通信,其实我们都清楚,计算机工作的本质就是数据的交流,在CPU方面,数据从内存流入CPU进行处理,然后把处理后的数据流向输出设备等等,当然这种方式是不需要用到串口的;串口一般用于不同设备之间的通讯,所谓通讯,也就是数据的交流,比如单片机向PC要传送一段数据,那么这段数据是怎么发送和接受的?那么这两种设备就像两个不同国家的人,他们是怎么明白对方的意思呢?1硬件接口:也就是串行接口,有三根线,分别是地线,接受线,发送线,这种传输介质的规定就好像这两个外国人是使用口语,还是手语交流。2通讯协议:这个协议主要是规定传输数据的速率和方式,这样接受方才能获得正确的信息,这种传输方式的规定就像俩个外国人约定使用中文交流,还是英文交流。
同一种语言其实还有不同的方言,那么方言也要统一才能听懂,所以只有配置相同的波特率,数据位,校验位,停止位等才能算是同一种方言(代码配置开发板,串口调试助手配置PC),经过这样的约定,双方就可以进行交流了。
我们知道串口是一位一位的传输的,一般一个数据帧有8位的有效数据,一次传输一个帧就会产生一个中断,来对数据进行处理。
那么以上就是本人对串口的一点点小理解,其实串口通讯的内容还是有不少的,这里只是单单讨论它的通讯原理。
以上是关于如何实现单片机 串口接受不同长度氛数据的主要内容,如果未能解决你的问题,请参考以下文章