📄 isomodem_v80.c
字号:
#include "44b.H"
#include "EPT32.H"
#include "Nucleus.H"
#include "string.h"
#include "switch.h"
#include "interdrive.h"
#include "common_exp.h"
#include "ISOModem_DRV.h"
#include "Modem_IODrv.h"
#include "exports.h"
#include "IODrive.h"
#include "Regist.h"
#include "ISOModem.h"
#include "loopbuf.h"
#define EI_modem_set_error(a,b) TRACE("error in %s",__LINE__)
extern EM_modem_STS EG_modem_STS;
/* define of possible rece_data_flag value */
#define EM_HDLC_DATA_NORMAL 1
#define EM_HDLC_DATA_SPECIAL 2
#define EM_HDLC_DATA_OCTNUM1 3
#define EM_HDLC_DATA_OCTNUM2 4
#define EM_HDLC_DATA_RATE1 5
#define EM_HDLC_DATA_RATE2 6
#define EM_MODEM_V80_TRANSFER_COUNT 20 /*转义字符的个数*/
char EI_hdlc_insert_rece(unsigned char i);
char EI_hdlc_insert_send(unsigned char *buf , unsigned char i);
char EI_hdlc_send_v80(unsigned char *buf);
unsigned char EM_hdlc_special_rece[EM_MODEM_V80_TRANSFER_COUNT][2]=
{
{0x19,0x00},/*0 0x19 0x5C*/
{0x99,0x00},/*1 0x19 0x76*/
{0x11,0x00},/*2 0x19 0xA0*/
{0x13,0x00},/*3 0x19 0xA1*/
{0x19,0x19},/*4 0x19 0x5D*/
{0x99,0x99},/*5 0x19 0x77*/
{0x11,0x11},/*6 0x19 0xA2*/
{0x13,0x13},/*7 0x19 0xA3*/
{0x19,0x99},/*8 0x19 0xA4*/
{0x19,0x11},/*9 0x19 0xA5*/
{0x19,0x13},/*10 0x19 0xA6*/
{0x99,0x19},/*11 0x19 0xA7*/
{0x99,0x11},/*12 0x19 0xA8*/
{0x99,0x13},/*13 0x19 0xA9*/
{0x11,0x19},/*14 0x19 0xAA*/
{0x11,0x99},/*15 0x19 0xAB*/
{0x11,0x13},/*16 0x19 0xAC*/
{0x13,0x19},/*17 0x19 0xAD*/
{0x13,0x99},/*18 0x19 0xAE*/
{0x13,0x11} /*19 0x19 0xAF*/
};
unsigned char EM_hdlc_special_send[EM_MODEM_V80_TRANSFER_COUNT][2]=
{
{0x19,0x5C},/*0 0x19*/
{0x19,0x76},/*1 0x99*/
{0x19,0xA0},/*2 0x11*/
{0x19,0xA1},/*3 0x13*/
{0x19,0x5D},/*4 0x19 0x19*/
{0x19,0x77},/*5 0x99 0x99*/
{0x19,0xA2},/*6 0x11 0x11*/
{0x19,0xA3},/*7 0x13 0x13*/
{0x19,0xA4},/*8 0x19 0x99*/
{0x19,0xA5},/*9 0x19 0x11*/
{0x19,0xA6},/*10 0x19 0x13*/
{0x19,0xA7},/*11 0x99 0x19*/
{0x19,0xA8},/*12 0x99 0x11*/
{0x19,0xA9},/*13 0x99 0x13*/
{0x19,0xAA},/*14 0x11 0x19*/
{0x19,0xAB},/*15 0x11 0x99*/
{0x19,0xAC},/*16 0x11 0x13*/
{0x19,0xAD},/*17 0x13 0x19*/
{0x19,0xAE},/*18 0x13 0x99*/
{0x19,0xAF} /*19 0x13 0x11*/
};
const unsigned char EM_hdlc_end_char[2] = {0x19,0xB1};
/*
功能:当有转义字符出现时,该函数将V80数据对应的HDLC数据保存在接收缓冲区内并将当前状态改为正常数据
*/
char EI_hdlc_insert_rece(unsigned char i)
{
loop_write(EG_modem_STS.v80_recvbuf,(char *)&i,1);
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
return EM_SUCCESS;
}
/*
功能:将指定的数据保存在发送数据缓冲区内
*/
char EI_hdlc_insert_send(unsigned char *buf , unsigned char len)
{
uchar i=0;
if(i+EG_modem_STS.v80_sendbuf_len>sizeof(EG_modem_STS.v80_sendbuf))
{
uprintf("ERROR:%s not enough buf\r\n",__FUNCTION__);
return EM_ERROR;
}
for(i=0;i<len;i++)
{
EG_modem_STS.v80_sendbuf[EG_modem_STS.v80_sendbuf_len++] = buf[i];
}
return EM_SUCCESS;
}
/*
功能:完成HDLC格式数据转化为V80格式数据
注意:实际上只能处理小等于2字节的数据
*/
char EI_hdlc_send_v80(unsigned char *buf)
{
unsigned char i;
/*搜索匹配的要发送的HDLC字符串*/
for ( i = 0 ; i < EM_MODEM_V80_TRANSFER_COUNT ; i++)
{
if ( buf[0]==EM_hdlc_special_rece[i][0] && buf[1]==EM_hdlc_special_rece[i][1])
{
break;
}
}
if ( i == EM_MODEM_V80_TRANSFER_COUNT)
{
EI_modem_set_error(EM_MODEM_FRAME_ERROR,71);
return EM_MODEM_ERROR;
}
/*找到了对应的转义字符并填充*/
if ( EI_hdlc_insert_send(EM_hdlc_special_send[i] , 2) == EM_MODEM_ERROR)
{
return EM_MODEM_ERROR;
}
EG_modem_STS.v80_s.send_data_flag = EM_HDLC_DATA_NORMAL;
return EM_MODEM_SUCCESS;
}
/*
功能:将指定的数据帧数据转化为V80格式后保存在EG_modem_STS.v80_sendbuf中
当转换成功后将返回成功,否则返回失败
*/
char EI_hdlc_transmit_hdlctov80(unsigned char *buf , unsigned int len)
{
unsigned char temp[2];
unsigned int i;
char ret = EM_MODEM_SUCCESS;
memset(temp,0x00,sizeof(temp));
i = 0;
memset(EG_modem_STS.v80_sendbuf,0x00,sizeof(EG_modem_STS.v80_sendbuf));
EG_modem_STS.v80_sendbuf_len = 0;
EG_modem_STS.v80_s.send_data_flag = EM_HDLC_DATA_NORMAL;
while( i != len)
{
switch(buf[i])
{
case 0x19:
case 0x99:
case 0x11:
case 0x13:
switch(EG_modem_STS.v80_s.send_data_flag)
{
case EM_HDLC_DATA_NORMAL:
temp[0] = buf[i];
EG_modem_STS.v80_s.send_data_flag = EM_HDLC_DATA_SPECIAL;
break;
case EM_HDLC_DATA_SPECIAL:
temp[1] = buf[i];
ret = EI_hdlc_send_v80(temp);
if ( ret == EM_MODEM_ERROR)
{
goto end;
}
break;
default:
EI_modem_set_error(EM_MODEM_SYSTEM_ERROR,72);
ret = EM_MODEM_ERROR;
goto end;
}
break;
default:
switch (EG_modem_STS.v80_s.send_data_flag)
{
case EM_HDLC_DATA_SPECIAL: // 之前是转义数据 单个的字符0x19/0x99/0x11/0x13
temp[1] = 0;
if ( EI_hdlc_send_v80(temp) == EM_MODEM_ERROR)
{
ret = EM_MODEM_ERROR;
goto end;
}/*这里不要break,因为该字节作为正常字节要发送*/
case EM_HDLC_DATA_NORMAL: // 之前是正常数据
if ( EI_hdlc_insert_send(buf+i,1) == EM_MODEM_ERROR)
{
ret = EM_MODEM_ERROR;
goto end;
}
break;
default:
EI_modem_set_error(EM_MODEM_SYSTEM_ERROR,73);
ret = EM_MODEM_ERROR;
goto end;
}
break;
}
i++;
}
if ( EG_modem_STS.v80_s.send_data_flag == EM_HDLC_DATA_SPECIAL)//最后一个是需要转义的字符
{
temp[1] = 0;
if ( EI_hdlc_send_v80(temp) == EM_MODEM_ERROR)
{
ret = EM_MODEM_ERROR;
goto end;
}
}
end:
if ( ret == EM_MODEM_ERROR)
{
;
}
else
{/*发送要发送的数据*/
/*在数据末尾加上结束字符 0x19 0xB1*/
EI_hdlc_insert_send((uchar *)EM_hdlc_end_char , sizeof(EM_hdlc_end_char));
}
return ret;
}
/*
功能:完成v80数据的解析,调用hdlc解析函数
1、数据由V80转换为HDLC帧格式
2、数据保存在EG_modem_STS.v80_recvbuf中
3、当检测到数据帧结束字符时调用协议处理函数EI_hdlc_protocol_process完成后续的处理
*/
void EI_hdlc_receive_v80tohdlc(unsigned char temp)
{
_loopbuf *buf = EG_modem_STS.v80_recvbuf;
unsigned char clr_char;
loop_write(buf,(char *)&temp,1);
switch(EG_modem_STS.v80_s.rece_data_flag)
{
case EM_HDLC_DATA_NORMAL:/*普通数据*/
switch(temp)
{
case 0x19:
case 0x99:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_SPECIAL;
break;
}
break;
case EM_HDLC_DATA_SPECIAL:/*特殊字符,一般是双字节*/
loop_clr_end(buf,(char *)&clr_char);
loop_clr_end(buf,(char *)&clr_char);
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
switch(temp)
{
case 0x5c: // t/r one 0x19
EI_hdlc_insert_rece(0x19);break;
case 0x76: // t/r one 0x99
EI_hdlc_insert_rece(0x99);break;
case 0xA0: // t/r one 0x11
EI_hdlc_insert_rece(0x11);break;
case 0xA1: // t/r one 0x13
EI_hdlc_insert_rece(0x13);break;
case 0x5D: // t/r two 0x19
EI_hdlc_insert_rece(0x19);EI_hdlc_insert_rece(0x19);break;
case 0x77: // t/r two 0x99
EI_hdlc_insert_rece(0x99);EI_hdlc_insert_rece(0x99);break;
case 0xA2: // t/r two 0x11
EI_hdlc_insert_rece(0x11);EI_hdlc_insert_rece(0x11);break;
case 0xA3: // t/r two 0x13
EI_hdlc_insert_rece(0x13);EI_hdlc_insert_rece(0x13);break;
case 0xA4: // t/r 0x19 0x99
EI_hdlc_insert_rece(0x19);EI_hdlc_insert_rece(0x99);break;
case 0xA5: // t/r 0x19 0x11
EI_hdlc_insert_rece(0x19);EI_hdlc_insert_rece(0x11);break;
case 0xA6: // t/r 0x19 0x13
EI_hdlc_insert_rece(0x19);EI_hdlc_insert_rece(0x13);break;
case 0xA7: // t/r 0x99 0x19
EI_hdlc_insert_rece(0x99);EI_hdlc_insert_rece(0x19);break;
case 0xA8: // t/r 0x99 0x11
EI_hdlc_insert_rece(0x99);EI_hdlc_insert_rece(0x11);break;
case 0xA9: // t/r 0x99 0x13
EI_hdlc_insert_rece(0x99);EI_hdlc_insert_rece(0x13);break;
case 0xAA: // t/r 0x11 0x19
EI_hdlc_insert_rece(0x11);EI_hdlc_insert_rece(0x19);break;
case 0xAB: // t/r 0x11 0x99
EI_hdlc_insert_rece(0x11);EI_hdlc_insert_rece(0x99);break;
case 0xAC: // t/r 0x11 0x13
EI_hdlc_insert_rece(0x11);EI_hdlc_insert_rece(0x13);break;
case 0xAD: // t/r 0x13 0x19
EI_hdlc_insert_rece(0x13);EI_hdlc_insert_rece(0x19);break;
case 0xAE: // t/r 0x13 0x99
EI_hdlc_insert_rece(0x13);EI_hdlc_insert_rece(0x99);break;
case 0xAF: // t/r 0x13 0x11
EI_hdlc_insert_rece(0x13);EI_hdlc_insert_rece(0x11);break;
case 0xB0:
break;
case 0xB1:
/*帧分隔,前一个帧是完整的帧*/
if( loop_size(buf) > 0)
{
EI_hdlc_protocol_process();/* 发送给协议层处理 */
loop_reset(buf);
goto end;
}
break;
case 0xB2:/*丢弃前面接收到的所有数据*/
loop_reset(buf);
break;
case 0xB4:
case 0xB5:
case 0xB6:
case 0xB7:
break;
case 0xB8:
case 0xB9:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_OCTNUM1;
break;
case 0xBA:
EI_ModemOffline();
break;
case 0xBB:
case 0xBC:
break;
case 0xBE:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_RATE1;
break;
default:
loop_reset(buf);
break;
}
break;
case EM_HDLC_DATA_OCTNUM1:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_OCTNUM2;
break;
case EM_HDLC_DATA_OCTNUM2:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
break;
case EM_HDLC_DATA_RATE1:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_RATE2;
EG_modem_STS.v80_s.txrate = temp;
break;
case EM_HDLC_DATA_RATE2:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
EG_modem_STS.v80_s.rxrate = temp;
break;
default:
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
break;
}
end:
return;
}
void EI_Init_v80(void)
{
EG_modem_STS.v80_s.rece_data_flag = EM_HDLC_DATA_NORMAL;
EG_modem_STS.v80_s.send_data_flag = EM_HDLC_DATA_NORMAL;
EG_modem_STS.v80_s.txrate = 0xff;
EG_modem_STS.v80_s.rxrate = 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -