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

📄 tskprot.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(Syn_Needed==TRUE) Option = BIT_SYN;
	else Option = 0;
	Err_Cnt = 0;
	
	SendEn = TRUE;//function word, for fear that some unwanted messages received and resend former frame
	for(;;){
		if(SendEn == TRUE){
			//Send one frame
			if(Len>=MAX_TX_FRAME_LEN){		//huge data block to be trans.
				Option |= BIT_TOBECONTINUE;
				SendFrame(ptrF,MAX_TX_FRAME_LEN,port,Option);
			}
			else{	//normal data block to be trans
				SendFrame(ptrF,Len, ActivePort,Option);
			}
		}
		//Waiting for ACK or timeout
		pMsg = OSQPend(peventTxProtocol, OS_TICKS_PER_SEC * CurTimeOut, &err);
		if(err == OS_TIMEOUT){
			SendEn = TRUE;
			Err_Cnt++;
			if(Err_Cnt >= 3){	// if certain frame timeout 3 times continuesly, transmit fail
				OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXFAIL);
				return;
			}
		}
		else if(err == OS_NO_ERR && (INT24U)pMsg<PTR_MAX){
			if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_MCNM_TRANSMIT){//if another MCNM data block arrived
				OSQPost(peventMCNM,(OS_EVENT *)MSG_MCNM_TXBUSY);
				SendEn = FALSE;
			}
			else if (((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){//if an correct ACK
				if(TestACK(((MSG_HEAD *)pMsg)->pMem) == TRUE){
					//modify the CurNT , data block length and data pointer
					if(Len>=MAX_TX_FRAME_LEN){
						Len = Len - MAX_TX_FRAME_LEN;
						ptrF = ptrF+MAX_TX_FRAME_LEN;
					}
					else Len=0;
					Err_Cnt = 0;
					CurNT++;
					CurNT &= 0x3f;
					SendEn = TRUE;
				}
				else SendEn = FALSE;
			}
			Func_Clear_Msg(pMsg);
			//if(((MSG_HEAD *)pMsg)->Attached == TRUE){
			//	OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
			//}
			//OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
		}
		
		if(Len == 0){//if finish sending
			OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXSUCCESS);
			return;
		}
	}
}
/*
void Data_Rx_Proc(INT8U rom * ptrF, INT8U port, OS_MEM *pMem){
	INT8U rom * pRxSav;
	INT8U rom * pRx;
	INT8U rom * pSml;
	INT8U len,err,i,type,Waiting;
	INT8U rom * pMsg;
	INT16U TimeOut;
	
	pRx = NULL_PTR;
	TimeOut = (port == PT_HDLC)? 1000:5000;	//10s or 50s
	len = 0;
	Type = *(ptrF+3) & 0x07;
	SubType = (*(ptrF+3) & 0xf0)>>4;
	SubNet = *(ptrF+4);
	
	if(TestNT(ptrF)== FALSE) Syn_Needed = TRUE; //if the NR in information frame does not agree with local NT,
												//resynchronization is needed
	pRx = (INT8U rom *)0xffffff;
	Waiting = FALSE;	//for fear that some unexpected message to introduce error into data 
	for(;;){
		if(Waiting == TRUE){
			pMsg = OSQPend(peventRxProtocol, TimeOut, &err);
			if(err == OS_TIMEOUT){
				OSMemPut(pMem,pRx);
				break;
			}
			else if ((INT24U)pMsg<PTR_MAX && err == OS_NO_ERR){
				if (((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
					ptrF = ((MSG_HEAD *)pMsg)->pMem;
					pMem = ((MSG_HEAD *)pMsg)->pmemATT;
					((MSG_HEAD *)pMsg)->Attached = FALSE;
				}
				if(((MSG_HEAD *)pMsg)->Attached == TRUE){
					OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				}
				OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
				}
			}
		}
		
		if(TestNR(ptrF) != TRUE){
			if((INT24U)pRx != 0xffffff){
				OSMemPut(pMem,pRx);
			}
			return;
		}
		CurNR++;
		CurNR &= 0x3f;
		if(TestToBeContinue(ptrF)==TRUE){
			Waiting = 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(port);//no wait here
			OSMemPut(pMem,ptrF);
		}
		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;
			((MSG_PROTOCOL *)pSml)->Type = Type;
			((MSG_PROTOCOL *)pSml)->SubType = SubType;
			((MSG_PROTOCOL *)pSml)->SubNet = SubNet;
			OSQPost(peventMCNM, pSml);
			OSTimeDly(len/32+1);	// the worst situation is to write "len" bytes in MCNM, so cost about len/32 *10 ms
			SendACK(port);
			break;
		}
	}
}
*/
INT8U TestNR(INT8U rom *ptrF){
	INT8U NT;
	NT = ((FRAME_STRUCT *)ptrF)->NT;
	if((NT & 0x3f)==CurNR) return (0);
	else{
		if((NT & BIT_SYN) != 0){
			CurNR = NT & 0x3f;
			return (1);
		}
		return(2);
	}
}

