主頁 >  其他 > 【STC15系列】SYK-0806-A2S1 工業自動化控制之【16-自定義協議通信】

【STC15系列】SYK-0806-A2S1 工業自動化控制之【16-自定義協議通信】

2022-01-01 09:36:54 其他

大家好,我是『芯知識學堂』的SingleYork,前一篇文章給大家介紹了“SYK-0806-A2S1 工業自動化控制之【15-串口收發十六進制數】”,這一篇中,筆者繼續給大家介紹跟串口通信有關的“自定義協議通信”,

在一些工業應用的場合,我們經常需要用到串口通信,既然是要通信肯定是需要相關協議的支持,業內比較標準的協議當然要數MODBUS協議了,

然而MODBUS協議要完全弄懂,也并非易事,很多時候,可能我們只需要簡單控制一些輸出同時讀取輸入輸出狀態,以及設定一些引數等,如果用標準的MODBUS協議肯定是沒有問題的,但是并不是所有人都能在短時間內摸透MODBUS協議,

那么,或許有人會說,自己隨便寫個簡單的協議不就好了!沒錯,這樣也是可以,只要通信設備雙方都按照約定好的協議去執行相關動作即可,這一講中,筆者就要著重介紹這種自定義協議的通信了,

說到自定義協議,筆者第一次接觸的時候,還是在用迪文DGUS屏的時候,在接觸了迪文DGUS屏的指令后,筆者才學會的使用自定義協議來做一些通信,那么,筆者就以迪文DGUS屏的指令為例,跟大家詳細一下自定義協議的相關知識吧,

迪文DGUS串口資料幀的架構是由以下幾個部分組成:

幀頭(2位元組)+ 資料長度(1位元組)+ 指令(1位元組)+ 資料(N位元組)+ CRC校驗(2位元組,可選)

所有指令都是以十六進制數發送,以寫控制暫存器指令(80)為例:

假如我們需要講觸摸屏的畫面“從當前頁面切換到第五幅圖片”,那么我們只需要通過串口向屏發送如下指令即可:

5A A5 04 80 03 00 05(此處不帶CRC校驗)

那么這些十六進制數都代表什么意思呢?其含義如下:

5A A5:幀頭由兩個位元組組成,可以自定義
04:發送資料的長度(指從指令開始到最后的資料長度,此處從80指令開始共發送4個位元組)
80:寫控制暫存器指令
03:控制暫存器地址
00 05:圖片地址

在這條命令中,省去了CRC校驗,其實在很多場合也可以用和校驗的方式替代CRC校驗,比如,我們可以將上述指令改成如下方式:

5A A5 04 80 03 00 05 92

最后一個數92即是一個校驗和,從資料長度位開始到最后一個資料累加求余,即得到了校驗和,

當然咯,這個校驗和我們可以用1個位元組,也可以用2個位元組,看大家使用習慣了,筆者經常都是用1個位元組來做和校驗位,既然是自定義,那么肯定是你想怎么用就怎么用了,前提是,通信兩邊都用一樣的協議,這樣大家都能通信上了,哈哈,看到這里,相信大家對于自定義協議應該有一定了解了,

其實,自定義協議確實很簡單,可以自己任意定義一串數字,只要雙方都按照定義好的格式收發資料即可,

接下來,筆者就一個實際的案例,在這款工控板上演示一下自定義協議通信,該工控板上有6個輸出,分別是Y0-Y5;8個輸入,分別是X00-X07,用串口助手模擬上位機來發送指令,分別控制每個輸出口的輸出狀態,在工控板接收到串口助手發來的指令后,根據不同指令執行相關動作,并回傳此時輸入輸出口的狀態,

首先,筆者定義串口助手發送的通信幀格式如下:

幀頭(2位元組)+ 長度(1位元組)+ 命令(1位元組)+ 控制指令(2位元組)

控制邏輯如下:

串口助手發送(十六進制):5A A5 03 06 00 00,Y00輸出ON
串口助手發送(十六進制):5A A5 03 06 00 01,Y00輸出OFF

串口助手發送(十六進制):5A A5 03 06 00 01,Y01輸出ON
串口助手發送(十六進制):5A A5 03 06 00 11,Y01輸出OFF

串口助手發送(十六進制):5A A5 03 06 00 02,Y02輸出ON
串口助手發送(十六進制):5A A5 03 06 00 12,Y02輸出OFF

串口助手發送(十六進制):5A A5 03 06 00 03,Y03輸出ON
串口助手發送(十六進制):5A A5 03 06 00 13,Y03輸出OFF

串口助手發送(十六進制):5A A5 03 06 00 04,Y04輸出ON
串口助手發送(十六進制):5A A5 03 06 00 14,Y04輸出OFF

串口助手發送(十六進制):5A A5 03 06 00 05,Y05輸出ON
串口助手發送(十六進制):5A A5 03 06 00 15,Y05輸出OFF

其中:

5A A5 – 即為幀頭
03 ------ 為資料長度(從該為后面一位起資料總位元組數)
06 ------ 為命令字
00 00 – 為控制指令

本例中筆者偷懶了,也省去了和校驗/CRC校驗,不過筆者相信,看到這里了,大家對應該是有能力自己增加上和校驗的,要是實在不知道,可以私聊筆者,

那么,發送問題是解決了,但是,要怎么接收這一串指令呢?還是參考迪文DGUS接收資料幀的方式,首先校驗幀頭:5A A5,然后再判斷長度位,根據長度位來確定需要接收資料的長度,比如,此處長度位為03,那么,我們只需要在接收到長度位之后,繼續再接收完3個資料即可認為資料接收完成,具體代碼實作如下:

/********************* UART1中斷函式************************/
void UART1_int (void) interrupt UART1_VECTOR
{
	static bit RX_5A_OK = 0;
    static bit RX_A5_OK = 0;
    static u8  UART1_DataTemp = 0;
    
    if(RI)
	{
		RI = 0;
        
        UART1_DataTemp = SBUF;
        
        if(RX_5A_OK)
		{
			if(RX_A5_OK)
			{
				RX1_Buffer[COM1.RX_Cnt++] = UART1_DataTemp;      //將接收到的陣列暫存到RX1_Buffer陣列
				
				if(COM1.RX_Cnt == RX1_Buffer[0] + 1)			 //接收完成
				{
					Uart1_RX_Finish = 1;			             //資料接收完成,將標志位置1 
					RX_5A_OK	 	= 0;
					RX_A5_OK	 	= 0;
				}
			}
			else
			{
				if(UART1_DataTemp == 0xA5)
				{
					RX_A5_OK 		= 1;
					COM1.RX_Cnt 	= 0;
				}
			}
		}
		else 
		{
			if(UART1_DataTemp == 0x5A)
			{
				RX_5A_OK = 1;
			}
		}
        
        if(COM1.RX_Cnt >= COM_RX1_Lenth)	COM1.RX_Cnt = 0;
	}

	if(TI)
	{
		TI = 0;
        COM1.B_TX_busy = 0;
	}
}

當然,這里其實我們也可以使用結束符來實作,比如回車換行符,也很簡單,只要找到回車換行對應的ASCII碼的十六進制數就好了,要是筆者沒記錯的話,應該是:0x0D、0x0A,那么我們可以在串口接收到0x0D、0x0A兩個資料之后認為是接收完成,當然,代碼部分筆者就不再貼出來了,留給讀者去完成了,

串口中斷接收完資料后,會產生一個Uart1_RX_Finish接收完成標志,然后就可以開始決議資料了:

