历史上的今天
今天是:2025年05月14日(星期三)
2019年05月14日 | 51单片机串口通讯接收一串字符串
2019-05-14 来源:eefocus
在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)
史海拾趣
|
移植网卡驱动 读DM9000 ID的问题 有做过的进来帮忙看看 读出的ID总不对 平台2440 DM9000 接片选4 #define BSP_BASE_REG_PA_DM9000_IOBASE 0x20000300 DNW输出如下: ...… 查看全部问答> |
|
巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复杂技术难题, 同时也您企业减少一些不必要的人力成本. 巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复 ...… 查看全部问答> |
|
大家好: 小弟画了一块板子,现在PCB布线已经搞好,就差覆铜了,不规则覆铜,就是在顶层需要覆铜的地方才覆,不需覆铜的地方不覆,这样板子上覆铜的边缘就不是直线了,请问怎样实现不规则的覆铜,怎样设置,如何操作才能 ...… 查看全部问答> |
|
各位大哥大姐: 小弟最近在设计方案,涉及到两块板子的通信问题。 要求两块板的电源,地完全隔离;能够进行数据通信,通信距离在10米至30米。 小弟我苦思几天,通信不过就如下几种: 232,485,CAN,红外。但好像这 ...… 查看全部问答> |
|
大家好,请问各位两个问题 我用18f97j60的网络,采用TCP/IP协议栈的v4.51版本 1.在GenericTCPServe这个demo的基础上修改,因为接收不是中断的,所以每次检测到接收FIFO的大小大于我定义的包头大小时,开始解析包头,然后 根据包头定义的数据长度 ...… 查看全部问答> |
|
本视频为\"FRAM MSP430 优势产品揭示\"的下半部分。在上半部分我们着重介绍了FRAM非易失性存储器的新特点和性能优势。这里将深入探讨一下 MSP430FR57xx 系列器件的架构和核心模块以及FRAM的实际应用情况。 如想了解更多信息,请访问 www.ti.com/fra ...… 查看全部问答> |
|
在飞凌S5PV210开发板上移植U-Boot 的过程主要包括以下四个步骤:1.下载U-Boot源码2.修改相应的文件代码 3.编译U-Boot4.烧写到开发板上,运行U-Boot是universal bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在开机上点 ...… 查看全部问答> |




