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

在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<Wifi_Data_SIZE;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)



  • 26
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值