/*********************     APP運行    ***********************/
void app_run(void)
{
    static u8 cnt = 0;
    
    if(Uart1_RX_Finish)
    {
        if(!Uart1_TX_EN)
        {
            //根據收到的指令執行相應的動作
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x00))
            {
                //接收到指令(十六進制):5A A5 03 06 00 00,Y00輸出ON
                Y00 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x10))
            {
                //接收到指令(十六進制):5A A5 03 06 00 01,Y00輸出OFF
                Y00 = OutputT_OFF;
            }
            
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x01))
            {
                //接收到指令(十六進制):5A A5 03 06 00 01,Y01輸出ON
                Y01 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x11))
            {
                //接收到指令(十六進制):5A A5 03 06 00 11,Y01輸出OFF
                Y01 = OutputT_OFF;
            }
            
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x02))
            {
                //接收到指令(十六進制):5A A5 03 06 00 02,Y02輸出ON
                Y02 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x12))
            {
                //接收到指令(十六進制):5A A5 03 06 00 12,Y02輸出OFF
                Y02 = OutputT_OFF;
            }
            
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x03))
            {
                //接收到指令(十六進制):5A A5 03 06 00 03,Y03輸出ON
                Y03 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x13))
            {
                //接收到指令(十六進制):5A A5 03 06 00 13,Y03輸出OFF
                Y03 = OutputT_OFF;
            }
            
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x04))
            {
                //接收到指令(十六進制):5A A5 03 06 00 04,Y04輸出ON
                Y04 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x14))
            {
                //接收到指令(十六進制):5A A5 03 06 00 14,Y04輸出OFF
                Y04 = OutputT_OFF;
            }
            
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x05))
            {
                //接收到指令(十六進制):5A A5 03 06 00 05,Y05輸出ON
                Y05 = OutputT_ON;
            }
            if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x15))
            {
                //接收到指令(十六進制):5A A5 03 06 00 15,Y05輸出OFF
                Y05 = OutputT_OFF;
            }
            
            TX1_Buffer[0]  = 0x5A;    //幀頭
            TX1_Buffer[1]  = 0xA5;    //幀頭
            TX1_Buffer[2]  = 0x10;    //長度:從長度后一位開始到最后一個資料總位元組數
            TX1_Buffer[3]  = 0x06;    //命令0x06
            
            TX1_Buffer[4]  = !X00;    //X00輸入狀態
            TX1_Buffer[5]  = !X01;    //X01輸入狀態
            TX1_Buffer[6]  = !X02;    //X02輸入狀態
            TX1_Buffer[7]  = !X03;    //X03輸入狀態
            TX1_Buffer[8]  = !X04;    //X04輸入狀態
            TX1_Buffer[9]  = !X05;    //X05輸入狀態
            TX1_Buffer[10] = !X06;    //X06輸入狀態
            TX1_Buffer[11] = !X07;    //X07輸入狀態
            
            TX1_Buffer[12] =  Y00;    //Y00輸出狀態
            TX1_Buffer[13] =  Y01;    //Y01輸出狀態
            TX1_Buffer[14] =  Y02;    //Y02輸出狀態
            TX1_Buffer[15] =  Y03;    //Y03輸出狀態
            TX1_Buffer[16] =  Y04;    //Y04輸出狀態
            TX1_Buffer[17] =  Y05;    //Y05輸出狀態
            
            TX1_Buffer[18] = 0x00;    //和校驗:從長度位開始(包括長度位)到校驗前一位數累加和取低8位
            
            for(cnt=2;cnt<18;cnt++)
            {
               TX1_Buffer[18] += TX1_Buffer[cnt]; 
            }

            COM1.TX_write  = 0;
            Uart1_TX_EN    = 1;//uart1發送資料使能置“1”,準備開始發送資料
        }
        else
        {         
            if(COM1.TX_write<19)
            {
                if(COM1.B_TX_busy == 0)
                {
                    COM1.B_TX_busy = 1;
                    SBUF = TX1_Buffer[COM1.TX_write++];        //發送接收到的字符
                }
            }
            else
            {
                COM1.RX_Cnt     = 0;
                Uart1_RX_Finish = 0;
                Uart1_TX_EN     = 0;//資料發送完成,uart1發送資料使能清“0”
                
                memset(RX1_Buffer,NULL,sizeof(RX1_Buffer));//清空RX1_Buffer陣列
            }
        }
    }
}

這部分代碼主要有兩個功能,第一部分主要就是對串口發來的資料的決議,根據不同的指令,執行相關動作:

//根據收到的指令執行相應的動作
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x00))
{
    //接收到指令(十六進制):5A A5 03 06 00 00,Y00輸出ON
    Y00 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x10))
{
    //接收到指令(十六進制):5A A5 03 06 00 01,Y00輸出OFF
    Y00 = OutputT_OFF;
}

if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x01))
{
    //接收到指令(十六進制):5A A5 03 06 00 01,Y01輸出ON
    Y01 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x11))
{
    //接收到指令(十六進制):5A A5 03 06 00 11,Y01輸出OFF
    Y01 = OutputT_OFF;
}

if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x02))
{
    //接收到指令(十六進制):5A A5 03 06 00 02,Y02輸出ON
    Y02 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x12))
{
    //接收到指令(十六進制):5A A5 03 06 00 12,Y02輸出OFF
    Y02 = OutputT_OFF;
}

if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x03))
{
    //接收到指令(十六進制):5A A5 03 06 00 03,Y03輸出ON
    Y03 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x13))
{
    //接收到指令(十六進制):5A A5 03 06 00 13,Y03輸出OFF
    Y03 = OutputT_OFF;
}

if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x04))
{
    //接收到指令(十六進制):5A A5 03 06 00 04,Y04輸出ON
    Y04 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x14))
{
    //接收到指令(十六進制):5A A5 03 06 00 14,Y04輸出OFF
    Y04 = OutputT_OFF;
}

