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

📄 funcframe.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
//This file containing 
#include "includes.h"

#define MAX_TX_FRAME_LEN	138
#define MAX_RX_FRAME_LEN	256

#define F_FLAG				0x7e
#define F_ESC				0x7d

#define FR_END				0x00
#define FR_START			0x01


#define NULL_PTR			(INT8U rom *) 0xffffff
//port
#define PT_NONE				0x00
#define PT_HDLC				0x01
#define PT_SM				0x02

//Service type word in frame
#define FT_PAYPHONE			0x04
#define FT_SYS				0x00
//Subtype
#define FC_DATA				0x00
#define FC_ACK				0x01
#define FC_MON				0x02

#define BIT_SYN				0b01000000
#define BIT_TOBECONTINUE 	0b10000000

//link status
#define LS_IDLE				0	//idle state
#define LS_WAITANS			1	//waiting answer
#define LS_WAITFOLLOW		2	//waiting following frames


#pragma romdata EXTRAM
INT8U rom CurNT;
INT8U rom CurNR;

#pragma code MYCODE
void tskRxProtocol(void * data){
	void rom * pMsg;
	INT8U err;
	      
	CurNT = 0;
	CurNR = 0;
	for(;;){        
		pMsg = OSQPend(peventRxProtocol, 0, &err);                                       //Wait for the messages
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){                            //If is a direct message--just a value
				switch ((INT24U)pMsg){
					
				}
			}
			else{                                                  //If it's a undirect message--a pointer
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_PROT_RECEIVE:
						Data_Rx_Proc(((MSG_HEAD *)pMsg)->pMem,((MSG_PROTOCOL *)pMsg)->Port);
						break;
				}
				if(((MSG_HEAD *)pMsg)->Attached == TRUE){
					OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				}
				OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
			}
		}
	}
} 


void tskTxProtocol(void * data){
	void rom * pMsg;            //The pointer of message, it has to be a pointer point to the "rom: region
	INT8U err;                      //Used to return the error value. It must be a variable in data region
	for(;;){                                                                               //The main loop
		pMsg = OSQPend(peventTxProtocol, 0, &err);                                       //Wait for the messages
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){                            //If is a direct message--just a value
				switch ((INT24U)pMsg){
					
				}
			}
			else{                                                  //If it's a undirect message--a pointer
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_MCNM_TRANSMIT:
						Data_Tx_Proc(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
						break;
				}
				if(((MSG_HEAD *)pMsg)->Attached == TRUE){
					OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				}
				OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
			}
		}
	}
} 


//This level deal with frame
void Data_Tx_Proc(INT8U rom * ptrF, INT16U Len){
	for(;;){
		if(Len>=MAX_TXFRAME_LEN){
			SendData(ptrF,MAX_TXFRAME_LEN,ActivePort);
		}
		else{
			SendData(ptrF,Len, port);
		}
		
		pMsg = OSQPend(peventTxProtocol, TimeOut, &err);
		
		if(err == OS_TIMEOUT){
			Err_Cnt++;
			if(Err_Cnt >= 3){
				OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXFAIL);
				return;
			}
		}
		else if(err == OS_NO_ERR){
			if((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_MCNM_TRANSMIT){
				OSQPost(peventMCNM,(OS_EVENT *)MSG_MCNM_TXBUSY);
			}
			else if ((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
				if(TestACK(ptrF) == TRUE){
					if(Len>=MAX_TXFRAME_LEN){
						Len = Len - MAX_TXFRAME_LEN;
						ptrF = ptrF+MAX_TXFRAME_LEN;
					}
					else Len=0;
				}
			}
			if(((MSG_HEAD *)pMsg)->Attached == TRUE){
				OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
			}
			OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
		}
		if(Len == 0){
			OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXSUCCESS);
			return;
		}
	}
}

