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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? comm.c

?? cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表
?? C
字號:
/**********************************************
公司名稱:
文 件 名:Comm.c
版 本 號:
程序設計:
說    明:串行通信
完成日期:
修改日期:
功能摘要:	
***********************************************/
#define  _CommV10
#include "includes.h"

#define  TX						1
#define  RX						0   
#define  UART_BUF_SIZE 			17

#define  VAL_ADDR_MAX  			0x0d   //*pComData表格的長度
#define  FUN_DATA_ADDR_FIRST  	0x30   //

/*uint8  *pComData[] PROGMEM =
{ 
    &((uint8 *)&Ps)[3], &((uint8 *)&Ps)[2], &((uint8 *)&Ps)[1],&((uint8 *)&Ps)[0],
	&((uint8 *)&PtVal)[1],  &((uint8 *)&PtVal)[0],
	&((uint8 *)&H_Alarm)[1],&((uint8 *)&H_Alarm)[0],
	&((uint8 *)&L_Alarm)[1],&((uint8 *)&L_Alarm)[0],
	&BaudAndData,
	&AddrVal,
	&AlarmSwitch,

};*/


uint8  *pComData[] PROGMEM = 		 //測試數據用。
{
	&((uint8 *)&Detect_A1)[1],&((uint8 *)&Detect_A1)[0],
	&((uint8 *)&Detect_A0)[1],&((uint8 *)&Detect_A0)[0],
	&((uint8 *)&Detect_B1)[1],&((uint8 *)&Detect_B1)[0],
	&((uint8 *)&Detect_B0)[1],&((uint8 *)&Detect_B0)[0],
	&((uint8 *)&Detect_T0)[1],&((uint8 *)&Detect_T0)[0],
	&((uint8 *)&Detect_T1)[1],&((uint8 *)&Detect_T1)[0],

};

	

																		       
																					
WAIT_TIME_STRUCT	UartOverTime = {1,0};

static uint8   UartReBuf[UART_BUF_SIZE];
static uint8   UartTxBuf[UART_BUF_SIZE];
static OS_Q	   UartReEvent;
static OS_Q    UartTxEvent;
static volatile uchar   fTx_done;         //重新發送標志
static volatile uchar   fRx_start;

void	sendbuf(uchar temp);
void	Process_Msg(void);
void    UART_Init(void);
void    Baud_Init(uchar Baud_Reg);
uint    CRC16fromByte(uchar Byte, uint CRC16);
uchar   ValTab(uint8 com_data_index);

//-------------------------------------------------
SIGNAL (SIG_UART_RECV)                 //UART接收完成
{
    OS_CLOSE_INT();
    OSQPost(&UartReEvent,UDR);    	  //向消息隊列發送一則消息UDR=msg,&UartReEvent數據的長度
    if (UartOverTime.fGetTime)
      {
    	 UartOverTime.fGetTime = 0;
    	 fRx_start = 1;  
       }   
    UartOverTime.WaitTime = _20MS;
	OS_OPEN_INT();
}

//--------------------------------------------------
SIGNAL (SIG_UART_DATA)                  //UART寄存器空
{
    uint8   msg = 0;
    
    OS_CLOSE_INT();
    if (OSQAccept(&UartTxEvent,&msg) == OS_Q_OK	//從消息隊列中取出消息
	){    	
    	UDR = msg;                      //發送數據
    } else {
    	UCSRB &= ~(1 << UDRIE);         //關掉數據寄存器空中斷允許	
    }
    OS_OPEN_INT();    
}


//-----------------------------------------
SIGNAL (SIG_UART_TRANS)              //UART發送完成
{
   OS_CLOSE_INT();
   if (OSQQuery(&UartTxEvent) == OS_Q_NO_EMPTY)   //OSQQuery;異常處理
      {	 
   	   UCSRB |= (1 << UDRIE);		              //UDRIE:數據寄存器空中斷使能
       }
   else 
      {
   	  fTx_done = 1;
       }
   OS_OPEN_INT();   
} 
//----------------------------------------
/************************************************
函 數 名:sendbuf
功能說明:將要發送的數據傳輸到發送緩存中
*************************************************/
void	sendbuf(uchar temp)
{    
   if ((OSQPost(&UartTxEvent,temp) != OS_Q_FULL) && fTx_done)
   {   			
		fTx_done = 0;      //完成則重新開始             
        UCSRB |= (1 << UDRIE);   //UDRIE:數據寄存器空中斷使能         
   }        
}

