亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? modbus_ascii.c

?? 44B0的串口接收發(fā)送程序 **** 現(xiàn)在共享這樣的代碼有些過時了
?? C
字號:
#include "44B.h"
#include "Modbus_ASCII.h"
#include <string.h>


/****************************************************************/
//
//							接收模塊
//
/****************************************************************/


static volatile RXDBUF RxdBuf;

//********************************************************************** 
//功 能: 幀讀指針加1
//**********************************************************************
static void pFrameRd_Inc(void)
{
	if(RxdBuf.FrameCnt>0)
	{
		if(RxdBuf.pFrameRd == (FRAMEPT *volatile)&RxdBuf.FramePt[FrameBufLen-1])
		{
			RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
		}
		else
		{
			RxdBuf.pFrameRd++;
		}
	}
}

//********************************************************************** 
//功 能:	以幀的Start指針為指針向接收緩沖區(qū)讀一字節(jié)
//讀1字節(jié)->清0->Start指針加1
//**********************************************************************
static volatile char FrameState_RdByte(void)
{
	volatile char ch;
	if(RxdBuf.ByteCnt>0)
	{
		ch = (volatile char)*RxdBuf.pFrameRd->Start;
		*RxdBuf.pFrameRd->Start = (volatile char)0;
		if(RxdBuf.pFrameRd->Start == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)])
		{
			RxdBuf.pFrameRd->Start = (char *volatile)&RxdBuf.Buf[0];
		}
		else
		{
			RxdBuf.pFrameRd->Start++;
		}
		return (ch);
	}
	else
	{
		return (0);
	}
}

//********************************************************************** 
//功 能: 	讀一幀數(shù)據(jù)
//**********************************************************************
int Modbus_GetFrame(char *pBuf)
{
	int i;
	int Len;
	if(RxdBuf.FrameCnt>0)
	{
		Len = RxdBuf.pFrameRd->FrameLen;
		if(*RxdBuf.pFrameRd->Start==FRAME_START && *RxdBuf.pFrameRd->End==FRAME_END)
		{
			for(i=0;i<Len;i++)
			{
				*pBuf++ = FrameState_RdByte();
			}
			RxdBuf.pFrameRd->Start = (char *volatile)0;
			RxdBuf.pFrameRd->End = (char *volatile)0;
			RxdBuf.pFrameRd->FrameLen = (volatile int)0;
			pFrameRd_Inc();
			rINTMSK |= BIT_URXD1;
			RxdBuf.ByteCnt -= Len;
			RxdBuf.FrameCnt--;
			rINTMSK &= ~BIT_URXD1;
			return (1);
		}
		else
		{
			for(i=0;i<Len;i++)
			{
				FrameState_RdByte();
			}
			RxdBuf.pFrameRd->Start = (char *volatile)0;
			RxdBuf.pFrameRd->End = (char *volatile)0;
			RxdBuf.pFrameRd->FrameLen = (volatile int)0;
			pFrameRd_Inc();
			rINTMSK |= BIT_URXD1;
			RxdBuf.ByteCnt -= Len;
			RxdBuf.FrameCnt--;
			rINTMSK &= ~BIT_URXD1;
			return (0);
		}
	}
	else
	{
		return (0);
	}
}

//********************************************************************** 
//功 能: 刪除接收緩沖區(qū)一字節(jié)數(shù)據(jù)
//刪除數(shù)據(jù)->地址&計(jì)數(shù)器減1
//**********************************************************************
static void RxdBuf_DelByte(void)
{
	if(RxdBuf.ByteCnt>0)
	{
		*RxdBuf.pWr = (volatile char)0;
		if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[0])
		{
			RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)];
		}
		else
		{
			RxdBuf.pWr--;
		}
		RxdBuf.ByteCnt--;
	}
}

//********************************************************************** 
//功 能: 向接收緩沖區(qū)寫一字節(jié)數(shù)據(jù)
//地址加1->寫數(shù)據(jù)->計(jì)數(shù)器加1
//**********************************************************************
static int RxdBuf_WrByte(const volatile char ch)
{
	if(RxdBuf.ByteCnt<RxdBufLen-1)
	{
		if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)])
		{
			RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0];
		}
		else
		{
			RxdBuf.pWr++;
		}
		*RxdBuf.pWr = (volatile char)ch;
		RxdBuf.ByteCnt++;
		return (1);
	}
	else
	{
		return (0);
	}
}


