2020年买电子元器件,上唯样商城

51单片机接收数组知识

简介:最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用C语言进行编程,在应用程序中是用 net编程

简介:最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用C语言进行编程,在应用程序中是用.net编程。其中有一个要求是电脑一次发送十个数据,单片机里定义一个数组,接收这10个数据。


可是在进行检验的过程中却发现接收的数据会移位,比如我从电脑中发送的数据是a,b,c,d,e,f,i,j,k,l.那么理论上我在单片机中定义的数组array[10]应该也是array[10]={a,b,c,d,e,f,i,j,k,l.可实际上却不是这样子的,正真接收的数据是array[10]={l,a,b,c,d,e,f,i,j,k,};也就是移了一位,第十位跑到了第一位,第一位到了第二位。之后的就不会再移位,出现这样的原因是因为单片机在一开机的过程中(按下开关),会发送一位ff,有时候会是其它的数据,不论怎么样就是解决不了,也想过把接收的第一位丢掉,可是结果不理想。


我开始在网上找解决的方法,却发现也有人遇到与我的情况一样,网上的版本有好几种(各论坛都你抄我的我抄你的),我都试过,我可以负责任地说,那几种都不行。最让我头大的是一位网友提供方法,却让我浪费了整整一天的时间,他那里口口声声说明了他那种算法可以解决此问题,却最终把我带到了误区。为了让后来的人不再进入些误区,我提供一种我的方法,至少我测试了非常多遍,没有出错过一回。核心的算法是在数据的头和尾都加入一个标致位如你电脑要发送a,b,c,d,e,f,i,j,k,l.,定义头标志位为:@ 尾标志位为:#那们电脑其它要发送12个数据@a,b,c,d,e,f,i,j,k,l.# 但单片机一旦收到@后才真正开始接收数据,到#后停止接收。这种方法能很好解决移位问题。以下是我的源码,仅供参考。




功能:从电脑中接收十个数据,再把这十个数据发送回电脑。


#include


#defineucharunsignedchar


#defineuintunsignedint


staticintcount=0;//数组计数


staticintbegin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中


intflags;//标志位,用到测试用


chararray[10];//数组


chartemp;


uchari,j,flag;


voiddelay(uintn)//延迟作用,不用解释了吧


{


uintx,y;


for(x=n;x>0;x--)


for(y=255;y>0;y--);




}


//串口初始化


voidserial_init()


{


TMOD=0x20;


TH1=0xfd;//9600赫兹


TL1=0xfd;


TR1=1;//开启时间中断


SCON=0x50;//方式2


SM2=1;//可以向cpu请求中断


EA=1;//开总中断


ES=1;//开串口中断


}


voidputchar(ucharch)//发送数据,不用解释了吧


{


SBUF=ch;


while(!TI);


TI=0;


}


voidmain()


{




serial_init();


while(1)


{


delay(500);


if(flags==1)


{


putchar(array[0]);


putchar(array[1]);//验证测试


putchar(array[2]);


putchar(array[3]);


putchar(array[4]);


putchar(array[5]);


putchar(array[6]);


putchar(array[7]);


putchar(array[8]);


putchar(array[9]);




delay(500);




}


}


}


voidSerial()interrupt4


{


RI=0;


temp=SBUF;


if(temp=='@'||begin==1)//如果是@,则接下来的数据都是要接收的,如果begin是1也表示是要接收的


{


begin=1;


if(temp!='@')因为@是标致位,所以我们是要丢弃的


{


if(temp!='#')


{


array[count]=temp;


count++;


}


elseif(temp=='#')//停止位


{


begin=0;


count=0;


flags=1;


}


}


}


}


THE END
免责声明:本文为网友转载文章,转载此文目的在于传递更多信息,版权归原作者所有,与平台无关。本文所用视频、图片、文字如涉及作品版权问题,请电话或者邮箱(marketing@oneyac.com )联系小编进行侵删。
30元新人礼待领取
资讯排行榜
  • 日排行
  • 周排行
  • 月排行
原厂授权品牌

更多授权品牌 >>

热卖元器件
编号 库存
AXE650124D 75,000
BSC190N15NS3 G 5,000
PA2512FKE7W0R001E 28,000
AO3401A 798
TAJD107K016RNJ 5,540
1759513-1 11,357
2294415-1 965
SPP17N80C3 500
SM91502ALE 1,600
GD32E103C8T6 1,500
热门标签