⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isomodem_v80.c

📁 modem数据通信源码
💻 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 + -