
写了一个51单片机的串口通讯函数,结果老是收不到上位机发送的字符串的首字母。
题目要求:串口调试助手发送“Z10S03999”表示:点亮LED1,熄灭LED2,同时令LED3闪烁3次,每次亮灭间隔为999毫秒。执行完毕后返回“done”串口调试助手...
题目要求:串口调试助手发送“Z10S03999”
表示:点亮LED1,熄灭LED2,同时令LED3闪烁3次,每次亮灭间隔为999毫秒。执行完毕后返回“done”
串口调试助手发送“Z01S30050”
表示:熄灭LED1,点亮LED2,同时令LED3闪烁30次,每次亮灭间隔为50毫秒。执行完毕后返回“done”
#include <reg52.h>
#include <string.h>
unsigned char a,b,i=0,j=0,word[9],trans[4]="done",order1[9]="Z10S03999",order2[9]="Z01S30050";
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
void delay(unsigned char c) // 延迟函数
{
unsigned char a1,b1;
for(a1=c;a1>0;a1--)
for(b1=110;b1>0;b1--);
}
void init() //串口初始化
{
TMOD=0x20;
TH1=253;
TL1=253;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void play(unsigned char k)// 将收到的数据进行对应处理
{
unsigned char m;
switch(k)
{
case 1: led1=0;led2=1;for(m=0;m<3;m++){led3=0;delay(999);led3=1;delay(999);} break;
case 2: led1=1;led2=0;for(m=0;m<30;m++){led3=0;delay(50);led3=1;delay(50);} break;
}
}
void main()//主函数
{
unsigned char r;
init();
while(1)
{
if(j==9)
{
j=0;
ES=0;
play(b);
for(r=0;r<9;r++)
{
SBUF=word[r];
while(!TI);
TI=0;
}
for(r=0;r<4;r++)
{
SBUF=trans[r];
while(!TI);
TI=0;
}
ES=1;
}
}
}
void RS() interrupt 4
{
RI=0;
word[i]=SBUF;
i++;
if(i==9) //比较收到的字符串
{
i=0;
if(strcmp(word,order1)==0)
b=1;
else if(strcmp(word,order2)==0)
b=2;
}
j++;
}
波特率是9600的,程序该如何修改? 展开
表示:点亮LED1,熄灭LED2,同时令LED3闪烁3次,每次亮灭间隔为999毫秒。执行完毕后返回“done”
串口调试助手发送“Z01S30050”
表示:熄灭LED1,点亮LED2,同时令LED3闪烁30次,每次亮灭间隔为50毫秒。执行完毕后返回“done”
#include <reg52.h>
#include <string.h>
unsigned char a,b,i=0,j=0,word[9],trans[4]="done",order1[9]="Z10S03999",order2[9]="Z01S30050";
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
void delay(unsigned char c) // 延迟函数
{
unsigned char a1,b1;
for(a1=c;a1>0;a1--)
for(b1=110;b1>0;b1--);
}
void init() //串口初始化
{
TMOD=0x20;
TH1=253;
TL1=253;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void play(unsigned char k)// 将收到的数据进行对应处理
{
unsigned char m;
switch(k)
{
case 1: led1=0;led2=1;for(m=0;m<3;m++){led3=0;delay(999);led3=1;delay(999);} break;
case 2: led1=1;led2=0;for(m=0;m<30;m++){led3=0;delay(50);led3=1;delay(50);} break;
}
}
void main()//主函数
{
unsigned char r;
init();
while(1)
{
if(j==9)
{
j=0;
ES=0;
play(b);
for(r=0;r<9;r++)
{
SBUF=word[r];
while(!TI);
TI=0;
}
for(r=0;r<4;r++)
{
SBUF=trans[r];
while(!TI);
TI=0;
}
ES=1;
}
}
}
void RS() interrupt 4
{
RI=0;
word[i]=SBUF;
i++;
if(i==9) //比较收到的字符串
{
i=0;
if(strcmp(word,order1)==0)
b=1;
else if(strcmp(word,order2)==0)
b=2;
}
j++;
}
波特率是9600的,程序该如何修改? 展开
4个回答
展开全部
接收函数中,只有当收到“Z”时,才应该使 i=0;,才开始接收字符串。
另外,主函数发送,等待发送完毕时:while(!TI);,等待的期间,也会出现串口中断,也会收进一个字节到 word[i]=SBUF;。
另外,主函数发送,等待发送完毕时:while(!TI);,等待的期间,也会出现串口中断,也会收进一个字节到 word[i]=SBUF;。
更多追问追答
追问
等待时已经将串口关闭,不会收到数据。
追答
关闭了,就会遗漏此期间串口输入的数据。
展开全部
你的中断函数不对,应该加个判断,因为发送和接受都是一个入口。
void RS() interrupt 4
{
if(RI==1)
{
RI=0;
word[i]=SBUF;
i++;
if(i==9) //比较收到的字符串
{
i=0;
if(strcmp(word,order1)==0)
b=1;
else if(strcmp(word,order2)==0)
b=2;
}
j++;
}
}
void RS() interrupt 4
{
if(RI==1)
{
RI=0;
word[i]=SBUF;
i++;
if(i==9) //比较收到的字符串
{
i=0;
if(strcmp(word,order1)==0)
b=1;
else if(strcmp(word,order2)==0)
b=2;
}
j++;
}
}
更多追问追答
追问
试过了,加和不加都一样,没区别。
追答
void main()//主函数
{
unsigned char r;
init();
while(1)
{
if(j==9)
{
j=0;
ES=0;
play(b);
for(r=0;r<4;r++)
{
SBUF=trans[r];
while(!TI);
TI=0;
}
ES=1;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会不会是因为漏掉了一个'\0',系统定义字符串时的最后一个字符,除了前面的九个。
追问
上位机第一次发送的数据首字符是空的,第二次是九个数只是最后一位变成了首位,如上位机发送两次
“Z10S03999”,下位机接收到的数据是“ Z10S0399done9Z10S0399done”,这又是怎么回事?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
“Z10S03999”,下位机接收到的数据是“ Z10S0399done9Z10S0399done”,这又是怎么回事?
确定硬件没问题么?
确定硬件没问题么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询