如何用c语言编程实现c51单片机中从串口接收一个字符串?
现已用c语言编程实现从c51单片机从串口接收一个字符,但是如果要接收字符串似乎还有些问题,看网上介绍,好像现在没有一个很好的方案能够实现字符串的接收,是不是这样?如果有具...
现已用c语言编程实现从c51单片机从串口接收一个字符,但是如果要接收字符串似乎还有些问题,看网上介绍,好像现在没有一个很好的方案能够实现字符串的接收,是不是这样?如果有具体方案,请介绍一下,谢谢!
展开
3个回答
展开全部
我只能给你子程序,仅供参考
IE=0x90; //打开中断总开关及串口中断
SCON=0x50; //设定串行口工作方式1,允许接收
TMOD=0x20; //设定时器1,自动装载,产生破特率
TH1=0xfd; //破特率为9600
TR1=1; //启动定时器1
PCON=0x80; //定义SMOD,
发送
while(RI==0) //RI==1;
{
; //等待数据发送完毕
}
RI=0; //手动清零
发送
void disf(unsigned int y)
{
unsigned char i;
DAT[3]=y%10; // ===7
DAT[2]=(y/10)%10; //==8
DAT[1]=(y/100)%10; //==9
DAT[0]=y/1000; //=1
for(i=0;i<4;i++)
{
SBUF=DAT[i];
while(TI==0); //等待数据发送完毕
TI=0; //手动清零
}
}
接收
while{disp();} //无限循环
四位字符,发送
while(key==0);
disp(1949);
for(i=0;i<4;i++)
{
SBUF=DAT[i];
while(TI==0); //等待数据发送完毕
TI=0; //手动清0
}
四位字符,接收 用串口中断
void ck_js() interrupt 4
{
unsigned char i;
for(i=0;i<4;i++)
{
while(RI==0); //等待数据接收
RI=0; //手动清零
DAT[i]=SBUF; //接收到的字符存放
}
}
多位字符 接收函数
void seri_int() interrupt 4
{
count1=0;
if(RI)
{
unsigned int count2=10000;
while(1)
{
flag1=1;
while(!RI)
{
if(count2==0)
{
RI=0;
break;
}
count2--;
}
dat1[count1]=SBUF;
count1++;
RI=0;
}
}
}
IE=0x90; //打开中断总开关及串口中断
SCON=0x50; //设定串行口工作方式1,允许接收
TMOD=0x20; //设定时器1,自动装载,产生破特率
TH1=0xfd; //破特率为9600
TR1=1; //启动定时器1
PCON=0x80; //定义SMOD,
发送
while(RI==0) //RI==1;
{
; //等待数据发送完毕
}
RI=0; //手动清零
发送
void disf(unsigned int y)
{
unsigned char i;
DAT[3]=y%10; // ===7
DAT[2]=(y/10)%10; //==8
DAT[1]=(y/100)%10; //==9
DAT[0]=y/1000; //=1
for(i=0;i<4;i++)
{
SBUF=DAT[i];
while(TI==0); //等待数据发送完毕
TI=0; //手动清零
}
}
接收
while{disp();} //无限循环
四位字符,发送
while(key==0);
disp(1949);
for(i=0;i<4;i++)
{
SBUF=DAT[i];
while(TI==0); //等待数据发送完毕
TI=0; //手动清0
}
四位字符,接收 用串口中断
void ck_js() interrupt 4
{
unsigned char i;
for(i=0;i<4;i++)
{
while(RI==0); //等待数据接收
RI=0; //手动清零
DAT[i]=SBUF; //接收到的字符存放
}
}
多位字符 接收函数
void seri_int() interrupt 4
{
count1=0;
if(RI)
{
unsigned int count2=10000;
while(1)
{
flag1=1;
while(!RI)
{
if(count2==0)
{
RI=0;
break;
}
count2--;
}
dat1[count1]=SBUF;
count1++;
RI=0;
}
}
}
展开全部
可以的,定义一个缓冲区(数组)接收,到时单片机把字符串顺序处理一下就行了,一般/n来代表字符串的结束标志。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果用中断方式接收的话,只能接收单个字符。而如果用查询方式的话,接收字符串占用的时间真太长了,整个CPU将陷入一个长期无法工作的状态,按照波特率为19200来算,接收一个字符的时间是573微秒,十个字符的话就是5.73毫秒了,系统无法正常工作。建议用中断接收单个字符。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询