51单片机接收数组

   最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
static int count=0;//数组计数
static int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中
int flags;//标志位,用到测试用
char array[10];//数组
char temp;
uchar i, j, flag;
void delay(uint n) //延迟作用,不用解释了吧
{
uint x,y;
for( x = n; x > 0; x--)
for( y = 255; y > 0; y-- );


}
//串口初始化
void serial_init()
{
TMOD = 0x20;
TH1 = 0xfd;  //9600赫兹
TL1 = 0xfd;
TR1 = 1; //开启时间中断

SCON = 0x50;//方式2
SM2 = 1; //可以向cpu请求中断
EA = 1; //开总中断
ES = 1; //开串口中断

void putchar( uchar ch )//发送数据 ,不用解释了吧
{
SBUF = ch;
while( !TI );
TI = 0;
}

void main()
{
 
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);  

}
}
}

void Serial() interrupt 4
{
RI = 0;
temp=SBUF;
if(temp=='@'||begin==1)//如果是@,则接下来的数据都是要接收的,如果begin是1也表示是要接收的
   {

      begin=1;

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

            if(temp!='#')

              {

                array[count]=temp;
                   count++;

               }

             else if(temp=='#')//停止位
                {
                   begin=0;
                   count=0;
                  flags=1;
                }

          }
       }
}

 

这篇文章我是发表在程序员的博客中的(http://blog.csdn.net/Tylerco)因为我不方便直接把我项目中的代码拷贝过来,所以重写了参考例子,也担心会出一些小错误,但通过头尾都加一个标致位的方法绝对错不了。如果有错误,请告诉我,我会亲自再测试一回,及时更新,请其它论坛不要看都不看就转到那里去了,真有错误会使人进入误区的。而那里的错误我却没办法修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值