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

📄 uart0.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	unsigned char c;
	c=Byte;
	c=c>>4;PrintCh(c);
	c=Byte;c=c&0x0F;PrintCh(c);
}

void PrintWord(unsigned int Word)//以十六进制格式显示1个字数据
{
	PrintByte(Word>>8);
	PrintByte(Word&0xFF);
}

void PrintLong(unsigned long LongWord)//以十六进制格式显示1个长字数据
{
	PrintWord(LongWord>>16);
	PrintWord(LongWord&0xFFFF);
}

#endif
/*
*****************************************************************************************************
*Func:  发送一个字符串(SRAM)
*Note:
*    1:
*    2:
*****************************************************************************************************
*/
void Uart0Puts(unsigned char *string)
{
    while(*string) {
        PrintChar(*string++);
    }       
}


/*
*****************************************************************************************************
*Func:  发送一个字符串(SRAM) ,长度已知
*Note:
*    1:
*    2:
*****************************************************************************************************
*/
void Uart0Putsl(unsigned char *string,unsigned int length)
{
    while(length--) {
        PrintChar(*string++);
    }       
}


/*
*****************************************************************************************************
*Func:  发送一个字符串(flash/code)
*Note:
*    1:
*    2:
*****************************************************************************************************
*/
void Uart0Putf(unsigned char code *string)
{                      
    unsigned char c;
	
    while(*string) {   
        c=*string++; 		
        PrintChar(c);
    }
}


/*
*****************************************************************************************************
*Func:  一侦结束判断   终端到网络的数据
*Note:
*    1: 接收字节时的时间与当前时间比较,过了50MS,且接收缓冲区不为空,为一侦结束
*    2:
*****************************************************************************************************
*/
void FramePush(unsigned char *source,unsigned int length)
{
    unsigned int  i;

	while (FrameIn < MAX_BUF_NUM) { 
        if (0 == Te2NetBuf[FrameIn].statu) {
            for (i=0; i<length; i++) {
                Te2NetBuf[FrameIn].buf[i] = source[i];    //拷贝数据
			}
			Te2NetBuf[FrameIn].statu  = 10;               //有数据
			Te2NetBuf[FrameIn].ttl    = 20;               //生存时间:单位S
			Te2NetBuf[FrameIn].length = length;           //长度
			FrameIn++;
			break;
		} else {
            FrameIn++;
		}
	}

	if (FrameIn >= MAX_BUF_NUM) {
        FrameIn = 0;
	}
}


/*
*****************************************************************************************************
*Func:  网络到终端的数据缓冲区
*Note:
*    1: 
*    2:
*****************************************************************************************************
*/
void FramePush2(unsigned char *source,unsigned int length)
{
    unsigned int  i;

	while (FrameIn2 < MAX_BUF_NUM2) { 
        if (0 == Net2TeBuf[FrameIn2].statu) {
            for (i=0; i<length; i++) {
                Net2TeBuf[FrameIn2].buf[i] = source[i];    //拷贝数据
			}
			Net2TeBuf[FrameIn2].statu  = 10;               //有数据
			Net2TeBuf[FrameIn2].ttl    = 20;               //生存时间:单位S
			Net2TeBuf[FrameIn2].length = length;           //长度
			FrameIn2++;
			break;
		} else {
            FrameIn2++;
		}
	}

	if (FrameIn2 >= MAX_BUF_NUM2) {
        FrameIn2 = 0;
	}
}

/*
*****************************************************************************************************
*Func:  一侦结束判断 
*Note:
*    1: LOOPS:比如收到一侦数据5000个,而一侦BUF最大就只有1460个,要循环5000/1460次,每次1460个,
*    2: MOD,是余数,接在后面
*    //ES = 0;                                       // 很重要,洪金枝 ES=1在GETCH里恢复  
*****************************************************************************************************
*/
void Data2_Te2NetBuf(void)
{
    	
    inRxBuf_Bak = inRxBuf;                           //减少分侦的可能用在Mygetch前
 
    if (TimerMil[T_FRAME_END]) {                     // 1侦数据未结束 
        return;
	}

    Rx0_Counter = 0;
    while (Mygetch(&Mid_Buf[Rx0_Counter])) {        
        if (++Rx0_Counter == MAX_FRAME_SIZE) {
            break;
		}
	}

	if (Rx0_Counter == 0) {                        //FrameEndTime=0,有两种可能1:一侦结束;2:从没数据
        return ;
	} 

	if (Rx0_Counter > MAX_FRAME_SIZE) {            //保护,其实不会运行到这
        return;
	}

	FramePush(Mid_Buf,Rx0_Counter);
}


/*
*****************************************************************************************************
*Func:   
*Note:
*****************************************************************************************************
*/
#ifdef _DEBUG_
void Parse_Ack(unsigned char ack)
{
    Uart0Putf("\r\n");
    Uart0Putf("第  ");PrintByte(FrameOut);Uart0Putf("侦:");
    Uart0Putf("\r\n数据:");Uart0Putsl(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);
	Uart0Putf("\r\n");				
    switch (ack) {
		case TRUE:
			 Uart0Putf("成功:发送成功");
			 break;
		case ERR_BUF_FULL:
			 Uart0Putf("失败:等待缓冲满)"); 
   			 break;
		case ERR_NO_ESTABLISH:
			 Uart0Putf("失败:没建立链接"); 
   			 break;
		default:
			 Uart0Putf("失败:未知\r\n"); 
   			 break; 
		}
}
#endif

#ifdef _DEBUG_
    #define ParseAck(x) Parse_Ack(x)
#else 
    #define ParseAck(x) 
#endif


/*
*****************************************************************************************************
*Func:   解析数据如果是配置命令,执行配置函数,如果是数据往NET发送
*Note:
*    1: 如果发送失败返回,STATU不清0等待下一次进来再尝试,用生存时间来清statu0
*    2:
//else {                                                 //不是配置命令,且未连接,数据先保留
			  //	Uart0Putsl(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);Uart0Putf("\r\n");	                    
				//break;                                             //调试用,实际中可以直接跳出,数据先保留
			//} 
*****************************************************************************************************
*/
void Parse_Te2NetBuf(void)
{
    unsigned char ack=0;
 
	while (FrameOut<MAX_BUF_NUM) {
        if (Te2NetBuf[FrameOut].statu > 0) {                         //缓冲区有数据
		    if ((Te2NetBuf[FrameOut].buf[0] == 'W') && (Te2NetBuf[FrameOut].buf[1] == 'P') 
			   &&(Te2NetBuf[FrameOut].buf[2] == '-')) {
                ParseUartCmd(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);//如果是配置命令,解析命令
			} else if(bConnect) {                                    //如果已经连接往以太网发送 
				ack = User_TCPSend(IndexOfClient,Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);
                ParseAck(ack);
				if (ack != TRUE) {                                   //数据发送失败状态不清0,保留数据
					break;
				}
			} 
			Te2NetBuf[FrameOut++].statu  = 0;                        //清0很重要
			break;                                                   //处理完一侦退出,不要连续做四侦
		} else {
	        FrameOut++;
		}
	}

	if (FrameOut >= MAX_BUF_NUM) {
        FrameOut = 0;
	}
}


/*
*****************************************************************************************************
*Func:   解析网络到终端的数据,如果是配置命令,执行配置函数,如果是数据往终端发送
*Note:
*    1:  如果发送失败返回,STATU不清0等待下一次进来再尝试,用生存时间来清statu0
*    2: 
_UART_BUF_STRUCT_  xdata  Net2TeBuf[MAX_BUF_NUM2];  // 网络到终端
unsigned char      xdata  FrameIn2;                 //用来指向Net2TeBuf进入数据的标量
unsigned char      xdata  FrameOut2;                //用来指向Net2TeBuf取出数据的标量
*****************************************************************************************************
*/
void Parse_Net2TeBuf(void)
{ 
	while (FrameOut2 < MAX_BUF_NUM2) {
        if (Net2TeBuf[FrameOut2].statu > 0) {                         //缓冲区有数据
		    if ((Net2TeBuf[FrameOut2].buf[0] == 'W') && (Net2TeBuf[FrameOut2].buf[1] == 'P') 
			   &&(Net2TeBuf[FrameOut2].buf[2] == '-')) {
                ParseRemoteCmd(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length);  //如果是配置命令,解析命令
			} else {                                                  //不是配置命令,且未连接,数据先保留
                #ifdef  PROTOCOL_2004   
	                OnReceiveData2004(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length);//纯数据处理,回调收到数据函数,2004PRO
                #else                
				    Uart0Putsl(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length);
                #endif	                    
			}
			Net2TeBuf[FrameOut2++].statu  = 0;                         //清0很重要
			break;                                                    //处理完一侦退出,不要连续做四侦
		} else {
	        FrameOut2++;
		}
	}

	if (FrameOut2 >= MAX_BUF_NUM2) {
        FrameOut2 = 0;
	}
}


/*
*****************************************************************************************************
*Func:   发送心跳包
*Note:
*    1: 
*    2: 
*****************************************************************************************************
*/
void SendHeart(void)
{
    unsigned char heart='$';                    // 发送%

    FramePush(&heart,1);                        // 压入缓冲

	if (SendHeartFlag == FALSE) {
	    SendHeartFlag = TRUE;                       // 置已发标志
	    TimerSec[T_SOCKET_TTL] = SOCKET_TTL_SEC;    // 时间初始化2分钟
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -