📄 main.c
字号:
Verify_ET++;
if(Verify_ET==3)
{
Verify_ET=3;
lcd_init();
send_hz(1,1,"和校验错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查从机设备");
exit_sign=1;
}
}
}
else //命令码错误
{
REN0=1;//重新允许接收
UART0_TX(anew_TX,3);//请求从机重新发送上一次数据
Verify_ET++;
if(Verify_ET==3)
{
Verify_ET=0;
lcd_init();
send_hz(1,1,"命令码错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查从机设备");
exit_sign=1;
}
}
}
}
}
}
//循环采集模式处理函数
void CYC_Disp(void)
{
bit exit_sign=0; //数据处理结束标志
unsigned char TX_time=0;//数据重发次数计数
unsigned char Verify_data=0;//接收和检验值
unsigned char Verify_ET=0; //和校验错误发生次数
unsigned char anew_TX[3]={0x01,0x00,0x00};//要求从机重发指令数组
unsigned char send_Num=0; //条码显示计数
unsigned char delay_num=0; //超时计数
bit RX_sign=0;//接收数据是否为第一次数据标志
unsigned int i;//定时控制变量
unsigned char CYC_pass=0;
lcd_init();
send_asc16str(2,0,"->");
send_hz(2,0,"循环采集");
send_hz(0,1,"系统处理中请稍后");
TX[0]=0x01; //从机地址
TX[1]=0x01; //数据采集命令字
TX[2]=0x02; //数据长度
TX[3]=0x00;//采集通道值
TX[4]=0x00;//和检验
UART0_TX(TX,5);
while(exit_sign==0)
{
for(i=65535;i>0;i--);
if(ReceiveBit==0)
{
UART0_TX(TX,5);
}
if(RX_sign==0)
{
send_asc16str(send_Num,32,">");//动态显示系统处理状态">>>>>>>>>>>>>>>>"
send_Num++;
if(send_Num==15)
{
send_Num=0;
send_asc16str(0,32," ");
delay_num++;
if(delay_num==3)
{
delay_num=0;
lcd_init();
send_hz(2,1,"通讯超时");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查通信网络");
exit_sign=1;
}
}
}
if(ReceiveBit==1) //接收到一帧数据
{
ReceiveBit=0; //清除接收完成标志
if(RX[1]==0) //从机要求重发数据
{
REN0=1;//重新允许接收
UART0_TX(TX,5);
TX_time++;
if(TX_time==3)//重发次数超过三次报警
{
TX_time=0;
lcd_init();
send_hz(1,1,"从机通讯错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查通讯线路");
exit_sign=1;
}
}
else
{
if(RX[1]==1)
{
Verify_data=Sum_verify(RX+3,4);//对接收的数据(一字节通道字节数据)进行和校验
if(Verify_data==RX[7]) //和校验正确,显示采集数值
{
if(RX_sign==0)//第一次数据发送
{
RX_sign=1;
lcd_init();
send_asc16str(0,0,"1");
send_asc16str(1,0,":");
send_asc16str(3,0,".");
send_asc16str(6,0,"v");
send_asc16str(9,0,"2");
send_asc16str(10,0,":");
send_asc16str(12,0,".");
send_asc16str(15,0,"v");
send_asc16str(0,16,"3");
send_asc16str(1,16,":");
send_asc16str(3,16,".");
send_asc16str(6,16,"v");
send_asc16str(9,16,"4");
send_asc16str(10,16,":");
send_asc16str(12,16,".");
send_asc16str(15,16,"v");
send_asc16str(0,32,"5");
send_asc16str(1,32,":");
send_asc16str(3,32,".");
send_asc16str(6,32,"v");
send_asc16str(9,32,"6");
send_asc16str(10,32,":");
send_asc16str(12,32,".");
send_asc16str(15,32,"v");
send_asc16str(0,48,"7");
send_asc16str(1,48,":");
send_asc16str(3,48,".");
send_asc16str(6,48,"v");
send_asc16str(9,48,"8");
send_asc16str(10,48,":");
send_asc16str(12,48,".");
send_asc16str(15,48,"v");
}
switch(RX[3])//各通道数据显示
{
case 0x00:
send_ascii8(2,7,RX[4]+0x30);
send_ascii8(4,7,RX[5]+0x30);
send_ascii8(5,7,RX[6]+0x30);
break;
case 0x01:
send_ascii8(11,7,RX[4]+0x30);
send_ascii8(13,7,RX[5]+0x30);
send_ascii8(14,7,RX[6]+0x30);
break;
case 0x02:
send_ascii8(2,23,RX[4]+0x30);
send_ascii8(4,23,RX[5]+0x30);
send_ascii8(5,23,RX[6]+0x30);
break;
case 0x03:
send_ascii8(11,23,RX[4]+0x30);
send_ascii8(13,23,RX[5]+0x30);
send_ascii8(14,23,RX[6]+0x30);
break;
case 0x04:
send_ascii8(2,39,RX[4]+0x30);
send_ascii8(4,39,RX[5]+0x30);
send_ascii8(5,39,RX[6]+0x30);
break;
case 0x05:
send_ascii8(11,39,RX[4]+0x30);
send_ascii8(13,39,RX[5]+0x30);
send_ascii8(14,39,RX[6]+0x30);
break;
case 0x06:
send_ascii8(2,55,RX[4]+0x30);
send_ascii8(4,55,RX[5]+0x30);
send_ascii8(5,55,RX[6]+0x30);
break;
case 0x07:
send_ascii8(11,55,RX[4]+0x30);
send_ascii8(13,55,RX[5]+0x30);
send_ascii8(14,55,RX[6]+0x30);
break;
}
TX[0]=0x01; //从机地址
TX[1]=0x01; //数据采集命令字
TX[2]=0x02; //数据长度
TX[3]=(++CYC_pass)&&0x07;//采集通道值
TX[4]=TX[3];//和检验
for(i=65535;i>0;i--);
UART0_TX(TX,5);
REN0=1;//重新允许接收
if(key_sign==1) //有按键
exit_sign=1;
}
else //和校验错误
{
REN0=1;//重新允许接收
UART0_TX(anew_TX,3);//请求从机重新发送上一次数据
Verify_ET++;
if(Verify_ET==3)
{
Verify_ET=3;
lcd_init();
send_hz(1,1,"和校验错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查从机设备");
exit_sign=1;
}
}
}
else //命令码错误
{
REN0=1;//重新允许接收
UART0_TX(anew_TX,3);//请求从机重新发送上一次数据
Verify_ET++;
if(Verify_ET==3)
{
Verify_ET=0;
lcd_init();
send_hz(1,1,"命令码错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查从机设备");
exit_sign=1;
}
}
}
}
}
}
//和检验函数
unsigned char Sum_verify(unsigned char verify[],unsigned char ii)
{
unsigned char Verify_Sum=0;//和校验值
unsigned char i;
for(i=0;i<ii;i++)
{
Verify_Sum^=verify[i];
}
return(Verify_Sum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -