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

比如我发的是310.10A210结果回来的数据只是10!好像是SBUF只能传输一个字节,应该是用数组先把数据存起来,再用单片机一个一个回给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又重新开始!
展开
 我来答
巨季雅d0
2011-03-16 · TA获得超过1365个赞
知道小有建树答主
回答量:1101
采纳率:0%
帮助的人:625万
展开全部
不要误人子弟,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;
}
}
}

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

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

shenhao7752376
2011-03-15 · 超过12用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:27.9万
展开全部
单片机可以一次发多个数据,但是pc一次只能发一个数据单片机方能接收。我想这是你问题的所在,不行的话可以把程序拿出来看一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式