void Data_Rx_Proc(INT8U rom * ptrF, INT8U port){
	INT8U rom * pRxSav;
	INT8U rom * pRx;
	INT8U rom * pSml;
	INT8U len,err;
	INT8U rom * pMem;
	
	pRx = NULL_PTR;
	len = 0;
	for(;;){
		if(TestToBeContinue(ptrF)==TRUE){
			pRx=OSMemGet(pmemHug,&err);
			if(err != OS_NO_ERR) break;
			pRxSav = pRx;
			pMem = pmemHug;
			len = *ptrF;
			ptrF +=5;
			for(i=0; i<len-5; i++){
				*pRx++ = *ptrF++;
			}
			SendACK();
			OSMemPut(pMem,ptrF);
			
			pMsg = OSQPend(peventRxProtocol, TimeOut, &err);
			if(err == OS_TIMEOUT){
				OSMemPut(pMem,pRx);
				break;
			}
			else{
				if ((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
					ptrF = ((MSG_HEAD *)pMsg)->pMem;
					if(TestNR(ptrF) == TRUE){
						len = len + *ptrF;
					}
				}
				if(((MSG_HEAD *)pMsg)->Attached == TRUE){
					OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				}
				OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
				}
			}
		else{
			if(pRx == NULL_PTR){
				pRx=OSMemGet(pmemLge,&err);
				if(err != OS_NO_ERR) break;
				pSml = OSMemGet(pMemSml,&err);
				if(err != OS_NO_ERR) break;
				pMem = pMemLge;
				pRxSav = pRx;
			}
			len = len + *ptrF;
			ptrF +=5;
			pSml = OSMemGet(pMemSml,&err);
			if(err != OS_NO_ERR) {
				OSMemPut(pMem, pRx);
				break;
			}
			for(i=0; i<len-5; i++){
				*pRx++ = *ptrF++;
			}
			((MSG_HEAD *)pSml)->Msg_ID = MSG_MCNM_RECEIVE;
			((MSG_HEAD *)pSml)->Origin = peventRxProtocol;
			((MSG_HEAD *)pSml)->pmemME = pMemSml;
			((MSG_HEAD *)pSml)->Attached = TRUE;
			((MSG_HEAD *)pSml)->LenOfAttach = len-5;
			((MSG_HEAD *)pSml)->pMem = pRxSav;
			((MSG_HEAD *)pSml)->pmemATT = pMem;
			((MSG_HEAD *)pSml)->LenOfBody = 0;
			SendACK();
			OSQPost(peventMCNM, pSml);
		}
	}
}

INT8U TestNR(INT8U rom *ptrF){
}
INT8U TestACK(INT8U rom *ptrF){
}
INT8U TestToBeContinue(INT8U rom *ptrF){
}

void SendACK(INT8U NT, INT8U NR, INT8U Type, INT8U SubNet, INT8U port){
	INT8U rom * pT0;
	INT8U rom * pT1;
	INT8U err;
	
	
	err = FC_ACK;
	err = err<<4;
	Type |= err;
	if(port == PT_HDLC) Type |= 0x08;
	
	pT0 = OSMemGet( pMemSml, &err);
	if(err == OS_NO_ERR){
		pT1 = OSMemGet( pMemLge, &err);
		if(err == OS_NO_ERR){
			((MSG_HEAD *)pT0)->Msg_ID = MSG_PROT_TRANSMIT;
			((MSG_HEAD *)pT0)->Origin = peventProtocol;
			((MSG_HEAD *)pT0)->pmemME = pMemSml;
			((MSG_HEAD *)pT0)->Attached = TRUE;
			((MSG_HEAD *)pT0)->LenOfAttach = 5;
			((MSG_HEAD *)pT0)->pMem = pT1;
			((MSG_HEAD *)pT0)->pmemATT = pMemSml;
			((MSG_HEAD *)pT0)->LenOfBody = 0;
			
			((FRAME_STRUCT *)pT1)->Len = 5;
			((FRAME_STRUCT *)pT1)->NT = NT;
			((FRAME_STRUCT *)pT1)->NR = NR;
			((FRAME_STRUCT *)pT1)->Type = Type;
			((FRAME_STRUCT *)pT1)->SubNet = SubNet;
			OSQPost(peventDEBUG, pSml);
		}
	}
}

void SendFrame(INT8U port, INT8U rom * ptrD, INT16U len){
}

⌨️ 快捷键说明

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