//sendbuf:將要發送的數據傳輸到發送緩存中
//設置發送數據的條件

/************************************************
函 數 名:processmsg
功能說明:逐一處理接受緩沖區的字符
*************************************************/
void	Process_Msg(void)
{
    uchar i;
    uchar temp = 0;   
    static uint CRC16;
    static uchar MsgNum = 0;      
   
    static struct Msg_Type
    {
        uchar Addr;		   //地址
        uchar FunID;	   //命令碼
        uchar Data_AddrH;  //地址高位
        uchar Data_AddrL;  //地址低位
        uchar DataLenH;	   //數據長度高位
        uchar DataLenL;    //數據長度低位   
    }MsgBuf;    
     
	if (OSQAccept(&UartReEvent,&temp) == OS_Q_OK) 
	   {     
	    if (fRx_start) 
		 {
            fRx_start = 0;          
            MsgNum = 0;         //包頭同步  
          }
             
        switch (MsgNum)
         {
          case 0:		  
            if (temp == AddrVal)    //通信地址 ,當地址與本身的地址相同時
            {
                MsgBuf.Addr = temp;	//結構體
                CRC16 = CRC16fromByte(temp,0xffff);
                MsgNum++; 
            }
            break;

          case 1:
            if (temp == 0x03 || temp == 0x04)   //功能碼,
            {
               MsgBuf.FunID = temp;                             
               CRC16 = CRC16fromByte(temp,CRC16);
               MsgNum++;
            }
            else
            {
                MsgNum = 0;		 
            }
            break;

           case 2:                         
            MsgBuf.Data_AddrH = temp;     //數據地址高位                       
            CRC16 = CRC16fromByte(temp,CRC16); 
            MsgNum++;
            break;

           case 3:    
            MsgBuf.Data_AddrL = temp;     //數據地址低位                       
            CRC16 = CRC16fromByte(temp,CRC16);
            MsgNum++; 
            break;

           case 4:                           
            MsgBuf.DataLenH = temp;       //數據長度高位            
            CRC16 = CRC16fromByte(temp,CRC16);
            MsgNum++;
            break;

           case 5:                        
            MsgBuf.DataLenL = temp;         //數據長度低位            
            CRC16 = CRC16fromByte(temp,CRC16);
            MsgNum++;
            break;

           case 6:
            if (((uchar *)&CRC16)[LOW_BYTE] == temp) //CRC校驗值低位
            {
                MsgNum++;						   
            }
            else
            {
                MsgNum = 0;
            }
            break;

           case 7:      
            if (((uchar *)&CRC16)[HIGH_BYTE] == temp)  //CRC校驗值高位
            {              
               sendbuf(MsgBuf.Addr);               //通信地址
               CRC16 = CRC16fromByte(MsgBuf.Addr,0xffff);              
                  
               sendbuf(MsgBuf.FunID);              //功能碼
               CRC16 = CRC16fromByte(MsgBuf.FunID,CRC16);
                              				      //數據長度
               MsgBuf.DataLenL <<= 1;          //數據字節數,發過來的是字數 ,回的是字節數              
               sendbuf(MsgBuf.DataLenL);
               CRC16 = CRC16fromByte(MsgBuf.DataLenL,CRC16);//CRC校驗值
              
               for (i=0; i<MsgBuf.DataLenL; i++)
               {
                  sendbuf(ValTab(MsgBuf.Data_AddrL)); 
                  CRC16 =  CRC16fromByte(ValTab(MsgBuf.Data_AddrL),CRC16);
                  MsgBuf.Data_AddrL++;
                }
                sendbuf(((uchar *)&CRC16)[LOW_BYTE]);  //發送CRC校驗值                
                sendbuf(((uchar *)&CRC16)[HIGH_BYTE]);                            
             }
             MsgNum = 0;            
             break;
                      
           default:
           MsgNum = 0;
           break;
        }
     }            
 }
 
//-------------------------------------------------
/************************************************
函 數 名:UART_Init
功能說明:串行口初始化
*************************************************/
void UART_Init(void)
{
	  OS_Q  *pq;
	  
	Baud_Init(BaudAndData);
	UCSRA = 0;
    UCSRB |= (1 << RXCIE)|(1 << TXCIE)|(1 << RXEN)|(1 << TXEN);  //允許發送和接收
    UCSRC |= (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);             //8位數據位+1位停止位  

    pq = OSQCreat(&UartReEvent,UartReBuf,UART_BUF_SIZE - 1);
    UartReEvent = *pq;
    pq = OSQCreat(&UartTxEvent,UartTxBuf,UART_BUF_SIZE - 1);
    UartTxEvent = *pq; 
    
	fTx_done = 1;
    fRx_start = 0;    
}


/*************************************************************************************
**功 能  描 述:單個字節CRC16校驗
**輸出:2個字節的CRC校驗值
*************************************************************************************/
uint CRC16fromByte(uchar Byte, uint crc16)
{
	uchar j;
    uchar CY;

	crc16 ^= Byte;
	for(j=8; j>0; j--)
	{
		CY = crc16;
        CY &= (1 << 0);
        crc16 >>= 1;
		crc16 &= 0x7fff;
		if(CY)
		{
			crc16 ^= 0xa001;
		}
	}
    
	return crc16;
}
/************************************************
函 數 名:initi_serial
功能說明:串行口初始化
*************************************************/
uchar   ValTab(uint8 com_data_index)
{
    uint8 *pReadComData;
    												   //FUN_DATA_ADDR_FIRST  0x30
    if (com_data_index >= FUN_DATA_ADDR_FIRST)		  //VAL_ADDR_MAX          0x0b
       {
        com_data_index = com_data_index - FUN_DATA_ADDR_FIRST + VAL_ADDR_MAX + 1; //超出范圍則讀不到數據
       }
    pReadComData = (uint8 *)pgm_read_word(&pComData[com_data_index]);    
    return (*pReadComData);   
}
//ValTab:根據所要得到的變量地址,查表得到具體的數值