INT8U TestNT(INT8U rom *ptrF){
	INT8U NR;
	NR = ((FRAME_STRUCT *)ptrF)->NR;
	if((NR & 0x3f)==CurNT) return (TRUE);
	else{
		return(FALSE);
	}
}

//if the frame is an ACK and the NR byte agree with the CurNT(point to (CurNT+1)mod 64 )
INT8U TestACK(INT8U rom *ptrF){
	INT8U NR;
	if(((((FRAME_STRUCT *)ptrF)->Type) & 0xf0) == 0x10){
		NR = ((FRAME_STRUCT *)ptrF)->NR;
		if((NR & 0x3f)== ((CurNT+1)&0x3f)) return (TRUE);
		else return(FALSE);
	}
	else return (FALSE);
}

INT8U TestToBeContinue(INT8U rom *ptrF){
	if(((((FRAME_STRUCT *)ptrF)->NT) & BIT_TOBECONTINUE) != 0) return (TRUE);
	else return (FALSE);
}

void SendACK(INT8U port){
	INT8U rom * pT0;
	INT8U rom * pT1;
	INT8U err;
	INT8U Type;
	
	
	Type = FC_ACK;
	Type = Type<<4;
	if(port == PT_HDLC) Type |= 0x08;
	Type = Type | 0x04;
	
	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 = peventRxProtocol;
			((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 = CurNT;
			CurNR++;
			CurNR &= 0x3f;
			((FRAME_STRUCT *)pT1)->NR = CurNR;
			((FRAME_STRUCT *)pT1)->Type = Type;
			((FRAME_STRUCT *)pT1)->SubNet = 1;
			if(port== PT_HDLC){
				OSQPost(peventDEBUG, pT0);
			}
			else OSQPost(peventWICCmd, pT0);
		}
	}
}

void SendFrame(INT8U rom * ptrD, INT16U len, INT8U port, INT8U option){
	INT8U rom * pT0;
	INT8U rom * pT1;
	INT8U err;
	INT8U Type,i;
	
	
	if(port == PT_HDLC) Type = 0x0c;
	else Type = 0x04;
	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 = peventTxProtocol;
			((MSG_HEAD *)pT0)->pmemME = pMemSml;
			((MSG_HEAD *)pT0)->Attached = TRUE;
			((MSG_HEAD *)pT0)->LenOfAttach = len+5;
			((MSG_HEAD *)pT0)->pMem = pT1;
			((MSG_HEAD *)pT0)->pmemATT = pMemSml;
			((MSG_HEAD *)pT0)->LenOfBody = 0;
			
			((FRAME_STRUCT *)pT1)->Len = len+5;
			((FRAME_STRUCT *)pT1)->NT = CurNT | option;
			((FRAME_STRUCT *)pT1)->NR = CurNR;
			((FRAME_STRUCT *)pT1)->Type = Type;
			((FRAME_STRUCT *)pT1)->SubNet = 0;
			pT1 += 5;
			for(i=0; i<len; i++){
				*pT1 = *ptrD;
				pT1++;
				ptrD++;
			}
			if(port== PT_HDLC){
				OSQPost(peventDEBUG, pT0);
			}
			else OSQPost(peventWICCmd, pT0);
		}
	}
}

⌨️ 快捷键说明

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