×
单片机 > 单片机程序设计 > 详情

51单片机串口通讯接收一串字符串

发布时间:2020-06-18 发布时间:
|

在51单片机中,我们使用上下位机时,我们通常会发送一串字符串,将它作为信号发给单片机处理。


因为串口通信时,发送信息是以一个个字符的形式发送过来的,所以接收的就是一个个字符,通常我们是一个字符数组保存,在进行下一步处理,同时字符数组长度固定有限,但是如果上位机发送的字符不满足我们想要处理的数据时,其接收的数据多出的部分就有可能保存在SBUF中, 影响接下来的数据接收,以至于接下来的数据不满足我们的要求。或是发送数据少于数组长度时,也会出错。


在这里我的解决办法(以下以STC12C5A60S2芯片为例):


void serial_port_one_init()

{                       //根据自己单片机设置;


    //22.1184M   波特率: 115200

    SCON = 0x50; 

    BRT = 0xFA;

    AUXR |= 0x04;

    AUXR |= 0x01;

    AUXR |= 0x10;

   ES      =   1;    

   EA      =   1;    

}                    


#define Data_SIZE 10 //数据长度   9位数据 +  /r/n  -  /n =10位


char RevBuf[Data_SIZE];      //数据接收缓冲区

char temp[Data_SIZE];        //防数据抵消缓冲区

unsigned char flished_flag=0; //数据接收符合要求标志

int data_count=0;    //数据长度

int temp_length;    //数据长度

int data_flished_count = 0;  //

char data_flished;           //


void UART_one_Interrupt_Receive(void) interrupt 4

{  

    uchar temp;

  if(RI==1)

    {

        RI=0;

        temp=SBUF;

//        senduart(temp);  //用来测试过数据接收是否正确

        

        if(temp!='n') //判断是否接收到结束符

        {

            RevBuf[data_count]=temp;// 否,就存到RevBuf【】数组中

            data_count++;

        }

        else

        {

            temp_length=data_count;//是,记录其数据长度

            data_count=0;

        }

        

    }

    

}              




void main(void)


{


    serial_port_one_init();  //串口初始化


   while(1)


    {


          if(Data_SIZE == temp_length)   //判断数据长度是否满足我们的要求。

        {

            for(i=0;i

            {

                temp[i]=RevBuf[i];             // 同时我们将temp【】作为缓冲区,防止数据被冲到

            }

            flished_flag=1;          //数据接收成功标志

        }


      if(1==flished_flag)  //     数据接收完整成功

        {

            

            wifi_flished_flag=0;  //


           //


           //你想要实现的功能


/*


switch(temp[1]) //我常把数据第一位或前几位作为指令,后几位作为数据,你也可以把整个发送的数据就作为指令。


{


case 'A' :


//具体操作


break;


}


         */


        }


    }


  while(1);


}


同时某些特殊情况,我们会将数据写成:数据头+数据   


分析数据头,实现其代表的功能


上位机中 要在发送数据的最后加上 ‘/n’这个字符


用串口工具测试时, 发送数据为:数据+enter键(其代表的是两个字符 /r /n)


关键字:51单片机  串口通讯  接收  字符串


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用Atmega 16单片机驱动字符型液晶显示芯片