📄 usart.c
字号:
break;
case 0x08://software version
for(i=0;i<2;i++)
{
tmp_buf[plen++]=v_soft_ver[i].active_image;
tmp_buf[plen++]=v_soft_ver[i].version/100+0x30;
tmp_buf[plen++]=(v_soft_ver[i].version%100)/10+0x30;
tmp_buf[plen++]=v_soft_ver[i].version%10+0x30;
tmp_buf[plen++]=v_soft_ver[i].flag;
tmp_buf[plen++]=v_soft_ver[i].day/10+0x30;
tmp_buf[plen++]=v_soft_ver[i].day%10+0x30;
tmp_buf[plen++]=v_soft_ver[i].month/10+0x30;
tmp_buf[plen++]=v_soft_ver[i].month%10+0x30;
tmp_buf[plen++]=(v_soft_ver[i].year%100)/10+0x30;
tmp_buf[plen++]=v_soft_ver[i].year%10+0x30;
}
break;
case 0x09://flash access--------adding on 07-0924 在flashacc_pro处理了
return;
case 0x20://alive message
tmp_buf[plen++]=v_counter;
break;
/*case 0x21://RxPower
break;
case 0x22://TxPower
break;
*/
case 0x24://RpsControl
tmp_buf[plen++]=v_rpscontrol;
break;
case 0x25://RpsAlarm
tmp_buf[plen++]=v_rpsalarm;
break;
case 0x26://ODU control
tmp_buf[plen++]=v_tmatpc;
break;
default:
break;
}
}
else if(type==0x02){//request message
}
else if(type==0x03){//CMD message
}
else if(type==0xff){//ACK
}
load_msg(tmp_buf,plen); //数据链路层打包,并写入待发送存储区,
}
/*将有效帧根据协议进行命令处理*/
unsigned int msg_handle(unsigned char msg[],unsigned int len) //命令应答处理
{
unsigned char type,id,ack;
/*when received a correct msg,send an ack frame first*/
send_ack();
/*分析包的内容,并作相应处理*/
type=msg[0];
id=msg[1];
ack=0;
/*
if(type==0x01){//response message
ack=msg[2];
}
else*/
if(type==0x02){//request message
type=0x01;
if(id==0x09)
ack=flashacc_pro(msg,len); //handle the flash access message;
else
msg_pack(type,id,ack,msg[2]);
}
else if(type==0x03){//command message
type=0x01;//response
switch(id){
case 0x01://alarm
v_alarm_sim[0]=msg[2];
v_alarm_sim[1]=msg[3];
v_alarmsim_counter=30; /*to stand for 30 seconds*/
msg_pack(type,id,ack,0);
break;
case 0x02://configuration
ack=config_pro(msg,len); //handle configuration message
msg_pack(type,id,ack,msg[2]);
break;
case 0x03://filetransfer
ack=ftrans_pro(msg,len); //handle file transfer message
msg_pack(type,id,ack,0);
break;
/*case 0x05://measurement
break;*/
case 0x07://reset
if((msg[2]==0x00)||(msg[2]==0x01))
v_reset=msg[2];
else ack=ACK_VALINVALID;
msg_pack(type,id,ack,0);
//***********reseting*******************/
reset_pro(v_reset);
break;
case 0x08://software version
ack=swversion_pro(msg,len);//activate the software version selected by the activeImage
break;
case 0x09://flash access--------adding on 07-0924
ack=flashacc_pro(msg,len); //handle the flash access message;
break;
/*case 0x20://alive message
break;
case 0x21://RxPower
break;
case 0x22://TxPower
break;*/
case 0x24://RpsControl
if((msg[2]==0x00)||(msg[2]==0x01))
v_rpscontrol=msg[2];
else ack=ACK_VALINVALID;
msg_pack(type,id,ack,0);
break;
/*case 0x25://RpsAlarm
break;*/
case 0x26://ODU control
if(msg[2]<0x15)
v_tmatpc=msg[2]*5; //the unit is ms
else ack=ACK_VALINVALID;
msg_pack(type,id,ack,0);
break;
default:
break;
}
}
else if(type==0xff){//ACK
}
/**/
return ack;
}
/*从PDA提取信息帧*/
void recv_msg()
{
unsigned char ch;
//read_char_USART0(); /*for debuging^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^for debug*/
unsigned int recv_point;//接受数据DMA指针
recv_point=MAX_RECV_BUF-u_pUSART0->US_RCR;
if(u_pUSART0->US_RNCR==0) {
u_pUSART0->US_RNCR=MAX_RECV_BUF;
u_pUSART0->US_RNPR =(unsigned int)recv_dma;;
}
if(recv_point==rx_rd_pt) return;
else
{ while (recv_point!=rx_rd_pt){
//if((MAX_RECV_BUF-recv_point)>rx_rd_pt)
ch=recv_dma[rx_rd_pt++];
if(rx_rd_pt==MAX_RECV_BUF) rx_rd_pt=0;
if(ch==0x7e)
{
if(hd_flag==0)
{ rx_index=0;
rx_len=0;
hd_flag++;
rx_buf[rx_index++]=ch;
}
else if(hd_flag==1)
{
hd_flag++;
rx_buf[rx_index++]=ch;
rx_len=rx_index;
if(rx_len>4) {unpack();return;}//收到有效帧,解帧
else { hd_flag=1; //若收到非法帧,则将刚收到的0x7e作为起始字符。
rx_len=0;
rx_buf[0]=0x7e;
rx_index=1;
}
}
else
hd_flag=0;
}
else if(hd_flag==1)
{
rx_buf[rx_index++]=ch;
}
}
}
}
/*将从PDA中取到的信息帧去掉头、尾,将0x7e、0x7d还原,并进行CRC校验*/
void unpack() //解包程序
{
//unsigned char *ch;
unsigned char msg[256];
unsigned int i,j,crc_cksum;
j=0;
//while(rx_buf[i]!=0x7e)
for(i=0;i<rx_len-2-j;i++)
{
msg[i]=rx_buf[i+j+1];
if(msg[i]==0x7d)
{
j++;
msg[i]=rx_buf[i+j+1]^0x20;
}
//if(i>255) break;
}
crc_cksum=msg[i-2]+(msg[i-1]<<8);
if(crc_cksum==crc_fun(msg,i-2))
{ msg_handle(msg,i-2);
hd_flag=0; //重新开始接收消息
}
else{
hd_flag=1; ////若收到非法帧,则将刚收到的0x7e作为起始字符。
rx_len=0;
rx_buf[0]=0x7e;
rx_index=1;
}
}
/*将应用层信息计算校验和,对0x7e、0x7d进行转义处理,产生需要传输的帧*/
unsigned int load_msg(unsigned char *msg,unsigned int len) //data link layer
{
unsigned int snum,j;
unsigned int checksum;
unsigned char datalink_buf[128];
checksum=crc_fun(msg,len);
datalink_buf[0]=0x7e;
j=0;
msg[len++]=checksum&0x00ff;
msg[len++]=(checksum&0xff00)>>8;
for(snum=0;snum<len;snum++)
{
datalink_buf[snum+j+1]=msg[snum];
if(msg[snum]==0x7e)
{
datalink_buf[snum+j+1]=0x7d;
j++;
datalink_buf[snum+j+1]=0x5e;
}
else if(msg[snum]==0x7d)
{
datalink_buf[snum+j+1]=0x7d;
j++;
datalink_buf[snum+j+1]=0x5d;
}
}
snum=snum+j+1;
datalink_buf[snum++]=0x7e;
//write_frame_USART0(datalink_buf,snum);
/*将发送信息帧写入PDA*/
for(j=0;j<snum;j++)
{
send_dma[tx_wr_pt++]=datalink_buf[j];
if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
/*for debug*/
printf("%x ",datalink_buf[j]);
}
printf("\n");
return (snum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -