📄 rs232.c
字号:
}
sbuf_rec=INVALID_ASC2;
}else if((sbuf_rec==END_0x0A)){ //最后1个命令元素0x0A
if(m_host_flg==0){
m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
m_scc.nReadCount++;
SBUF=sbuf_rec; //返回接收的数据
}else{
}
sbuf_rec=INVALID_ASC2;
//完整命令解析
if(m_host_flg==0){
//(串口在主程序及中断中)
m_resolve_flg=1;
//(串口仅在主程序中)
// command(m_scc.m_ReadBuf/*, m_scc.nReadCount*/);
}else{
}
}else if(sbuf_rec!=INVALID_ASC2){ //第3,......个命令元素,放入数组相应位置
if(m_host_flg==0){
m_scc.nReadCount++;
m_scc.m_ReadBuf[m_scc.nReadCount-1]=sbuf_rec;
SBUF=sbuf_rec; //返回接收的数据
}else{
}
sbuf_rec=INVALID_ASC2;
}
}
}
//收完完整命令后,解析命令
void command(uchar *pBuf)
{
uchar xdata i,j;
uchar xdata cParamNum; //监视参数个数
uchar xdata *add_setparam;
uchar xdata type_setparam;
j=0;
switch(pBuf[1]){
case 'V': //通讯解除
m_msg_quit_flg=1; //置通讯解除标记
message_quit();
break;
case 'M': //参数监视
if(m_msg_monitor_flg==0){
m_msg_monitor_flg=1; //置监视标记
m_monitor_delay_count=0;
// m_monitor_delay_flg=1; //置监视延迟标志
}
cParamNum=__tofig(pBuf[2]);
for(i=0; i<cParamNum; i++){
m_monitor_ad[m_add_type_idx]=GetValidAdd(pBuf+3+j);
m_monitor_type[m_add_type_idx]=__tofig(pBuf[7+j]);
m_add_type_idx++;
j=j+5;
}
break;
case 'E': //参数设定
m_msg_set_flg=1; //置参数设定标记
add_setparam=GetValidAdd(pBuf+2); //取得设置参数地址
type_setparam=__tofig(*(pBuf+6)); //取得设置参数类型
SetParamVal(pBuf+7,add_setparam,type_setparam);
if((add_setparam>=0x1004)&&(add_setparam<=0x1010)){ //置年月日时分秒标记
m_set_time=1;
}
break;
default: //联机测试
break;
}
m_resolve_flg=0;
}
void monitor_send(void)
{
uchar sendbuf;
if(m_comm_enable_flg==1){
//监视参数状态
if(m_msg_monitor_flg==1){ //监视中
//置host标记
m_host_flg=1;
//作成及发送监视数据
if((m_monitor_delay_count>=SCC_MONITOR_DELAYCOUNT)){
//(串口仅在主程序中)
//作成发送缓冲区
/* if(m_scc.WriteFlg==0){ //完整命令起始
if(m_monitor_type[m_active_idx]!=0){ //有效的类型
make_send_buf(); //做成发送数据
}else{ //遇无效类型,尝试监视下一参数
m_active_idx++;
if(m_active_idx>=MORN_PARAM_NUM)
m_active_idx=0;
return;
}
}*/
//发送
if((m_scc.WriteFlg==1) && (m_get_senddata_flg==1)){
sendbuf=m_scc.m_WriteBuf[m_scc.nWriteCount];
SBUF=sendbuf;
m_get_senddata_flg=0;
m_scc.nWriteCount++;
if(m_scc.nWriteCount>=m_scc.dwWriteReqSize){ //完整命令发送完
m_scc.nWriteCount=0;
m_scc.WriteFlg=0;
m_active_idx++;
if(m_active_idx>=MORN_PARAM_NUM)
m_active_idx=0;
}
}
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------------------
void message_quit(void) //V 命令子程序
{
uchar xdata i;
for(i=0; i<5; i++){
m_monitor_type[i]=0; // 监视参数标志清零
}
m_msg_monitor_flg=0; // 监视命令标记
// m_monitor_delay_flg=0; // 监视延迟标记
m_monitor_delay_count=0;
m_msg_quit_flg=0; // 解除监视命令标志
m_msg_set_flg=0; // 参数设定命令标记
m_get_senddata_flg=1;
m_scc.nWriteCount=0;
m_add_type_idx=0;
m_active_idx=0;
sbuf_rec=INVALID_ASC2;
m_scc.WriteFlg=0;
}
void make_send_buf(void)
{
uchar xdata *sss_char;
uint xdata *sss_int;
ulong xdata *sss_long;
signed char scVal=0;
uchar ucVal=0;
uint unVal=0;
ulong ulVal=0;
sss_char=m_monitor_ad[m_active_idx];
sss_int=m_monitor_ad[m_active_idx];
sss_long=m_monitor_ad[m_active_idx];
m_scc.m_WriteBuf[0]=SEND_COMMAND;
m_scc.m_WriteBuf[1]='M';
m_scc.m_WriteBuf[2]=__toascii((m_monitor_ad[m_active_idx]>>12)&0x0F);
m_scc.m_WriteBuf[3]=__toascii((m_monitor_ad[m_active_idx]>>8)&0x0F);
m_scc.m_WriteBuf[4]=__toascii((m_monitor_ad[m_active_idx]>>4)&0x0F);
m_scc.m_WriteBuf[5]=__toascii((m_monitor_ad[m_active_idx])&0x0F);
m_scc.m_WriteBuf[6]=__toascii((m_monitor_type[m_active_idx])&0x0F);
if(m_monitor_type[m_active_idx]==1){
ucVal=(uchar)*sss_char;
m_scc.m_WriteBuf[7]=__toascii((ucVal>>4)&0x0F);
m_scc.m_WriteBuf[8]=__toascii((ucVal)&0x0F);
m_scc.m_WriteBuf[9]=END_0x0D/*__toascii(END_0x0D)*/;
m_scc.m_WriteBuf[10]=END_0x0A/*__toascii(END_0x0A)*/;
m_scc.dwWriteReqSize=11;
}else if(m_monitor_type[m_active_idx]==2){
unVal=(uint)*sss_int;
m_scc.m_WriteBuf[7]=__toascii((unVal>>12)&0x0F);
m_scc.m_WriteBuf[8]=__toascii((unVal>>8)&0x0F);
m_scc.m_WriteBuf[9]=__toascii((unVal>>4)&0x0F);
m_scc.m_WriteBuf[10]=__toascii((unVal)&0x0F);
m_scc.m_WriteBuf[11]=END_0x0D/*__toascii(END_0x0D)*/;
m_scc.m_WriteBuf[12]=END_0x0A/*__toascii(END_0x0A)*/;
m_scc.dwWriteReqSize=13;
}else if(m_monitor_type[m_active_idx]==3){
ulVal=(ulong)*sss_long;
m_scc.m_WriteBuf[7]=__toascii((ulVal>>28)&0x0F);
m_scc.m_WriteBuf[8]=__toascii((ulVal>>24)&0x0F);
m_scc.m_WriteBuf[9]=__toascii((ulVal>>20)&0x0F);
m_scc.m_WriteBuf[10]=__toascii((ulVal>>16)&0x0F);
m_scc.m_WriteBuf[11]=__toascii((ulVal>>12)&0x0F);
m_scc.m_WriteBuf[12]=__toascii((ulVal>>8)&0x0F);
m_scc.m_WriteBuf[13]=__toascii((ulVal>>4)&0x0F);
m_scc.m_WriteBuf[14]=__toascii((ulVal)&0x0F);
m_scc.m_WriteBuf[15]=END_0x0D/*__toascii(END_0x0D)*/;
m_scc.m_WriteBuf[16]=END_0x0A/*__toascii(END_0x0A)*/;
m_scc.dwWriteReqSize=17;
}
m_scc.WriteFlg=1;
m_scc.nWriteCount=0;
}
// 转换为ASCII
uchar __toascii(uchar c)
{
uchar ret;
if(c>9)
ret=0x37+c;
else
ret=0x30+c;
return ret;
}
// ASCII转换为数字
uchar __tofig(uchar cAscii)
{
uchar ret;
if((cAscii>=0x30) && (cAscii<=0x39))
ret=cAscii-0x30;
else if((cAscii>=0x41) && (cAscii<=0x46))
ret=cAscii-0x37;
return ret;
}
//
uint GetValidAdd(uchar *pBuf)
{
uint nValidAdd=0;
xdata uchar c1,c2,c3,c4;
if(pBuf[0]>'9')
c1=pBuf[0]-0x37;
else
c1=pBuf[0]-0x30;
if(pBuf[1]>'9')
c2=pBuf[1]-0x37;
else
c2=pBuf[1]-0x30;
if(pBuf[2]>'9')
c3=pBuf[2]-0x37;
else
c3=pBuf[2]-0x30;
if(pBuf[3]>'9')
c4=pBuf[3]-0x37;
else
c4=pBuf[3]-0x30;
nValidAdd = (c1<<12)|(c2<<8)|(c3<<4)|(c4);
return nValidAdd;
}
//设定参数值
//parameter: pSrcBuf--源数字
void SetParamVal(uchar *pSrcBuf, uchar *pDestBuf, uchar type)
{
xdata uchar val;
// xdata uchar i;
signed char scVal=0;
uchar ucVal=0;
uint unVal=0;
ulong ulVal=0;
switch(type){
case 0:
break;
case 1:
val=__tofig(pSrcBuf[0]); //高4位
pDestBuf[0]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[1]); //低4位
pDestBuf[0]=pDestBuf[0]|(val&0x0F);
break;
case 2:
val=__tofig(pSrcBuf[0]); //高4位
pDestBuf[0]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[1]); //低4位
pDestBuf[0]=pDestBuf[0]|(val&0x0F);
val=__tofig(pSrcBuf[2]); //高4位
pDestBuf[1]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[3]); //低4位
pDestBuf[1]=pDestBuf[1]|(val&0x0F);
break;
case 3:
val=__tofig(pSrcBuf[0]); //高4位
pDestBuf[0]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[1]); //低4位
pDestBuf[0]=pDestBuf[0]|(val&0x0F);
val=__tofig(pSrcBuf[2]); //高4位
pDestBuf[1]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[3]); //低4位
pDestBuf[1]=pDestBuf[1]|(val&0x0F);
val=__tofig(pSrcBuf[4]); //高4位
pDestBuf[2]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[5]); //低4位
pDestBuf[2]=pDestBuf[2]|(val&0x0F);
val=__tofig(pSrcBuf[6]); //高4位
pDestBuf[3]=(val<<4)&0xF0;
val=__tofig(pSrcBuf[7]); //低4位
pDestBuf[3]=pDestBuf[3]|(val&0x0F);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -