单片机串口通信程序 PC发送一段任何数据到单片机,按一个按钮让原数据再返回给PC机!我写的程序出了问题!

比如我发的是310.10A210结果回来的数据只是10!好像是SBUF只能传输一个字节,应该是用数组先把数据存起来,再用单片机一个一个回给PC机!思路是这个,可是我写了好久都没写的出来!大家帮帮忙!
我这个是先把PC机传输过来的数据存到AT24c02,然后按按键再把数据从24C02里面提取出来传送给PC机!
void main()
{
uchar b,i;
init();
b=read_add(1);
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
if(key==0)
{
delay1(5);
if(key==0)
{
while(!key);
for(i=0;i<num--;i++)
{
b=read_add(i);//读取I页的数据
SBUF=b;//发送给PC机
while(!TI);
TI=0;
}
}
}
if(flag==1)
{
flag=0;
write_add(num,table[num]);//将num的数据写进AT24c02的num页
num++;
}

}
}

void t1() interrupt 4
{
if(RI==1)
{
a=SBUF;//PC机发送过来的数据赋值给a
RI=0;
table[num]=a;//将a赋值给数组
flag=1; //标志位
}
前面的一些AT24c02起始,终止子函数,字数不够了就没写进来!
这个函数PC机得到的数据时01 02 02 03 03 04 04 05 05 06 06 07 07 08 08 09 09 0A 0A 0B 0B 0C 0C 0D 0D 0E 0E 0F 0F 10 10 它会按一下加一。一直到7F又重新开始!

不要误人子弟,PC机往单片机每次可以发送任意个数据,MCU接收时候处理一下就OK了,
下面是我的程序,给你参考。

//中断方式接收PC机数据
/*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
设计思路
接收到的数据存入到dat[50]数组中,
中断方式接收,每次中断接收后,开启定时器,
*/////////////////////////////
//
//陈仲库

#include <reg51.h>
#include <stdio.h>

int dat[20];
unsigned char num=0;
int time=0;

bit MCU_RXD_FLG=0;

void COM_Init(void)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
PCON |= 0x80;
TH1 = 0xFD;
ES=1;EA=1;
TR1 = 1;
TI = 1;

TH0=0xfc; //T0定义初始值
TL0=0x18;
TR0=0; //关闭T0计时
ET0=1;
}

//向串口发送一个字符
void MCU_TXD(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

//串口接收中断函数
void serial () interrupt 4 using 3
{
EA=0;
if(RI)
{
unsigned char ch;
TR0=0; time=0;
RI = 0;
ch=SBUF;
dat[num++]=ch;
TR0=1;
}
EA=1;
}

delay(int t){while(t--); }

/* PC发送数据必须以0XAA开头和以 0X55结束(帧头帧尾)*/
void main(void)
{
int i=0;

COM_Init();
while(1)
{
if(MCU_RXD_FLG)
{
EA=0;
TR0=0;
if(dat[0]==0xAA && dat[num-1]==0x55)
for(i=0;i<num;i++) printf("%0x ",dat[i]);
num=0;
MCU_RXD_FLG=0;
EA=1;
}
}
}

void timer0() interrupt 1 //T0中断 定时0.1ms
{
EA=0;
TH0=0xfc;
TL0=0x18;
MCU_RXD_FLG=1;
TR0=0;
EA=1;
}

关于AT24C02程序网上多的是,很成熟的程序

OK希望对你能有帮助追问

这个程序是怎么处理的啊?可以具体的讲解一下吗?还有就是数据时随意发送的,不要: PC发送数据必须以0XAA开头和以 0X55结束(帧头帧尾)这样的!麻烦你就写一个PC机发送一段数据给单片机,按个按钮然后再一下子返回给PC机吗?

追答

一般如果不用校验BCC或其他奇偶校验的话,最好加上帧头帧尾,以确保数据准确接收。
按你的要求,程序修改为:

/* PC发送数据必须以0XAA开头和以 0X55结束(帧头帧尾)*/
void main(void)
{
int i=0;

COM_Init();
while(1)
{
if(MCU_RXD_FLG)
{
EA=0;
TR0=0;
if(key) for(i=0;i<num;i++) printf("%0x ",dat[i]);
num=0;
MCU_RXD_FLG=0;
EA=1;
}
}
}

网上下载一个串口助手,就可以调试了。

追问

这个我已经好了,现在就是单片机接收的数据,被我装在一个数组里面,怎么把这些数组写入到AT24C02里面,然后再读出去,是不是要用到页写入帧格式啊?到底怎么写程序呢,大概的思路可以告诉我吗?

追答

关于AT24C02网上程序多的很,
相信聪明的你,一看就明白。

我有程序在家里,很久很久以前调试过

参考资料:http://zhidao.baidu.com/team/view/%E5%8D%95%E7%89%87%E6%9C%BA-CAN

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-15
单片机可以一次发多个数据,但是pc一次只能发一个数据单片机方能接收。我想这是你问题的所在,不行的话可以把程序拿出来看一下。
相似回答