历史上的今天
返回首页

历史上的今天

今天是: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)


推荐阅读

史海拾趣

Dolphin Interconnect Solutions Asa公司的发展小趣事

在全球化的背景下,Dolphin Interconnect Solutions ASA积极实施国际化战略。公司不仅在欧美等发达国家建立了完善的销售网络,还通过参加国际展会、举办技术研讨会等方式,提高了品牌知名度和市场影响力。同时,Dolphin还加强了与国际知名企业的合作,共同推动电子行业的发展。

ATOP_Technologies公司的发展小趣事

面对未来,ATOP Technologies制定了明确的战略规划。公司将继续加大在研发和创新方面的投入,推动产品向高端化、智能化方向发展。同时,ATOP Technologies还将积极拓展新的应用领域和市场渠道,寻求更多的合作伙伴和机会。此外,公司还将注重人才培养和团队建设,为公司的长远发展奠定坚实的基础。

这些故事只是ATOP Technologies发展历程中的一部分,每个故事都反映了公司在不同阶段的努力和成就。然而,由于具体细节可能涉及公司内部信息,因此我无法提供更为详细和具体的故事内容。如需了解更多关于ATOP Technologies的信息,建议查阅相关新闻报道或公司官方资料。

Condor公司的发展小趣事

随着技术的不断进步,ATOP Technologies意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新和产品升级。因此,公司加大了在研发方面的投入,积极引进高端人才,加强与高校和研究机构的合作。经过多年的努力,ATOP Technologies成功开发出了一系列具有自主知识产权的工业自动化产品,并在市场上取得了良好的口碑。

Emmoco公司的发展小趣事

在追求经济效益的同时,Emmoco也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,Emmoco还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了Emmoco的社会责任感,也为公司的长期发展奠定了坚实的基础。

Frequency Electronics Inc公司的发展小趣事

高频电子的业务范围广泛且多元化,主要包括FEI-NY、Gillam-FEI和FEI-Zyfer三个部门。FEI-NY部门主要负责纽约总部设施和子公司FEI-Asia与FEI-Elcom的运营;Gillam-FEI部门则负责比利时与法国的业务,并专注于电缆网络同步产品的设计、研发和生产;FEI-Zyfer部门则主要经营公司加州业务,并设计生产附带GPS技术的产品。这种多元化业务布局不仅降低了公司的经营风险,还实现了各业务之间的战略协同和资源共享。

BOWEI公司的发展小趣事

为了进一步扩大市场份额,高频电子积极实施全球化战略。公司在全球范围内建立了销售网络和服务体系,与众多国际知名企业建立了长期合作关系。同时,高频电子还针对不同地区的市场需求,定制化开发符合当地标准的产品和服务。这些努力使得高频电子的产品和服务能够覆盖全球多个国家和地区,为公司带来了稳定的收入来源和持续增长的动力。

问答坊 | AI 解惑

移植网卡驱动 读DM9000 ID的问题 有做过的进来帮忙看看

读出的ID总不对       平台2440  DM9000  接片选4 #define BSP_BASE_REG_PA_DM9000_IOBASE           0x20000300 DNW输出如下:      ...…

查看全部问答>

ROM 隐藏文件问题

有个exe在系统中是隐藏属性的,无法通过ActiveSync复制出来,有人有办法吗。最近在研究这个,大家来讨论下。…

查看全部问答>

巴山工作室,为您解决技术难题和提供技术服务.

   巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复杂技术难题,    同时也您企业减少一些不必要的人力成本.        巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复 ...…

查看全部问答>

protel99se 覆铜

大家好:      小弟画了一块板子,现在PCB布线已经搞好,就差覆铜了,不规则覆铜,就是在顶层需要覆铜的地方才覆,不需覆铜的地方不覆,这样板子上覆铜的边缘就不是直线了,请问怎样实现不规则的覆铜,怎样设置,如何操作才能 ...…

查看全部问答>

侃侃我的成果

本人长期从事单片机开发应用,积累了一定的经验。本人将毕生研究心得集成了文字,放在我的博客里,希望大家光临指导,并给点意见。我的博客地址;http://blog.mcuol.com/user/Article/500.html…

查看全部问答>

【求助】远程通信问题

    各位大哥大姐:    小弟最近在设计方案,涉及到两块板子的通信问题。 要求两块板的电源,地完全隔离;能够进行数据通信,通信距离在10米至30米。 小弟我苦思几天,通信不过就如下几种: 232,485,CAN,红外。但好像这 ...…

查看全部问答>

求助pic18f97j60 TCP/IP协议栈v4.51

大家好,请问各位两个问题 我用18f97j60的网络,采用TCP/IP协议栈的v4.51版本 1.在GenericTCPServe这个demo的基础上修改,因为接收不是中断的,所以每次检测到接收FIFO的大小大于我定义的包头大小时,开始解析包头,然后 根据包头定义的数据长度 ...…

查看全部问答>

TI FRAM MSP430 优势产品揭示 (下)

本视频为\"FRAM MSP430 优势产品揭示\"的下半部分。在上半部分我们着重介绍了FRAM非易失性存储器的新特点和性能优势。这里将深入探讨一下 MSP430FR57xx 系列器件的架构和核心模块以及FRAM的实际应用情况。 如想了解更多信息,请访问 www.ti.com/fra ...…

查看全部问答>

【飞凌OK210开发板】【UBOOT】【移植】步骤

在飞凌S5PV210开发板上移植U-Boot 的过程主要包括以下四个步骤:1.下载U-Boot源码2.修改相应的文件代码 3.编译U-Boot4.烧写到开发板上,运行U-Boot是universal bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在开机上点 ...…

查看全部问答>