//********************************************************************** 
//功 能: 幀寫指針加1
//**********************************************************************
static void pFrameWr_Inc(void)
{
	if(RxdBuf.FrameCnt<FrameBufLen-1)
	{
		if(RxdBuf.pFrameWr == (FRAMEPT *volatile)&RxdBuf.FramePt[(FrameBufLen-1)])
		{
			RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
		}
		else
		{
			RxdBuf.pFrameWr++;
		}
	}
}

//********************************************************************** 
//功 能: 	串口接收中斷處理
//**********************************************************************
static void __irq UART1_ISR_Rxd(void)
{
	int i;
	char ch;
	do
	{
		ch = RdURXH1();
		switch(ch)
		{
			case FRAME_START:
				if( RxdBuf.pFrameWr->Start == (char *volatile)0 )
				{
					RxdBuf.pFrameWr->End = (char *volatile)0;
					RxdBuf.pFrameWr->FrameLen = (volatile int)0;
					if(RxdBuf_WrByte((volatile char)ch))
					{						
						RxdBuf.pFrameWr->FrameLen = (volatile int)1;
						RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr;
					}
				}
				else
				{
					for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
					{
						RxdBuf_DelByte();
					}
					RxdBuf.pFrameWr->Start = (char *volatile)0;
					RxdBuf.pFrameWr->End = (char *volatile)0;
					RxdBuf.pFrameWr->FrameLen = (volatile int)0;
					
					if(RxdBuf_WrByte((volatile char)ch))
					{						
						RxdBuf.pFrameWr->FrameLen = (volatile int)1;
						RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr;
					}
				}
				break;
			case FRAME_END:
				if( RxdBuf.pFrameWr->Start != (char *volatile)0 )
				{
					if(RxdBuf.FrameCnt<FrameBufLen-1 && RxdBuf.ByteCnt<RxdBufLen-1)
					{
						RxdBuf_WrByte((volatile char)ch);
						RxdBuf.pFrameWr->FrameLen++;
						RxdBuf.pFrameWr->End = (char *volatile)RxdBuf.pWr;
						pFrameWr_Inc();
						RxdBuf.FrameCnt++;
					}
					else
					{
						for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
						{
							RxdBuf_DelByte();
						}
						RxdBuf.pFrameWr->Start = (char *volatile)0;
						RxdBuf.pFrameWr->End = (char *volatile)0;
						RxdBuf.pFrameWr->FrameLen = (volatile int)0;
					}
				}
				else
				{
						for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
						{
							RxdBuf_DelByte();
						}
						RxdBuf.pFrameWr->Start = (char *volatile)0;
						RxdBuf.pFrameWr->End = (char *volatile)0;
						RxdBuf.pFrameWr->FrameLen = (volatile int)0;
				}
				break;
			default:
				if(RxdBuf.ByteCnt<RxdBufLen-1)
				{
					if(RxdBuf.pFrameWr->Start != (char *volatile)0)
					{
						if(RxdBuf_WrByte((volatile char)ch))
						{
							RxdBuf.pFrameWr->FrameLen++;
						}
					}
				}
				else
				{
					for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
					{
						RxdBuf_DelByte();
					}
					RxdBuf.pFrameWr->Start = (char *volatile)0;
					RxdBuf.pFrameWr->End = (char *volatile)0;
					RxdBuf.pFrameWr->FrameLen = (volatile int)0;
				}
				break;
		}
			
	}while( (rUFSTAT1&0xf) >0 );	//若RxD_FIFO計(jì)數(shù)器為0退出
	rI_ISPC = BIT_URXD1;			//清除中斷標(biāo)志
}

//********************************************************************** 
//功 能: 	Modbus數(shù)據(jù)接收緩沖區(qū)初始化
//**********************************************************************
static void Modbus_RxdBuf_Init(void)
{
	memset((char *)&RxdBuf,0,sizeof(RxdBuf));
	RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0];
	RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
	RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
	RxdBuf.ByteCnt = (volatile int)0;
	RxdBuf.FrameCnt = (volatile int)0;
	RxdBuf.pFrameWr->FrameLen = (volatile int)0;
}



/****************************************************************/
//
//							發(fā)送模塊
//
/****************************************************************/
static volatile TXDBUF TxdBuf;


//********************************************************************** 
//功 能: 讀指針加1
//**********************************************************************
static void TxdBuf_pRd_Inc(void)
{
	if(TxdBuf.ByteCnt>0)
	{
		if(TxdBuf.pRd == (char *volatile)&TxdBuf.Buf[(TxdBufLen-1)])
		{
			TxdBuf.pRd = (char *volatile)&TxdBuf.Buf[0];
		}
		else
		{
			TxdBuf.pRd++;
		}
	}
}


//********************************************************************** 
//功 能: 寫指針加1
//**********************************************************************
static void TxdBuf_pWr_Inc(void)
{
	if(TxdBuf.ByteCnt<TxdBufLen-1)
	{
		if(TxdBuf.pWr == (char *volatile)&TxdBuf.Buf[(TxdBufLen-1)])
		{
			TxdBuf.pWr = (char *volatile)&TxdBuf.Buf[0];
		}
		else
		{
			TxdBuf.pWr++;
		}
	}
}

//********************************************************************** 
//功 能: 	從發(fā)送緩沖區(qū)取一個byte 
//**********************************************************************
static const volatile char TxdBuf_RdByte(void)
{
	volatile char ch;
	if(TxdBuf.ByteCnt>0)
	{
		ch = (volatile char)*TxdBuf.pRd;
		*TxdBuf.pRd = (volatile char)0;
		TxdBuf_pRd_Inc();
		TxdBuf.ByteCnt--;
		return (ch);
	}
	else
	{
		return (0);
	}
}

//********************************************************************** 
//功 能: 向發(fā)送收緩沖區(qū)寫一字節(jié)數(shù)據(jù)
//寫數(shù)據(jù)->地址加1->計(jì)數(shù)器加1->向串口發(fā)送寄存器寫一字節(jié)->開發(fā)送中斷
//**********************************************************************
static int TxdBuf_WrByte(const volatile char ch)
{
	if(TxdBuf.ByteCnt<TxdBufLen-1)
	{
		*TxdBuf.pWr = ch;
		TxdBuf_pWr_Inc();
		*TxdBuf.pWr = (volatile char)0;
		TxdBuf.ByteCnt++;
		if( (rINTMSK&BIT_UTXD1) )
		{
			rUTXH1 = TxdBuf_RdByte();
			rINTMSK &= ~BIT_UTXD1;			//開UART0發(fā)送中斷
		}
		return (1);
	}
	else
	{
		return (0);
	}
}

//********************************************************************** 
//功 能: 	寫一幀數(shù)據(jù)
//**********************************************************************
int Modbus_WrFrame(const volatile char *pBuf)
{
	int StrLen;
	if (!pBuf)
	{
		return (0);
	}
	StrLen = strlen((char *)pBuf);
	if( (*pBuf!=FRAME_START) || (pBuf[StrLen-1]!=FRAME_END) )
	{
		return (0);
	}
	if( (TxdBuf.ByteCnt+StrLen) > (TxdBufLen-1) )
	{
		return (0);
	}
	for (; *pBuf; pBuf++)
	{
		TxdBuf_WrByte(*pBuf);
		if (*pBuf == 0)
		break;
	}
	return (1);
}


//********************************************************************** 
//函 數(shù) 名: static void __irq UART0_ISR_Txd(void);
//功 能: 	串口發(fā)送中斷處理 
//說 明: 
//參 數(shù): 
//返 回 值: 
//**********************************************************************
static void __irq UART1_ISR_Txd(void)
{
	volatile char ch;
	while( !(rUFSTAT1 & 0x200) && (ch=TxdBuf_RdByte()) )   //當(dāng)TxD FIFO滿或者TxLen為0時退出
    {
    	rUTXH1 = ch;
	}
	if(!ch)
	{
		while(1)
		{
			if((rUTRSTAT1 & 0x04) == 0x04)
				break;
		}
    	rINTMSK |= BIT_UTXD1;	//若這里不把中斷關(guān)掉,TxD FIFO永遠(yuǎn)為空,也就是說中斷永遠(yuǎn)都會發(fā)生!!
	}
	rI_ISPC = BIT_UTXD1;
}


