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);不过还是有点问题
展开
 我来答
做而论道
高能答主

2011-05-17 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
程序采用了查询式发送,for(i=0;i<6;i++) {SendChar(askconfig[i]); },共发送了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;
}
}
}
沧水伢子
2011-05-17 · TA获得超过494个赞
知道小有建树答主
回答量:369
采纳率:0%
帮助的人:202万
展开全部
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)
{............
追问
谢谢,这样一改是有改善,就是我发送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一次,那我的握手不是没起作用,不知道是什么情况
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式