//-----------------------------------------------
void  Baud_Init(uchar Baud_Reg)
{
    if ((Baud_Reg & 0x10) == 0x00)
    {
        UBRRL = (F_CPU / 16 / (4800+1)) % 256;
        UBRRH = (F_CPU / 16 / (4800+1)) / 256;  //設置波特率發生器
    }
    else if ((Baud_Reg & 0x10) == 0x10)
    {
        UBRRL = (F_CPU / 16 / (9600+1)) % 256;
        UBRRH = (F_CPU / 16 / (9600+1)) / 256;  //設置波特率發生器
    }
}
//------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
爽爽淫人综合网网站| 亚洲狼人国产精品| 国产在线精品不卡| 国产欧美一区二区精品婷婷| 国产成人av一区| 亚洲视频 欧洲视频| 欧美视频中文一区二区三区在线观看| 亚洲bt欧美bt精品| 日韩欧美国产成人一区二区| 欧美午夜理伦三级在线观看| 亚洲成a天堂v人片| www欧美成人18+| 国产成人8x视频一区二区| 亚洲欧洲www| 欧美裸体bbwbbwbbw| 国产麻豆精品久久一二三| 亚洲视频免费观看| 丁香婷婷综合五月| 一区二区高清免费观看影视大全| 欧美日韩午夜影院| 蜜桃一区二区三区在线观看| 精品国产乱码久久久久久老虎| 国产69精品久久久久毛片| 亚洲午夜一区二区| 国产日韩av一区| 欧美色老头old∨ideo| 国产一区福利在线| 亚洲成人一二三| 国产精品视频免费| 欧美一区二区三区公司| www.欧美精品一二区| 免费观看在线色综合| 亚洲欧洲成人精品av97| 精品国产免费久久| 欧美在线视频全部完| 国产一区二区调教| 亚洲国产成人91porn| 日本一区免费视频| 欧美一区二区三区免费在线看| 成人免费高清视频| 麻豆91精品91久久久的内涵| 亚洲天堂av一区| 国产午夜精品美女毛片视频| 欧美日本免费一区二区三区| 成人一级视频在线观看| 免播放器亚洲一区| 亚洲精选视频免费看| 亚洲国产综合色| 国产精品第四页| 日韩欧美黄色影院| 欧美日韩视频在线观看一区二区三区| 成人小视频免费在线观看| 久久爱www久久做| 日日夜夜免费精品| 亚洲成人av中文| 亚洲综合在线免费观看| 国产精品天干天干在线综合| 久久久久久久久久久黄色| 日韩欧美一级二级三级| 欧美精品一卡二卡| 欧美男男青年gay1069videost| 色婷婷香蕉在线一区二区| 盗摄精品av一区二区三区| 国产一区二区导航在线播放| 另类专区欧美蜜桃臀第一页| 日韩av午夜在线观看| 午夜私人影院久久久久| 亚洲国产美女搞黄色| 一区二区不卡在线播放| 亚洲免费视频中文字幕| 尤物av一区二区| 一区二区三区四区视频精品免费| 亚洲免费在线观看| 亚洲五月六月丁香激情| 亚洲6080在线| 全部av―极品视觉盛宴亚洲| 日本亚洲免费观看| 日韩国产精品大片| 久久精品国产免费| 国产一区91精品张津瑜| 国产一区欧美一区| 成人av小说网| 色狠狠桃花综合| 欧美午夜精品一区二区蜜桃 | 国产精品1024| 国产一区视频网站| 成人黄色国产精品网站大全在线免费观看 | 国产成人aaa| 不卡视频免费播放| 一本大道久久a久久综合| 欧美最猛性xxxxx直播| 欧美乱妇15p| 欧美成人video| 中文字幕欧美国产| 综合婷婷亚洲小说| 天堂影院一区二区| 狠狠色综合色综合网络| 成人福利在线看| 欧美特级限制片免费在线观看| 欧美精品一二三区| 精品国产乱码久久久久久老虎 | 久草精品在线观看| 成人性生交大片免费看在线播放| 91碰在线视频| 欧美一区二区在线播放| 亚洲国产精品精华液ab| 亚洲综合一二区| 国产又黄又大久久| 欧洲精品在线观看| 欧美精品一区二区三区很污很色的| 亚洲国产高清不卡| 五月综合激情婷婷六月色窝| 国产又黄又大久久| 欧美日韩久久久久久| 国产亚洲视频系列| 亚洲成人免费影院| 成人黄页毛片网站| 欧美一区二区三区精品| 国产精品日韩精品欧美在线| 亚洲第一激情av| 成人一区在线看| 日韩情涩欧美日韩视频| 最新国产成人在线观看| 美女久久久精品| 欧美吻胸吃奶大尺度电影| 久久综合九色综合欧美就去吻| 亚洲精品精品亚洲| 国产精品一区二区在线观看不卡 | 国产精品不卡一区| 久久精品999| 欧美亚洲图片小说| 国产精品萝li| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品久久久久久福利一牛影视| 日韩精彩视频在线观看| 色网综合在线观看| 欧美国产禁国产网站cc| 精久久久久久久久久久| 制服丝袜亚洲色图| 久久99精品久久久久久国产越南| 色婷婷激情综合| 亚洲欧洲精品一区二区三区不卡| 黄色资源网久久资源365| 欧美一区二区精品在线| 亚洲自拍偷拍麻豆| 色综合色狠狠天天综合色| 国产欧美综合在线观看第十页| 蜜桃久久久久久久| 欧美一区二区视频在线观看2020| 国产精品久久久久久久久图文区| 国产在线一区观看| 精品久久久三级丝袜| 男男成人高潮片免费网站| 欧美亚一区二区| 亚洲综合一区在线| 91久久久免费一区二区| 综合婷婷亚洲小说| 色国产综合视频| 亚洲综合区在线| 欧美在线制服丝袜| 一区二区三区精密机械公司| 91麻豆文化传媒在线观看| 亚洲人成网站在线| 色偷偷成人一区二区三区91| 亚洲欧美欧美一区二区三区| 91美女在线看| 亚洲国产欧美另类丝袜| 在线综合亚洲欧美在线视频 | 天天av天天翘天天综合网| 欧美日韩一区久久| 午夜精品免费在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 成人高清免费观看| 中文字幕日本不卡| 91一区在线观看| 亚洲黄色小视频| 欧美高清视频一二三区| 青青草原综合久久大伊人精品 | 国产不卡视频在线观看| 欧美激情艳妇裸体舞| av福利精品导航| 尤物在线观看一区| 在线播放国产精品二区一二区四区 | 老司机精品视频一区二区三区| 日韩欧美在线网站| 高清shemale亚洲人妖| 国产精品久久久久久亚洲毛片| 色婷婷综合久久| 免费成人美女在线观看.| 久久网站热最新地址| av在线一区二区| 五月激情丁香一区二区三区| 欧美一级生活片| 国产一区二区调教| 亚洲另类一区二区| 日韩午夜在线观看视频| 国产精品亚洲视频| 亚洲国产精品一区二区尤物区| 9191久久久久久久久久久| 狠狠色丁香久久婷婷综|