//********************************************************************** 
//功 能: 	Modbus數(shù)據(jù)發(fā)送緩沖區(qū)初始化
//**********************************************************************
static void UART1_TxdBuf_Init(void)
{
	memset((char *)TxdBuf.Buf,0,sizeof(TxdBuf.Buf));
	TxdBuf.pWr = (char *volatile)&TxdBuf.Buf[0];
	TxdBuf.pRd = (char *volatile)&TxdBuf.Buf[0];
	TxdBuf.ByteCnt = (volatile int)0;
}



/****************************************************************/
//
//							初始化模塊
//
/****************************************************************/


//********************************************************************** 
//功 能: 	串口1中斷注冊
//**********************************************************************
static void UART1_INT_Init(void)	//中斷注冊
{    
    pISR_URXD1	= (unsigned) UART1_ISR_Rxd;
    pISR_UTXD1	= (unsigned) UART1_ISR_Txd;
}

/****************************************************************/
//函 數(shù) 名: void UART0_Init(int mclk,int baud);
//功 能: 	串口接收中斷處理 
//說 明: 
//參 數(shù): 	mclk:系統(tǒng)時鐘 	baud:波特率	
//返 回 值: 
/****************************************************************/
void Modbus_Uart1_Init(int mclk,int baud)
{
    rPCONC &= ~(0x0f<<24);
	rPCONC |= (0x0f<<24);						//GPE1 = TxD0,GPE2 = RxD0;
	rPDATC |= (0x03<<12);						//GPE1 = 1,GPE2 = 1;
	rPUPC  |= (0x03<<12); 						//GPE1\GPE2 Disable pull-up
	rULCON1 = 0x03;      						//Normal,No parity,1 bit stop,8 bit data
	rUCON1 = 0x02c5;							//Tx Int->Level;Rx int->Pules;Rx time out enable;
												//Error int enable;Tx mode->int;Rx mode->int;           
	rUFCON1 = 0xe7;								//FIFO enable;RxD FIFO = 12 Bytes;Tx FIFO = 12 Bytes
	rUMCON1 = 0x00;
    rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );	//設(shè)置波特率;
    UART1_INT_Init();							//初始化串口0中斷;
    Modbus_RxdBuf_Init();
    UART1_TxdBuf_Init();
    rI_ISPC = BIT_URXD1;
    rI_ISPC = BIT_UTXD1;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品精品一区| 欧美亚洲国产一卡| 国产精品1区二区.| 国产精品综合久久| 久久综合av免费| 国产欧美一区二区精品性色超碰| 中文字幕在线免费不卡| 五月天激情综合| 成人午夜视频免费看| 在线一区二区三区四区| 欧美成人女星排行榜| 亚洲少妇最新在线视频| 国内一区二区在线| 欧亚洲嫩模精品一区三区| 久久先锋资源网| 国产不卡视频在线观看| 欧美大片在线观看一区二区| 亚洲一区在线观看视频| 国产成人av资源| 精品国产伦理网| 天堂一区二区在线免费观看| 色综合一区二区| 日韩一级二级三级精品视频| 亚洲国产一区视频| 色综合视频在线观看| 亚洲国产高清不卡| 国产成人av一区二区三区在线| 国产精品成人一区二区艾草 | 久久久美女毛片| 五月激情综合色| 久久老女人爱爱| 色狠狠一区二区| 韩日精品视频一区| 亚洲小说春色综合另类电影| 欧美电影免费观看高清完整版在线| 春色校园综合激情亚洲| 亚洲va中文字幕| 欧美精品久久99| 成人av在线播放网址| 中文av一区二区| voyeur盗摄精品| 国产精品成人网| 日韩精品中文字幕一区二区三区 | 2023国产精品| 欧美性大战久久| 成人午夜精品一区二区三区| 午夜激情一区二区三区| **性色生活片久久毛片| 欧美mv日韩mv| 欧美日韩国产一区| 久久精品国产99久久6| 777亚洲妇女| 久久国内精品自在自线400部| 亚洲欧洲成人自拍| wwww国产精品欧美| 欧美高清视频在线高清观看mv色露露十八| 高清不卡一区二区| 久久99深爱久久99精品| 亚洲h在线观看| 亚洲丝袜制服诱惑| 中文无字幕一区二区三区| 3atv在线一区二区三区| 欧美色图一区二区三区| 夜夜嗨av一区二区三区| 在线看国产日韩| 成人一区二区三区| 国产大片一区二区| 国产一区二区三区综合| **欧美大码日韩| 欧美激情自拍偷拍| 国产午夜亚洲精品羞羞网站| 在线欧美日韩国产| 99vv1com这只有精品| 亚洲不卡av一区二区三区| 成人免费在线播放视频| 中文一区在线播放| 中文字幕综合网| 国产日韩欧美综合在线| 国产欧美精品国产国产专区| 久久精品欧美一区二区三区麻豆| 亚洲精品一区二区三区四区高清| 久久久精品影视| 日韩免费高清电影| 精品国产在天天线2019| 26uuu成人网一区二区三区| 日韩视频免费观看高清完整版 | 亚洲日本成人在线观看| 亚洲视频免费在线| 一区二区免费看| 亚洲一卡二卡三卡四卡| 亚洲成人你懂的| 美女爽到高潮91| 久久夜色精品一区| 久久精品视频一区| 亚洲天堂免费在线观看视频| 亚洲女同ⅹxx女同tv| 欧美色综合影院| 欧美一级黄色大片| 久久综合999| 中文字幕亚洲电影| 香蕉成人伊视频在线观看| 青青国产91久久久久久| 亚洲美女视频在线观看| 夜夜精品视频一区二区 | 18欧美乱大交hd1984| 一区二区三区在线播放| 99久久久无码国产精品| 色婷婷av一区二区三区大白胸| 欧美日韩国产高清一区二区三区| 91精品国产色综合久久| 91影院在线免费观看| 国产成人一区二区精品非洲| 99视频在线精品| 欧美男同性恋视频网站| 精品国产一区久久| 一区二区免费在线| 国模娜娜一区二区三区| 91影视在线播放| 欧美成人aa大片| 亚洲摸摸操操av| 久久精品国产在热久久| 91视频国产资源| 精品日本一线二线三线不卡| 成人欧美一区二区三区在线播放| 七七婷婷婷婷精品国产| 国产91精品一区二区| 欧美区一区二区三区| 国产亚洲一区二区三区在线观看| 亚洲综合无码一区二区| 国产经典欧美精品| 欧美日韩黄色影视| 国产精品九色蝌蚪自拍| 蜜臀精品一区二区三区在线观看 | 亚洲一区二区三区四区在线| 国产真实乱偷精品视频免| 色94色欧美sute亚洲线路一久| 精品999久久久| 天天免费综合色| www.成人网.com| 美女在线一区二区| 在线观看国产日韩| 中文av一区特黄| 国产一区二区免费在线| 69久久夜色精品国产69蝌蚪网| 成人欧美一区二区三区| 国产成人免费在线观看不卡| 日韩三级在线观看| 午夜av区久久| 在线观看日韩一区| 1024亚洲合集| av亚洲精华国产精华| 国产日本欧美一区二区| 久久精品国产99国产精品| 在线播放日韩导航| 亚洲国产wwwccc36天堂| 99国产精品国产精品毛片| 国产精品每日更新| 国产成a人无v码亚洲福利| xfplay精品久久| 精品一区二区三区的国产在线播放| 日本欧美韩国一区三区| 国产精品一区久久久久| 欧美一级二级在线观看| 亚洲成人综合视频| 在线影院国内精品| 亚洲精品伦理在线| 蜜臀av一区二区| 欧美日韩国产大片| 午夜一区二区三区视频| 欧美视频一区二| 亚洲影视资源网| 欧美性xxxxx极品少妇| 亚洲国产日韩综合久久精品| 91美女在线视频| 综合久久久久久| 日本国产一区二区| 性久久久久久久久| 欧美一区二区三区四区在线观看 | 色综合久久久久综合99| 亚洲精品五月天| 欧美在线免费观看亚洲| 亚洲成人黄色小说| 91精品国产乱码久久蜜臀| 久久精品国产秦先生| 精品国产乱码久久久久久免费 | 欧美麻豆精品久久久久久| 天堂va蜜桃一区二区三区漫画版| 777奇米四色成人影色区| 奇米亚洲午夜久久精品| 久久精品人人爽人人爽| 99精品视频一区二区三区| 亚洲精品一二三四区| 一区二区在线观看av| 欧美色视频在线| 麻豆国产精品一区二区三区| 久久久国产精华| 91久久精品国产91性色tv| 日日摸夜夜添夜夜添亚洲女人| 精品国产91乱码一区二区三区| 成人免费视频免费观看|