51单片机与上位机通讯怎么保证第一次就成功

[复制链接]
查看11 | 回复3 | 2021-1-27 05:27:06 | 显示全部楼层 |阅读模式
每次都要在上位机软件界面点好多次51单片机UART才能正确通讯一次,希望各位为小弟解惑,不甚感激!!
代码如下:
voidinit_uart(void)
{
PCON&=0x7F;
SCON=0x50;//SCON:模式1,8-bitUART,使能接收
BRT=0xB8;//TMOD:timer1,mode2,8-bit重装
AUXR|=0x04;//TH1:重装值9600波特率晶振11.0592MHz
AUXR|=0x01;//TR1:timer1打开
AUXR|=0x10;
//TR1=1;
EA=1;//打开总中断
ES=1;
//PSH=1;
PS=1;//优先级最高
}
voidUART_Interrupt_Recevie(void)interrupt4//串行中断服务程序
{
if(RI==1)
{
receive[count++]=SBUF;
C1_temp=receive[0];
D1_temp=receive[1];
E1_temp=receive[2];
F1_temp=receive[3];
G1_temp=receive[4];
H1_temp=receive[5];
I1_temp=receive[6];
J1_temp=receive[7];
if(C1_temp==0x2A&J1_temp==0x23)
{
C1_in=C1_temp;
D1_in=D1_temp;
E1_in=E1_temp;
F1_in=F1_temp;
G1_in=G1_temp;
H1_in=H1_temp;
I1_in=I1_temp;
J1_in=J1_temp;
Speed=(F1_in-0x30)*100+(H1_in-0x30)*10+(I1_in-0x30);
times=65536-75000/Speed;
if(times>64786)
{
T1MS1=40536;
D1=0;
}
elseD1=1;
/***判断正反转***/
if((D1_temp==0x6D)&(E1_temp==0x7A))//正转
{
E1=1;
G1=1;
}
elseif((D1_temp==0x6D)&(E1_temp==0x66))//反转
{
E1=0;
G1=1;
}
//elseG1=1;
}
/********判断是否停止****/
elseif(C1_temp==0x2A&D1_temp==0x6D&E1_temp==0x73&F1_temp==0x32&G1_temp==0x23)//*ms2#判断是否停止
{
G1=0;
}
}
/****判定是否接收正确******/
if(C1_in==0x2A&D1_in==0x6D&((E1_in)==0x7A||(E1_in)==0x66||(E1_in)==0x73)&F1_in==0x33&G1_in==0x2E&H1_in==0x30&I1_in==0x30&J1_in==0x23)
J1=0;
else
J1=1;
/*
if(D1_in==0x6D)
D1=0;
else
D1=1;
if(((E1_in)==0x7A||(E1_in)==0x66||(E1_in)==0x73))
E1=0;
else
E1=1;
if(F1_in==0x30)
F1=0;
else
F1=1;
if(G1_in==0x2E)
G1=0;
else
G1=1;
if(H1_in==0x39)
H1=0;
else
H1=1;
if(I1_in==0x30)
I1=0;
else
I1=1;
if(J1_in==0x23)
J1=0;
else
J1=1;
*/
if(count>8)
{
count=0;
}
RI=0;
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:06 | 显示全部楼层
只有一个方法:乞求上帝保佑你,啊门!
要不你就得修改代码,如增加一些LOG来分析为什么要点击多次。
回复

使用道具 举报

千问 | 2021-1-27 05:27:06 | 显示全部楼层
你点击或多次,失败的时候是否有数据呢?
回复

使用道具 举报

千问 | 2021-1-27 05:27:06 | 显示全部楼层
难以相信的是你点多次居然能成功一次?
代码太不像样了。尽量参考别人的demo程序吧
你把逻辑与运算符&&写成&了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行