如何实现单片机 串口接受不同长度氛数据

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位的有效数据,一次传输一个帧就会产生一个中断,来对数据进行处理。

  那么以上就是本人对串口的一点点小理解,其实串口通讯的内容还是有不少的,这里只是单单讨论它的通讯原理。

以上是关于如何实现单片机 串口接受不同长度氛数据的主要内容,如果未能解决你的问题,请参考以下文章

使用C#实现串口通讯,接受和控制单片机。

CC2530开发模块与51单片机如何实现串口通信

单片机串口rx接受完数据后还会拉低

在用单片机接受串口数据的时候,第一位是0x0A

单片机串口怎么接收超过255字节的数据,数组只能存放255字节,有啥方法可以实现不间断的接收

单片机编程中 如何清除串口接收寄存器中的值,即清除SBUF中的值