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

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

?? rxd.c

?? modbus的ascii模式源代碼
?? C
字號:
#include "ModBus.h"
/******************************************************************/
StrRxd xdata sys_rxd;               //定義接收處理結構體
/******************************************************************/
/*******公有函數***************************************************/
void    init_proc_rxd(void);        //初始化串口通信變量
void    process_rxd(void);          //通信處理函數
void    init_serial(void);          //初始化串口
/*******私有函數***************************************************/
uint8   read_sys_rxd(void);         //讀接收緩沖區
uint8   data_check(void);           //校驗和檢驗
uint8   lenghchk(void);             //數據長度檢驗
void    data_change(void);          //數據ASCII轉換成HEX
/******************************************************************/
void    init_proc_rxd(void)
{
    uint8 idata i;
    for( i = 0;i < POOLLEN;i++ )
    {
        sys_rxd.pool[i] = 0;
        sys_rxd.rec_buf[i] = 0;
        sys_txd.pool[i] = 0;

        sys_txd.combuf[i] = 0;
    }
    for( i = 0;i < 16;i++ )
    {
        sys_rxd.add_buf[i] = 0;
    }

    sys_rxd.front = 0;
    sys_rxd.rear = 0;
    sys_rxd.frm_num = 0;
    sys_rxd.rd_byte = 0;
    sys_rxd.start_0x7e = 0;
    sys_rxd.end_0x0d = 0;

    sys_txd.txd_len = 0;
}
/*****************************************************************/
uint8 	read_sys_rxd(void)
{
 	if( sys_rxd.rear == sys_rxd.front )
 	{
        return WRONG;
    }
	else
    {
        sys_rxd.rd_byte = sys_rxd.pool[sys_rxd.front];
	    sys_rxd.front = (sys_rxd.front+1) % POOLLEN;

	    return RIGHT;
    }
}
/*****************************************************************/
uint8 data_check(void)
{
    uint8  add_len,temp;
	uint8   i,j,k,fram_temp;
	uint16  chk_sum,chk_sum_temp;

	fram_temp = sys_rxd.frm_num;//如何防止在處理數據的同時新的中斷使該值變化
	add_len = 0;

	if( fram_temp )//接收的一幀完整數據
    {
		fram_temp -= 1;

 		j = sys_rxd.add_buf[fram_temp * 2];
        k = sys_rxd.add_buf[fram_temp * 2 + 1];

		if(k > j)
		{
		    add_len = k-j;
		}
		else
		{
		    add_len = (POOLLEN - j ) + k;//地址確認
		}

        sys_rxd.front = j;

		chk_sum = 0;

 		for( i = 0;i < add_len - 4;i++ )          //4 byte is chuck sum
		{
            read_sys_rxd();    //the poionter is add1
        	if( sys_rxd.rd_byte == FRAME_START )
       	    {
        	    sys_rxd.rd_byte = 0;
        	}
	    	chk_sum += sys_rxd.rd_byte;
	 	}

		chk_sum =  (~chk_sum) + 1;

		chk_sum_temp = 0;
		for(i=0;i<4;i++)
		{
			read_sys_rxd();
			temp = sys_rxd.rd_byte;

			if(temp > 0x40)
			{
			    temp -= 0x37; // get the hex valume
			}
            else
            {
                temp -= 0x30;
            }

			chk_sum_temp  += temp;

			if( i < 3 )
			{
	   		    chk_sum_temp = chk_sum_temp << 4;
	   		}
		}

        if( chk_sum_temp == chk_sum )
        {
            return RIGHT;
        }
        else
        {
            return WRONG;
        }
    }
    else
    {
        return WRONG;
    }
}
/*****************************************************************/
uint8   lenghchk(void)    //數據長度檢驗
{
    uint8 link_sum,link_sum_temp;
    uint8  add_len;
	uint8  j,k,fram_temp;

    if( sys_rxd.rec_buf[4] != lchksum(sys_rxd.rec_buf[5]) )
    {
        return WRONG;
    }

    fram_temp = sys_rxd.frm_num; //如何防止在處理數據的同時新的中斷使該值變化
	if ( fram_temp == 0 )
	{
	    return WRONG;
	}

    fram_temp--;

	j = sys_rxd.add_buf[fram_temp*2];
	k = sys_rxd.add_buf[fram_temp*2+1];

	if(k>j)
	{
	    add_len = k-j;
	}
	else
	{
	    add_len = ( POOLLEN - j ) + k;
	}

	link_sum_temp = (add_len - 17);
	link_sum = sys_rxd.rec_buf[5];

	if(link_sum != link_sum_temp)
	{
	    return WRONG;
	}
	else
	{
	    return RIGHT;
	}

}
/*****************************************************************/
void data_change(void)
{
    uint8  add_len;
	uint8  i,j,k,temp1,fram_temp;
	uint8  temp;

    fram_temp = sys_rxd.frm_num; //如何防止在處理數據的同時新的中斷使該值變化
	if ( fram_temp == 0 )
	{
	    return;
	}

    fram_temp--;

	j = sys_rxd.add_buf[fram_temp*2];
	k = sys_rxd.add_buf[fram_temp*2+1];

	if(k>j)
	{
	    add_len = k-j;
	}
	else
	{
	    add_len = ( POOLLEN - j ) + k;
	}

	add_len = add_len / 2 + 1;  //cup down 2 byte chksum
	sys_rxd.front = j;

	for(i = 0;i < add_len;i++ )
	{
        read_sys_rxd(); //the poionter is add1
    	if (sys_rxd.rd_byte == 0x0d)
   		{
            sys_rxd.rec_buf[i] = 0xaa;
			sys_rxd.rec_buf[i+1]=0x55;
 			return;
		}
    	if (sys_rxd.rd_byte == 0x7e)
    	{
		    read_sys_rxd();
		}
        temp = sys_rxd.rd_byte;
        if(temp>0x40)
        {
             temp-=0x37;
        }
        else
        {
       		temp -=0x30;
	    }
       	temp = temp<<4;//高4位
     	read_sys_rxd();//the poionter is add1
        temp1 = sys_rxd.rd_byte;
        if(temp1>0x40)
        {
       		temp1-=0x37;
        }
        else
        {
      		temp1-=0x30;
        }
        sys_rxd.rec_buf[i] = temp+temp1; // include ver/adr/cid1/cid2/length/info
    }
}
/*****************************************************************/
void process_rxd(void) //接收緩沖區中的數據 入處理緩沖區
{
    while(sys_rxd.frm_num)
    {
        if(data_check() == WRONG)
        {
            sys_rxd.add_buf[sys_rxd.frm_num*2] = 0;
            sys_rxd.add_buf[sys_rxd.frm_num*2+1] =0;
            sys_rxd.frm_num --;

            txd_uni(0x02);  //校驗和錯誤
            return;
     	}

        data_change();

        if( (sys_rxd.rec_buf[1] == ADDR ) )  //地址正確
        {
            if( lenghchk() ==WRONG )  //長度校驗
            {
                sys_rxd.add_buf[sys_rxd.frm_num*2] = 0;
                sys_rxd.add_buf[sys_rxd.frm_num*2+1] =0;
                sys_rxd.frm_num --;

                txd_uni(0x03);  //長度校驗錯誤
                return;
            }

            if(sys_rxd.rec_buf[0] != VER)
            {
                sys_rxd.add_buf[sys_rxd.frm_num*2] = 0;
                sys_rxd.add_buf[sys_rxd.frm_num*2+1] =0;
                sys_rxd.frm_num --;
                txd_uni(0x01);  //版本錯
                return;
            }
            if( (sys_rxd.rec_buf[2] != M_CID))  //設備ID錯
            {
                sys_rxd.add_buf[sys_rxd.frm_num*2] = 0;
                sys_rxd.add_buf[sys_rxd.frm_num*2+1] =0;

                sys_rxd.frm_num--;
                txd_uni(0xe1);  //設備ID錯
                return;
            }
            switch(sys_rxd.rec_buf[3])
            {
                case 0x44:
                    txd_sta();
               	    break;
                case 0x4f:
                    txd_uni(0x4f);      //發送通訊協議版本號
                    break;
                case 0x50:
                    txd_uni(0x50);      //發送設備地址
                    break;
                case 0x51:
                    txd_man();      //發送設備廠家信息
                    break;
                case 0x60:
                    txd_uni(0x60);      //系統初始化
                    break;
                default:
                    txd_uni(0x04);  //無效命令
                    break;
            }
        }
        sys_rxd.frm_num--;
    }
}
/*****************************************************************/
void    init_serial(void)
{
  	//串行口波特率等設置
        TMOD=0x21;      // T1  mode 2 T0,mode 1 //GATE C/T M1 M0 GATE C/T M1 M0
	TL1=0xfa;       // 0xfa=4800 bps  0xfd=9600 bps    0xe8 = 1200    0xf4 = 2400
	TH1=0xfa;
	TH0=-(10000/256);
   	TL0=-(10000%256);
        PCON=0;          //波特率不變等設置
        SCON=0x50;       //串口1方式1,允許接收
        IT0=1;           //外部中斷0下降沿有效
        IT1=1;           //外部中斷1下降沿有效
        TR0=1;           //啟動定時器0
        TR1=1;           //啟動定時器1
        ET0=1;           //開放定時器0中斷
        ES=1;            //串行中斷
        EX0=0;           //外部中斷0
        EX1=1;           //外部中斷1
        EA=1;            //開總中斷
 //       RS485EN = 0;

}
/*****************************************************************/
void    serial_uart(void) interrupt 4
{
    uchar idata temp;
    uchar idata num;
    if(RI)
    {
        RI = 0;
        temp = SBUF;
        if( sys_rxd.start_0x7e && (temp != FRAME_END) )
        {
            sys_rxd.pool[sys_rxd.rear] = temp;
            sys_rxd.rear = (sys_rxd.rear + 1) % POOLLEN;
            return;
        }
        else
        {
            if( (temp ^ FRAME_START)==0 )    //如果接收到包起始位
            {
                if( (sys_rxd.start_0x7e) && (sys_rxd.end_0x0d) )
                {
                    sys_rxd.rear = sys_rxd.add_buf[num];
                }
                else
                {   //第一次接收到起始位
                    sys_rxd.start_0x7e = 1;
                    sys_rxd.end_0x0d = 1;
                    num = sys_rxd.frm_num * 2;    //新的一幀的起始地址下標
                    sys_rxd.add_buf[num] = sys_rxd.rear;  //起始地址保存
                }
                sys_rxd.pool[sys_rxd.rear] = temp;
                sys_rxd.rear=(sys_rxd.rear+1) % POOLLEN;
                return;
            }
            else
            {
                if( sys_rxd.start_0x7e && ( temp == FRAME_END ) )
		{
                    sys_rxd.end_0x0d = 0;
                    sys_rxd.start_0x7e = 0;
                    sys_rxd.pool[sys_rxd.rear] = temp;
                    sys_rxd.rear = (sys_rxd.rear+1) % POOLLEN;
                    num = sys_rxd.frm_num*2+1;//結束地址位

                    if(sys_rxd.rear==0)   //對于POOLLEN不是255的時候,如果直接-1做尾地址。肯定造成尾地址錯誤。因為 0-1=255
                    {
                        sys_rxd.add_buf[num] = POOLLEN - 1;//在寫進后的地址已加上1
                    }
                    else
                    {
                        sys_rxd.add_buf[num] = sys_rxd.rear-1;//在寫進后的地址已加上1
                    }

                    sys_rxd.frm_num++;//增加一幀//成功才加一位
                    sys_rxd.frm_num = sys_rxd.frm_num % 16;
                    return;
                }
            }
        }
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
岛国精品在线观看| 伊人色综合久久天天人手人婷| 91国产福利在线| 国产aⅴ精品一区二区三区色成熟| 精品一区二区免费| 日韩电影在线观看一区| 日韩高清中文字幕一区| 蜜臀精品久久久久久蜜臀| 无码av中文一区二区三区桃花岛| 亚洲福利一二三区| 午夜精品久久久久久久久| 视频在线在亚洲| 久久99国产精品尤物| 国产精品一二三| 99精品视频在线免费观看| 91麻豆免费看片| 欧美色图第一页| 日韩一区二区高清| 国产日韩欧美制服另类| 国产精品三级视频| 夜夜嗨av一区二区三区中文字幕| 亚洲国产精品久久艾草纯爱| 精品亚洲porn| 91免费国产在线| 在线播放/欧美激情| 欧美精品一区二区三区在线播放| 国产日产精品一区| 一区二区免费在线播放| 免费不卡在线视频| av在线播放不卡| 欧美伦理影视网| 欧美国产激情一区二区三区蜜月| 亚洲自拍偷拍麻豆| 激情丁香综合五月| 91国在线观看| 久久久久国产精品麻豆ai换脸| 亚洲男同性视频| 国产在线精品一区二区| 色哟哟国产精品免费观看| 欧美成人综合网站| 亚洲裸体在线观看| 国产综合久久久久影院| 在线精品亚洲一区二区不卡| 欧美成人三级在线| 亚洲成人在线观看视频| 国产不卡在线视频| 欧美一区二区三区白人| 一区二区三区久久| 国产精品一二三区在线| 91精品国产入口在线| 中文字幕在线不卡国产视频| 激情综合亚洲精品| 欧美日韩不卡一区二区| 亚洲色图另类专区| 国产成人av一区二区三区在线观看| 97久久超碰国产精品| 久久久亚洲国产美女国产盗摄 | 亚洲国产精品一区二区尤物区| 青青草成人在线观看| 色视频成人在线观看免| 中文av一区二区| 日本中文字幕一区二区视频| 欧美少妇xxx| 亚洲精品成人a在线观看| 成人免费视频视频在线观看免费| 日韩视频永久免费| 日韩高清在线观看| 欧美一级欧美三级| 日精品一区二区三区| 欧美三电影在线| 亚洲午夜羞羞片| 欧美日韩中文国产| 午夜私人影院久久久久| 色综合久久中文综合久久97| 国产精品久久久久精k8| 成人白浆超碰人人人人| 国产日韩三级在线| 成人在线视频一区二区| 欧美国产日韩一二三区| 成人午夜视频在线| 国产精品婷婷午夜在线观看| 成人免费视频视频在线观看免费| 国产精品久久午夜| 99精品视频免费在线观看| 最好看的中文字幕久久| 99视频国产精品| 亚洲一区精品在线| 678五月天丁香亚洲综合网| 蜜臀99久久精品久久久久久软件| 日韩精品中午字幕| 国产成人综合在线| 亚洲欧美视频在线观看视频| 91福利视频久久久久| 日韩中文字幕91| 亚洲精品在线一区二区| 不卡的看片网站| 亚洲小说欧美激情另类| 日韩一区二区三区四区| 国产精品一二二区| 一区二区免费看| 精品国产91久久久久久久妲己| 成人免费高清视频在线观看| 夜夜揉揉日日人人青青一国产精品| 欧美精选午夜久久久乱码6080| 毛片av中文字幕一区二区| 久久色成人在线| 日本高清不卡aⅴ免费网站| 一区二区成人在线观看| 欧美精品色一区二区三区| 国产精品69毛片高清亚洲| 亚洲欧美综合网| 69av一区二区三区| 99精品欧美一区二区三区小说| 亚洲国产综合视频在线观看| 久久嫩草精品久久久精品| 欧美体内she精高潮| 国产99久久久久久免费看农村| 亚洲黄一区二区三区| 2023国产一二三区日本精品2022| 在线免费观看成人短视频| 国产麻豆成人精品| 午夜国产精品影院在线观看| 中文字幕二三区不卡| 日韩女同互慰一区二区| 在线一区二区三区四区五区| 国产一区欧美二区| 亚洲h动漫在线| 亚洲私人影院在线观看| 久久婷婷国产综合精品青草| 欧美疯狂性受xxxxx喷水图片| 99精品黄色片免费大全| 极品美女销魂一区二区三区| 日韩精品电影在线观看| 一区二区三区中文字幕精品精品 | 麻豆91在线观看| 亚洲自拍偷拍欧美| 中文字幕在线不卡视频| 久久在线免费观看| 日韩欧美中文字幕制服| 欧美日韩高清一区二区不卡| 一本在线高清不卡dvd| 成人激情动漫在线观看| 国产成人精品免费看| 国产精品99久久久久久久vr| 美女看a上一区| 麻豆精品国产91久久久久久| 日韩二区三区在线观看| 日本亚洲天堂网| 日韩高清国产一区在线| 天堂在线亚洲视频| 午夜精品久久久久久不卡8050| 亚洲午夜久久久久久久久久久| 亚洲男帅同性gay1069| 亚洲精品免费看| 亚洲人成网站在线| 亚洲免费在线观看| 亚洲欧美日本韩国| 一区二区成人在线视频| 香蕉av福利精品导航| 午夜视频在线观看一区二区 | 国产精品国产精品国产专区不蜜| 久久免费美女视频| 久久综合久久99| 国产清纯在线一区二区www| 国产午夜亚洲精品午夜鲁丝片| 久久噜噜亚洲综合| 久久精品人人做人人爽97| 国产欧美一区二区在线| 中文字幕在线一区| 亚洲综合丁香婷婷六月香| 日韩av高清在线观看| 久久国产精品99久久人人澡| 麻豆精品蜜桃视频网站| 久久精品国产亚洲a| 成人一区二区三区中文字幕| 91在线精品秘密一区二区| 91麻豆123| 欧美一二区视频| 亚洲国产成人私人影院tom| 亚洲精品乱码久久久久久久久| 丝袜诱惑制服诱惑色一区在线观看 | 欧美一级搡bbbb搡bbbb| 精品对白一区国产伦| 亚洲欧洲精品天堂一级| 亚洲成人三级小说| 国产成人精品一区二| 欧美少妇性性性| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲欧洲av色图| 老鸭窝一区二区久久精品| 不卡av电影在线播放| 4438x成人网最大色成网站| 久久精品亚洲精品国产欧美kt∨ | 国产经典欧美精品| 欧美伊人久久久久久久久影院 | 国产精品无人区| 婷婷丁香久久五月婷婷| 成人网男人的天堂| 91精品国产综合久久香蕉的特点| 国产精品丝袜久久久久久app|