单片机串口接收字符串出错解决方法

来源:本站
导读:目前正在解读《单片机串口接收字符串出错解决方法》的相关信息,《单片机串口接收字符串出错解决方法》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机串口接收字符串出错解决方法》的详细说明。
简介:本文主要讲了单片机串口接收字符串出错解决方法,下面一起来学习下:

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

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

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

void serial_port_one_init()

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

//22.1184M ?? 115200???

SCON = 0x50; //8???,?????

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; //

//

//你想要实现的功能

}

}

while(1);

}

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

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

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

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

提醒:《单片机串口接收字符串出错解决方法》最后刷新时间 2024-03-14 00:53:25,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机串口接收字符串出错解决方法》该内容的真实性请自行鉴别。