51单片机串口发送数据
经人指点此程序发送数据没问题,我想先发送askconfig里面的数据;然后等待接受,接受到chuli[]里面,接收完毕和AckconfigP[]里面的数据作比较看是否一样...
经人指点此程序发送数据没问题,我想先发送askconfig里面的数据;
然后等待接受,接受到chuli[]里面,接收完毕和AckconfigP[]里面的数据作比较
看是否一样,要是一样,就发送0x01,0x02,0x03,不一样就等待
#include "STC89C51RC_RD_PLUS.H"
#define uchar unsigned char
#define uint unsigned int
uchar code askconfig[]= {0x4c,0x57,0x01,0x01,0x02,0x0d}; //发送握手
uchar code Ackconfig[]= {0x6c,0x63,0x01,0x06,0x90,0x15,0xd8,0x84,0x0d};
uchar chuli[29];
void System_Init()
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFC;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
void Delay (uint Milliseconds)//延时2ms,
{
uchar a,b;
for(a=3;a>0;a--)
{
for(b=245;b>0;b--)
for (; Milliseconds > 0; Milliseconds--);
}
}
void SendChar (uchar chr)//发送一个字符
{
SBUF = chr;
while(!TI);
TI=0;
}
char Handshake (void)
{
uchar i,j,k;
j=0;
Delay(50000);
Delay(50000);
for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(RI)
{
chuli[j]=SBUF;
RI=0;
j++;
if(j==9)
{
for(k=0;k<10;k++)
{
if(chuli[k]!=Ackconfig[k]) //检测握手反馈值是否正确
break;
}
if(k!=10)
return 0;
else
return -1;
}
}
}
void main()
{
System_Init();
Delay(200);
while(1)
{
if(Handshake ())
{
Delay(50000);
Delay(50000);
SendChar(0x01);
Delay(50000);
Delay(50000);
SendChar(0x02);
Delay(50000);
Delay(50000);
SendChar(0x03);
}
}
}
这个程序用串口调试助手接收到4c 57 01 01 02 0d 01 02 03
我还没发送数据,就出现了01 02 03,不知道问题出在哪儿
在while(RI)前面加了一个while(!RI);不过还是有点问题 展开
然后等待接受,接受到chuli[]里面,接收完毕和AckconfigP[]里面的数据作比较
看是否一样,要是一样,就发送0x01,0x02,0x03,不一样就等待
#include "STC89C51RC_RD_PLUS.H"
#define uchar unsigned char
#define uint unsigned int
uchar code askconfig[]= {0x4c,0x57,0x01,0x01,0x02,0x0d}; //发送握手
uchar code Ackconfig[]= {0x6c,0x63,0x01,0x06,0x90,0x15,0xd8,0x84,0x0d};
uchar chuli[29];
void System_Init()
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFC;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
void Delay (uint Milliseconds)//延时2ms,
{
uchar a,b;
for(a=3;a>0;a--)
{
for(b=245;b>0;b--)
for (; Milliseconds > 0; Milliseconds--);
}
}
void SendChar (uchar chr)//发送一个字符
{
SBUF = chr;
while(!TI);
TI=0;
}
char Handshake (void)
{
uchar i,j,k;
j=0;
Delay(50000);
Delay(50000);
for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(RI)
{
chuli[j]=SBUF;
RI=0;
j++;
if(j==9)
{
for(k=0;k<10;k++)
{
if(chuli[k]!=Ackconfig[k]) //检测握手反馈值是否正确
break;
}
if(k!=10)
return 0;
else
return -1;
}
}
}
void main()
{
System_Init();
Delay(200);
while(1)
{
if(Handshake ())
{
Delay(50000);
Delay(50000);
SendChar(0x01);
Delay(50000);
Delay(50000);
SendChar(0x02);
Delay(50000);
Delay(50000);
SendChar(0x03);
}
}
}
这个程序用串口调试助手接收到4c 57 01 01 02 0d 01 02 03
我还没发送数据,就出现了01 02 03,不知道问题出在哪儿
在while(RI)前面加了一个while(!RI);不过还是有点问题 展开
2个回答
展开全部
程序采用了查询式发送,for(i=0;i<6;i++) {SendChar(askconfig[i]); },共发送了6个字符。
再去查询收到否。
这种方法,就是有问题的,发送6个字符时,就可能收到了好几个字符,而没有及时保存,完全可能丢失信息。
应该采用中断方式接收;发送,也可以用查询,也可以用中断。
方法弄清楚了,程序就容易编写、调试了。
再去查询收到否。
这种方法,就是有问题的,发送6个字符时,就可能收到了好几个字符,而没有及时保存,完全可能丢失信息。
应该采用中断方式接收;发送,也可以用查询,也可以用中断。
方法弄清楚了,程序就容易编写、调试了。
更多追问追答
追问
协议就是六个字符的命令,发送了才会进入等待接收状态,因为没有中断,所以会依次进行
等待六个字符发送结束了,接下来就是接收,判断是否和Ackconfig[]里面的数值一样,要是
一样,再发送01 02 03,这样有错吗?我看人家程序也是这样写的
追答
如果能保证对方,不会在本机发送6个字符命令时,发来信息,那么也可以采用查询方式。
这时就是半双工通信了,效率较低。
试试如下改动:
for(i=0;i<6;i++) { SendChar(askconfig[i]); } //连续发送6字节.
while(j < 10) { //如果没有收全,就循环.
if (RI) {
chuli[j] = SBUF;
RI = 0;
j++;
if(j == 9) {
for(k = 0; k < 10; k++) {
if(chuli[k] != Ackconfig[k]) //检测握手反馈值是否正确.
break;
}
if(k != 10) return 0;
else return -1;
}
}
}
展开全部
char Handshake (void)里面:
for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(RI)
这里不能这么用,否则发送发完了,还没收到(此时RI=0)就返回主程序发送1,2,3了。这里要加一句while(!RI);
改为:for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(!RI);
while(RI)
{............
for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(RI)
这里不能这么用,否则发送发完了,还没收到(此时RI=0)就返回主程序发送1,2,3了。这里要加一句while(!RI);
改为:for(i=0;i<6;i++)
{
SendChar(askconfig[i]);
}
while(!RI);
while(RI)
{............
追问
谢谢,这样一改是有改善,就是我发送6c 63 01 06 90 15 d8 84 0d,给单片机
单片机会反馈 01 02 03 4C 57 01 01 02 0D两次,而且,我就算发一个68,他也会
反馈01 02 03 4C 57 01 01 02 0D一次,那我的握手不是没起作用,不知道是什么情况
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询