if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x05))
{
    //接收到指令(十六進制):5A A5 03 06 00 05,Y05輸出ON
    Y05 = OutputT_ON;
}
if((RX1_Buffer[0] == 0x03)&&(RX1_Buffer[1] == 0x06)&&(RX1_Buffer[2] == 0x00)&&(RX1_Buffer[3] == 0x15))
{
    //接收到指令(十六進制):5A A5 03 06 00 15,Y05輸出OFF
    Y05 = OutputT_OFF;
}

處理完相關指令后,變重新裝載要發送的資料(控制板回傳給串口助手的資料),回傳的資料幀格式為:幀頭(2位元組)+ 長度(1位元組)+ 命令(1位元組)+ X00狀態(1位元組)+ X01狀態(1位元組)+ X02狀態(1位元組)+ X03狀態(1位元組)+ X04狀態(1位元組)+ X05狀態(1位元組)+ X06狀態(1位元組)+ X07狀態(1位元組)+ Y0狀態(1位元組)+ Y1狀態(1位元組)+ Y2狀態(1位元組)+ Y3狀態(1位元組)+ Y4狀態(1位元組)+ Y5狀態(1位元組),代碼如下圖:

TX1_Buffer[0]  = 0x5A;    //幀頭
TX1_Buffer[1]  = 0xA5;    //幀頭
TX1_Buffer[2]  = 0x10;    //長度:從長度后一位開始到最后一個資料總位元組數
TX1_Buffer[3]  = 0x06;    //命令0x06

TX1_Buffer[4]  = !X00;    //X00輸入狀態
TX1_Buffer[5]  = !X01;    //X01輸入狀態
TX1_Buffer[6]  = !X02;    //X02輸入狀態
TX1_Buffer[7]  = !X03;    //X03輸入狀態
TX1_Buffer[8]  = !X04;    //X04輸入狀態
TX1_Buffer[9]  = !X05;    //X05輸入狀態
TX1_Buffer[10] = !X06;    //X06輸入狀態
TX1_Buffer[11] = !X07;    //X07輸入狀態

TX1_Buffer[12] =  Y00;    //Y00輸出狀態
TX1_Buffer[13] =  Y01;    //Y01輸出狀態
TX1_Buffer[14] =  Y02;    //Y02輸出狀態
TX1_Buffer[15] =  Y03;    //Y03輸出狀態
TX1_Buffer[16] =  Y04;    //Y04輸出狀態
TX1_Buffer[17] =  Y05;    //Y05輸出狀態

TX1_Buffer[18] = 0x00;    //和校驗:從長度位開始(包括長度位)到校驗前一位數累加和取低8位

for(cnt=2;cnt<18;cnt++)
{
   TX1_Buffer[18] += TX1_Buffer[cnt]; 
}

當然,這里筆者寫的有點繁瑣,其實8個輸入狀態完全可以用一個位元組來實作,6個輸出狀態也可以完全用一個位元組來實作,這里筆者只是為了讓大家更好的理解這個協議,所以寫的繁瑣了一點,資料裝載完成,就可以將資料一個個發送出去了,這里便是第二部分的功能:

if(COM1.TX_write<19)
{
    if(COM1.B_TX_busy == 0)
    {
        COM1.B_TX_busy = 1;
        SBUF = TX1_Buffer[COM1.TX_write++];        //發送接收到的字符
    }
}
else
{
    COM1.RX_Cnt     = 0;
    Uart1_RX_Finish = 0;
    Uart1_TX_EN     = 0;//資料發送完成,uart1發送資料使能清“0”
    
    memset(RX1_Buffer,NULL,sizeof(RX1_Buffer));//清空RX1_Buffer陣列
}

發送完成之后,將接收陣列中的資料清零:

memset(RX1_Buffer,NULL,sizeof(RX1_Buffer));//清空RX1_Buffer陣列

接下來,我們只需要將程式下載到控制板中,再用串口助手來發送對應的指令,就能看到效果了,好了,有關自定義協議的知識就簡單介紹到這里了,有疑問的小伙伴們可以給筆者留言或者直接參與評論,下一節筆者將給大家介紹“單片機EEPROM的應用”,詳見“SYK-0806-A2S1 工業自動化控制之【17-EEPROM實作資料掉電保存】”,感謝大家的支持!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/399656.html

標籤:其他

上一篇:RFID射頻標簽

下一篇:ESP32之 ESP-IDF + Clion 開發環境搭建(三)—— 使用 Clion 對 ESP32 進行 JTAG 除錯

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more