?? com.c
字號:
#define _com_
#include "general.h"
#include "state.h"
#include "protocol.h"
#define INLEN 0x32 //40,固定幀長10 的倍數(shù)為宜
uchar idata r_buf[INLEN/*+0x0a*/]; //接收緩沖區(qū)
uchar *p_wrecibuf=r_buf; //接收時緩沖區(qū)寫入指針
uchar *p_rrecibuf=r_buf; //解析時緩沖區(qū)讀出指針
uchar cnt_reci;
//uchar idata t_buf[32];
uchar *pSTX,*pETX; //定位幀頭、幀尾指針
//uchar r_in,r_out,t_in,t_out; //FIFO
bit r_full,r_notempty; //標(biāo)志:接收緩沖滿、緩沖不空
bit f_stx_ok=0; //
bit f_etx_ok=0;
//f_rxbit f_etx=0;
///////////////////初始化///////////////////////////////////////////////////////
void init_com(void)
{
//Timer1
TMOD=0x20; /*定時器1工作方式2*/
TH1=0xfd; /*裝253,波特率=9600bit/s*@11.0592MHz*/
TCON=0x40; //啟動Timer1
//COM
//EA=0;
//TI=0;
SCON=0x50; //0101,串口工作方式1 SM2=0,REN=1,允許接收
//PCON=0x00;
//PS=1; //串口優(yōu)先級
//buf
r_notempty=0;
r_full=0;
//r_out=t_in=t_out=0;
//r_in=1;
//IE
//ES=1;//開串口中斷
//EA=1;//開中斷
IE=0x90;
}
////////////////////////發(fā)送部分(非中斷)//////////////////////////////////////////
void put_char(uchar ch){//發(fā)送一個字符,非中斷方式
SBUF=ch;
while(TI==0);
TI=0; //查詢硬件置位,發(fā)送完畢
}
void put_string(uchar *str,uchar strlen){//發(fā)送一個字符串,非中斷方式,strlen長度,注意本案中是從數(shù)組 高位 開始送
uchar k=strlen;
do {
if(*(str+k-1)>=0&&*(str+k-1)<=9) put_char(*(str+k-1)+'0'); //數(shù)字碼
else put_char(*(str+k-1)); //非數(shù)字
k--;
} while(k>0);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
void loadmsg(uchar *msg){ // 將字符串裝入緩沖區(qū)子程序發(fā)
while((*msg!=0)&&((((t_in+1)^t_out)&0x1f)!=0)){ // 檢查緩沖區(qū)滿
t_buf[t_in]=*msg;
msg++;
t_in=++t_in&0x1f; // if t_in+1大于緩沖區(qū)0x1f,t_in=0
if (t_done){ // 啟動發(fā)送
TI=1;
t_empty=0;
t_done=0;
}
}
}
*/
///////////////////////////接收部分(中斷)///////////////////////////////////////
void serial_int() interrupt 4 using 1{
if (RI&~r_full){ // 接收并且接收緩沖區(qū)未滿 ,full就不再收了
//uchar ch;
//ch=SBUF;
RI=0;
//if(SBUF=FR_STX){
*p_wrecibuf=SBUF; // 接收數(shù)據(jù)寫入
r_notempty=1;
if(p_wrecibuf==(r_buf+INLEN-1)) p_wrecibuf=r_buf;//循環(huán)
else p_wrecibuf++;
//cnt_reci++;
if (p_wrecibuf==p_rrecibuf) r_full=1; // 置緩沖區(qū)滿標(biāo)志
//if(*(p_wrecibuf-1)==FR_ETX) f_etx=1;
//}
}
/*else if (TI&&~t_empty){ // 發(fā)送并且發(fā)送緩沖區(qū)未空
SBUF=t_buf[t_out]; TI=0;
t_out=++t_out&0x1f; // t_out+1大于緩沖區(qū),則t_out=0
if (t_out==t_in) t_empty=1; // 要發(fā)送的數(shù)據(jù)還未送入緩沖區(qū)數(shù)據(jù),緩沖區(qū)空
}
else if (t_empty){ // 等待緩沖區(qū)裝入數(shù)據(jù)
TI=0;
t_done=1;
}*/
}
/*
void process(uchar ch)
{
return;
}
*/
/*
void processmsg(void){
/* // 處理接收緩沖區(qū)字符子程序
while (((r_out+1)^r_in)!=0){ // 不空即可處理
if(r_buf[r_out+1]=='@'){ //定位幀頭
pSTX=&(r_buf[r_out+1]);
f_stx_ok=1; //幀定位開始,可以unwrap
}
if((r_buf[r_out+1]=='\n')&&(f_stx_ok=1)){ //定位幀尾
pETX=&(r_buf[r_out+1]);
f_stx_ok=0;
f_etx_ok=1; //幀定位好,可以應(yīng)答(同時f_stx=1)
}
r_out=++r_out&0x1f; //取緩沖計數(shù)
}
*/
/* uchar i;
i=*p_rrecibuf;
if(i==FR_STX){ //定位幀頭
pSTX=p_rrecibuf;
f_stx_ok=1;
}
if((i=FR_ETX)&&(f_stx_ok=1)){ //定位幀尾
pETX=p_rrecibuf;
f_stx_ok=0;
f_etx_ok=1;
}
if(p_rrecibuf==(r_buf+INLEN-1))p_rrecibuf=r_buf;
else p_rrecibuf++;
cnt_reci--;
}
*/
void frame_unpack(uchar pre_cmd){ //通信發(fā)起命令字,
//最大重發(fā)次數(shù)
//==從緩沖讀出一幀遍歷,F(xiàn)R_ETX結(jié)束,期間關(guān)中斷=================
uchar i;
uchar re_cmd,*re_para/*,re_bcc1,re_bcc2*/;
if(r_notempty/*&&f_etx*/){ //緩沖區(qū)不空
//do{
//ES=0;
i=*p_rrecibuf;
r_full=0;//清緩沖滿標(biāo)志
if(i==FR_STX){ //定位幀頭
pSTX=p_rrecibuf; //頭指針
f_stx_ok=1; //標(biāo)志:頭定位好
}
else if((i==FR_ETX)&&(f_stx_ok==1)){ //定位幀尾(前提:頭定位好)
pETX=p_rrecibuf; //尾指針
f_stx_ok=0; //清標(biāo)志
f_etx_ok=1; //標(biāo)志:尾定位好,且?guī)ㄎ缓? }
if(p_rrecibuf==(r_buf+INLEN-1)) p_rrecibuf=r_buf; //循環(huán)
else p_rrecibuf++;
if(p_rrecibuf==p_wrecibuf) r_notempty=0; //置緩沖區(qū)取空標(biāo)志
//cnt_reci--;
//}while(cnt_reci>0);
//ES=1;
//==應(yīng)答域======================================
if(f_etx_ok&&(pETX-pSTX==9)){ //如果接收完畢并且 幀長度正確,可以開始讀報
f_etx_ok=0; //1.清標(biāo)志
//re_stx=*pSTX; //幀頭
if(pSTX<pETX){ //不跨越緩沖區(qū)尾(一般情況)
re_cmd=*(pSTX+1); //命令字位置指針
re_para=pSTX+2; //數(shù)據(jù)域起始指針
//re_bcc1=*(pETX-2); //校驗碼1
//re_bcc2=*(pETX-1); //校驗碼2
}
/*else{ //如果溢出(特殊情況)
uchar *pi;
for(pi=r_buf;pi<=pETX;pi++){
*(pi+INLEN)=*pi;
}
re_cmd=*(pSTX+1);
re_para=pSTX+2;
}*/
//==應(yīng)答機制====================================
switch(pre_cmd){
//程序分支1: 開始采集--光標(biāo)數(shù)據(jù)--正確應(yīng)答**************************************************
// --重發(fā)命令--
case FR_Start://開始采集
switch(re_cmd){
/*1*/ case FR_Cursor://'d'光標(biāo)數(shù)據(jù)--[0][1]小數(shù)兩位[2][3][4][5]整數(shù)四位
para_gb[5]=*re_para-'0';
para_gb[4]=*(re_para+1)-'0';
para_gb[3]=*(re_para+2)-'0';
para_gb[2]=*(re_para+3)-'0';
para_gb[1]=*(re_para+4)-'0';
para_gb[0]=*(re_para+5)-'0';
//frame_cmd(FR_Roger);//應(yīng)答
//f_acq_ok=1;
break;
case FR_Result://計算結(jié)果--[6][5][4]度[3][2]分[1][0]秒
//put_char('r');
result[9]=*re_para-'0';
result[8]=*(re_para+1)-'0';
result[7]=*(re_para+2)-'0';
result[6]=DEG;
result[5]=*(re_para+3)-'0';
result[4]=*(re_para+4)-'0';
result[3]=MIN;
result[2]=*(re_para+5)-'0';
result[1]=*(re_para+6)-'0';
result[0]=SEC;
//frame_cmd(FR_Roger); //應(yīng)答"收到"
Index=30; //轉(zhuǎn)顯示結(jié)果狀態(tài)
Index=30; //冗余一次
break;
case FR_Cancel://報錯--result[6][5][4][3][2][1][0]此時存放報錯信息
//put_char('r');
result[6]=*re_para-'0'; //錯位代碼
result[5]=*(re_para+1)-'0'; //錯誤代碼
//result[4]=*(re_para+2)-'0';
//result[3]=*(re_para+3)-'0';
//result[2]=*(re_para+4)-'0';
//result[1]=*(re_para+5)-'0';
//result[0]=*(re_para+6)-'0';
//frame_cmd(FR_Roger); //應(yīng)答"收到"
Index=31; //轉(zhuǎn)顯示結(jié)果狀態(tài)
Index=31; //冗余一次
break;
}
break;
//程序分支2: 開始標(biāo)定--光標(biāo)數(shù)據(jù)--正確應(yīng)答**************************************************
// --重發(fā)命令--
case FR_Swing://開始標(biāo)定
switch(re_cmd){
/*1*/ case FR_Cursor://'d'光標(biāo)數(shù)據(jù)--[0][1]小數(shù)兩位[2][3][4][5]整數(shù)四位
para_gb[5]=*re_para-'0';
para_gb[4]=*(re_para+1)-'0';
para_gb[3]=*(re_para+2)-'0';
para_gb[2]=*(re_para+3)-'0';
para_gb[1]=*(re_para+4)-'0';
para_gb[0]=*(re_para+5)-'0';
//frame_cmd(FR_Roger);//應(yīng)答
//f_acq_ok=1;
break;
/*case FR_Swing://標(biāo)定結(jié)果--[3][2][1][0]坐標(biāo)
//put_char('r');
result[9]=SPACE;
result[8]=SPACE;
result[7]=SPACE;
result[6]=SPACE;
result[5]=*re_para-'0';
result[4]=*(re_para+1)-'0';
result[3]=*(re_para+2)-'0';
result[2]=*(re_para+3)-'0';
result[1]=*(re_para+4)-'0';
result[0]=*(re_para+5)-'0';
//frame_cmd(FR_Roger); //應(yīng)答"收到"
Index=30; //轉(zhuǎn)顯示結(jié)果狀態(tài)
Index=30; //冗余一次
break;*/
case FR_Cancel://報錯--result[6][5][4][3][2][1][0]此時存放報錯信息
//put_char('r');
result[6]=*re_para-'0'; //錯位代碼
result[5]=*(re_para+1)-'0'; //錯誤代碼
//result[4]=*(re_para+2)-'0';
//result[3]=*(re_para+3)-'0';
//result[2]=*(re_para+4)-'0';
//result[1]=*(re_para+5)-'0';
//result[0]=*(re_para+6)-'0';
//frame_cmd(FR_Roger); //應(yīng)答"收到"
Index=31; //轉(zhuǎn)顯示結(jié)果狀態(tài)
Index=31; //冗余一次
break;
}
break;
//程序分支: 結(jié)束采集--計算結(jié)果--***********************************************************
/*case FR_Cancel:
switch(re_cmd){
case FR_Result://技術(shù)結(jié)果--[6][5][4]度[3][2]分[1][0]秒
result[6]=*re_para-'0';
result[5]=*(re_para+1)-'0';
result[4]=*(re_para+2)-'0';
result[3]=*(re_para+3)-'0';
result[2]=*(re_para+4)-'0';
result[1]=*(re_para+5)-'0';
result[0]=*(re_para+6)-'0';
Index=14;
//frame_cmd(re_cmd);//應(yīng)答
break;
}
break;*/
//程序分支: 向DSP查詢參數(shù)(進入Setup菜單時)--發(fā)各個參數(shù)幀*********************************************************
case FR_Para:
switch(re_cmd){
case FR_A://儀器常數(shù)'a'- [0][1]秒[2][3]分[4][5]度
para_a[6]=*re_para-'0';
para_a[5]=*(re_para+1)-'0';
para_a[4]=*(re_para+2)-'0';
para_a[3]=*(re_para+3)-'0';
para_a[2]=*(re_para+4)-'0';
para_a[1]=*(re_para+5)-'0';
para_a[0]=*(re_para+6)-'0';
frame_cmd(FR_Roger); //應(yīng)答
f_seta_ok=1;
//frame_data(FR_A,para_a,ALEN);
break;
case FR_L://緯度'l'- [0][1]小數(shù)兩位[2][3]整數(shù)兩位
para_wd[2]=*re_para-'0';
para_wd[1]=*(re_para+1)-'0';
para_wd[0]=*(re_para+2)-'0';
//para_wd[0]=*(re_para+3)-'0';
frame_cmd(FR_Roger); //應(yīng)答
//f_setl_ok=1;
//frame_data(FR_L,para_wd,LLEN);
break;
case FR_C://C值'c'- [0][1][2][3]
para_c[3]=*re_para-'0';
para_c[2]=*(re_para+1)-'0';
para_c[1]=*(re_para+2)-'0';
para_c[0]=*(re_para+3)-'0';
//para_c[1]=*(re_para+4);//符號
//para_c[0]=*(re_para+5)-'0';
frame_cmd(FR_Roger); //應(yīng)答
f_setc_ok=1;
//frame_data(FR_C,para_c,CLEN);
break;
case FR_P://周期個數(shù)'m'- [0]個位[1]十位
para_p[1]=*re_para-'0';
para_p[0]=*(re_para+1)-'0';
frame_cmd(FR_Roger); //應(yīng)答
//frame_data(FR_P,para_p,PLEN);
break;
case FR_Z://中天位置'z'- [3][2][1][0]
para_z[3]=*re_para-'0';
para_z[2]=*(re_para+1)-'0';
para_z[1]=*(re_para+2)-'0';
para_z[0]=*(re_para+3)-'0';
frame_cmd(FR_Roger); //應(yīng)答
f_setz_ok=1;
//frame_data(FR_P,para_p,PLEN);
break;
}
break;
//程序分支: 向DSP設(shè)置參數(shù)(4種)******************************************************************************
case FR_A:
switch(re_cmd){
case FR_Roger:
frame_cmd(FR_Roger);
//f_rx_ok=1;
break;
}
break;
case FR_L:
switch(re_cmd){
case FR_Roger:
frame_cmd(FR_Roger);
//f_rx_ok=1;
break;
}
break;
case FR_C:
switch(re_cmd){
case FR_Roger:
frame_cmd(FR_Roger);
//f_rx_ok=1;
break;
}
break;
case FR_P:
switch(re_cmd){
case FR_Roger:
frame_cmd(FR_Roger);
//f_rx_ok=1;
break;
}
break;
case FR_Z:
switch(re_cmd){
case FR_Roger:
frame_cmd(FR_Roger);
//f_rx_ok=1;
break;
}
break;
}//switch
}//f_etx_ok
//f_etx=0;
}//F_etx
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -