📄 uart_new.c
字号:
case STATE_MSG_NUM:
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
if(temp<'0'||temp>'9')
errordect=TRUE;
checksum+=temp;
i++;
nextstate=STATE_STX;
break;
case STATE_STX:
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
if(temp==STX)
{
checksum+=STX;
nextstate=STATE_MSG_STRING;
}
else
errordect=TRUE;
i++;
break;
case STATE_MSG_STRING:
strindex=0;
while(TRUE)
{
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
if(temp==ETX)
{
checksum+=ETX;
break;
}
checksum+=temp;
i++;
strindex++;
if(strindex>MAX_COMMAND_LENGTH)
{
errordect=TRUE;
break;
}
}
i++;
nextstate=STATE_CHECKSUM;
break;
case STATE_CHECKSUM:
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
testchecksum=Asc_hex(temp);
i++;
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
testchecksum=testchecksum<<4;
testchecksum+=Asc_hex(temp);
temp=(testchecksum+checksum)&0xFF;
if(temp!=0)
errordect=TRUE;
i++;
nextstate=STATE_EOT;
break;
case STATE_EOT:
if(maxtrans)
temp=SPIbuf[i];
else
temp=recv_buf[i];
if(temp!=EOT)
errordect=TRUE;
else
endofmessage=TRUE;
break;
}
if(errordect||wrongaddr)
break;
if(endofmessage)
break;
}
if(wrongaddr)
{
recv_ctr=0;
return FALSE; // 地址错误直接返回,不进行任何操作
}
if(errordect)
{
recv_ctr=0;
sendmessage(NAK);
return FALSE; // 接收错误
}
if(endofmessage)
{
recv_ctr=0;
sendmessage(ACK);
return TRUE; // 接收正确
}
}
///////////////////////////////////////////////////////////////////////////////
// 上位机命令处理过程
///////////////////////////////////////////////////////////////////////////////
void host_proc()
{
idata uint i;
idata uchar temp;
if(checkmessage())
{
if(readbuf()==TRUE) // 处理具体的上位机命令
{
if(maxtrans) // 大数据量传输模式
{
if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
&&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='S'))
{
SPIbuf[0]=SOH;
SPIbuf[1]=haddr; // 源地址
SPIbuf[2]=laddr;
SPIbuf[3]='0'; // 目标地址
SPIbuf[4]='0';
SPIbuf[5]='0'; // 信息号
SPIbuf[6]=ACK; // ACK
SPIbuf[7]=EOT; // 结束
Dir=1; // 485发送
COMENABLE; // 允许串口中断
trans_ctr=0;
trans_size=8;
SBUF=SPIbuf[0]; // 发送
while(trans_size){} // 直到数据传输完毕
maxtrans=FALSE; // 切换为小数据量传输模式
}
else if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
&&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='L'))
{
SPIbuf[0]=SOH;
SPIbuf[1]=haddr; // 源地址
SPIbuf[2]=laddr;
SPIbuf[3]='0'; // 目标地址
SPIbuf[4]='0';
SPIbuf[5]='0'; // 信息号
SPIbuf[6]=ACK; // ACK
SPIbuf[7]=EOT; // 结束
Dir=1; // 485发送
COMENABLE; // 允许串口中断
trans_ctr=0;
trans_size=8;
SBUF=SPIbuf[0]; // 发送
while(trans_size){} // 直到数据传输完毕
maxtrans=TRUE; // 切换为大数据量传输模式
}
else
{
SPIbuf[1]='0'; // 修改地址向DSP发送
SPIbuf[2]='1';
SPIbuf[3]='0';
SPIbuf[4]='2';
// 重新计算校验和
i=0;
checksum=0;
while(SPIbuf[i]!=ETX)
{
checksum+=SPIbuf[i];
i++;
}
checksum+=SPIbuf[i]; // ETX
checksum=~checksum+1;
temp=(checksum&0xF0)>>4;
i++;
SPIbuf[i]=Hex_ascii(temp);
temp=checksum&0x0F;
i++;
SPIbuf[i]=Hex_ascii(temp);
if(Send_spi()) // 直接向DSP发送
{
if(SPIbuf[7]=='D'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
{
white_bill_reg(); // 注册白名单
}
SPIbuf[1]=haddr; // 修改地址向上位机发送
SPIbuf[2]=laddr;
SPIbuf[3]='0';
SPIbuf[4]='0';
// 重新计算校验和
i=0;
checksum=0;
while(SPIbuf[i]!=ETX)
{
checksum+=SPIbuf[i];
i++;
}
checksum+=SPIbuf[i]; // ETX
checksum=~checksum+1;
temp=(checksum&0xF0)>>4;
i++;
SPIbuf[i]=Hex_ascii(temp);
temp=checksum&0x0F;
i++;
SPIbuf[i]=Hex_ascii(temp);
i++;
COMENABLE; // 允许串口中断
Dir=1; // 485发送
trans_ctr=0; // 发送指针
trans_size=i+1; // 发送数据大小
SBUF=SPIbuf[0]; // 发送数据
}
else
{
while(trans_size){} // 直到数据传输完毕
sendmessage(NAK);
}
}
}
else // 小数据量命令模式
{
if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='M')&&(recv_buf[COMMAND_PTR+2]=='T'))
{
for(i=0;i<15;i++)
{
cur_time[i]=recv_buf[COMMAND_PTR+3+i];
set_time(); // 设置系统时间
}
}
else if((recv_buf[COMMAND_PTR]=='G')&&(recv_buf[COMMAND_PTR+1]=='R')&&(recv_buf[COMMAND_PTR+2]=='R'))
{
while(trans_size){} // 直到数据传输完毕
sendmessage(0);
}
else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
&&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='S'))
{
while(trans_size){} // 直到数据传输完毕
maxtrans=FALSE; // 切换为小数据量传输
}
else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
&&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='L'))
{
while(trans_size){} // 直到数据传输完毕
maxtrans=TRUE; // 切换为大数据量传输
}
else
{
while(trans_size){} // 直到数据传输完毕
sendmessage(NAK); // 命令不支持
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
// 设置波特率
///////////////////////////////////////////////////////////////////////////////
void Baud_Init()
{
switch(baudrate)
{
case 0:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0x70; // 波特率设为4800bps
RCAP2H=0xff;
RCAP2L=0x70;
TR2 = 1; // 允许T2中断
break;
case 1:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0xb8; // 波特率设为9600bps
RCAP2H=0xff;
RCAP2L=0xb8;
TR2 = 1; // 允许T2中断
break;
case 2:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0xdc; // 波特率设为19200bps
RCAP2H=0xff;
RCAP2L=0xdc;
TR2 = 1; // 允许T2中断
break;
case 3:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0xee; // 波特率设为38400bps
RCAP2H=0xff;
RCAP2L=0xee;
TR2 = 1; // 允许T2中断
break;
case 4:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0xf4; // 波特率设为57600bps
RCAP2H=0xff;
RCAP2L=0xf4;
TR2 = 1; // 允许T2中断
break;
case 5:
TR2=0; // 关闭T2定时器
TH2 = 0xff ;
TL2 = 0xfa; // 波特率设为115200bps
RCAP2H=0xff;
RCAP2L=0xfa;
TR2 = 1; // 允许T2中断
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -