主頁 >  其他 > 使用無線串口進行單片機通信

使用無線串口進行單片機通信

2020-12-22 12:16:18 其他

文章目錄

    • 前言
    • 一、串口通信基本知識
      • 1串口通訊
      • 2通訊方式
      • 3波特率
      • 4同步通信與異步通信
      • 5無線串口模塊
    • 二、無線串口模塊配置
    • 三、單片機配置
      • 1引腳設定
      • 2串口初始化
      • 3資料收發
    • 四、利用傳輸協議收發
      • 1向上位機發送資料
      • 2單片機之間相互傳輸
        • 單片機發送
        • 單片機接收

前言

? 最近學習了利用無線串口模塊進行單片機與電腦上位機,或者進行單片機與單片機之間的通信,在這里分享一下串口通信的作業原理和通信協議的相關學習筆記,以MK60為例,

一、串口通信基本知識

1串口通訊

串口是一種按(bit)進行發送和接收位元組的通訊方式,即在傳輸中將1位元組(Byte)拆分成8位,用一個埠一位一位地進行傳輸,

2通訊方式

由于在資料傳輸時占用了一個埠,所以串口的資料線最少只需要一根,使用一根傳輸線可以實作單工模式(Simplex Communication)通信或者半雙工模式(Half Duplex)通信,使用兩根傳輸線可以實作全雙工模式(Full Duplex)通信,

單工模式通信的一方固定為發送端,另一方固定為接收端,資訊單向傳輸,

半雙工模式通信中資訊傳輸方向是可以改變的,即傳輸的兩個設備在傳輸中負責發送還是接收是不固定的,半雙工模式通信中任一時刻的通信方向是唯一的,當一方為發射端時另一方為接收端,不可以同時進行收發,

全雙工模式通信中兩根傳輸線各自負責一個方向的傳輸,可以實作收發同時進行,

3波特率

波特率(Baud)就是每秒鐘傳輸的資料位數,它是對傳輸速率的一種度量,

通常使用的波特率有 600、900、1200、1800、2400、4800、9600、19200、38400、57600、115200 等,

4同步通信與異步通信

同步通信

進行資料傳輸時,發送和接收雙方要保持完全的同步,要求接收和發送設備必須使用同一時鐘,同步通信速度快但是對于軟硬體要求較高,

異步通信

異步通信在發送字符時,所發送的字符之間的時隙可以是任意的,傳輸雙方按照一定的協議,使傳輸資料的每一幀包含“開始位”和“停止位”(或包含“校驗位”),每一幀的資料傳輸總是從“開始位”開始,傳輸到“停止位”結束,異步通信的實作相對簡單,但是傳輸效率相對同步通信較低,在本文中所使用的的都是異步通信方式,

在單片機中使用異步收發器(Universal Asynchronous Receiver/Transmitters,UART)功能進行實作,

5無線串口模塊

? 無線串口模塊本身作用相當于有線串口通信中的傳輸線,單片機上的從機和電腦上用的主機端,一般使用的是全雙工通信,常見有四個介面,除去VCC和GND的電源介面外,另外兩個介面分別為RXD:接收資料,TXD:發送資料,與單片機之間的串口介面交叉相連(如圖),

二、無線串口模塊配置

? 第一次使用串口模塊之前需要事先配置好串口模塊,購買串口模塊時商家一般都會提供相關資料,這里主要提一下配置中需要注意的幾個點:

1.電腦埠查看
先注意安裝驅動,配置時的埠號可以 右鍵***此電腦—>管理—>設備管理器—>埠*** 查看,
2.主從地址設定
設定口模塊的主從機的地址必須相同,并且注意不要和其他的無線串口使用同一地址,
3.波特率設定
無線串口模塊主從機的波特率以及電腦上位機和單片機設定的波特率必須相同,否則無法正常通信,波特率設定并不是越大越好,根據實際自己能通信的波特率而定,不推薦太大,
4.從機設定模式
配置從機時需要注意將SET引腳和VCC引腳短接以進入配置模式,

三、單片機配置

1引腳設定

單片機的串口可以使用的引腳是固定的,可以查閱資料手冊,下面列舉的是K60的串口通道,

/**********************************  UART   ***************************************/

//      模塊通道      埠       可選范圍                          建議
#define UART0_RX    PTA15 	 //PTB16     	   	 //PTA1、PTA15、PTB16、PTD6          PTA1不要用(與Jtag沖突)
#define UART0_TX    PTA14 	 //PTB17    		 //PTA2、PTA14、PTB17、PTD7          PTA2不要用(與Jtag沖突)

#define UART1_RX    PTE1     //PTC3、PTE1
#define UART1_TX    PTE0     //PTC4、PTE0

#define UART2_RX    PTD2     //PTD2
#define UART2_TX    PTD3     //PTD3

#define UART3_RX    PTE5     //PTB10、PTC16、PTE5
#define UART3_TX    PTE4     //PTB11、PTC17、PTE4

#define UART4_RX    PTE25    //PTC14、PTE25
#define UART4_TX    PTE24    //PTC15、PTE24

#define UART5_RX    PTE9     //PTD8、PTE9
#define UART5_TX    PTE8     //PTD9、PTE8

UART0 和 UART1 時鐘源為內核時鐘,UART2~UART5 的時鐘源為外設時鐘(總線時鐘),在后面的示例中所使用的的都是UART3通道,從機的TX介面連接到PTE5,RX介面連接到PTE4,可以自行根據實際情況修改,

2串口初始化

K60的串口在初始化之后就可以直接接收發送了,但在實際的使用中接收資料時容易丟失資料,需要設定串口資料接收的中斷,當資料需要接收時就進入中斷,

#define UARTn UART3  //使用UART3通道
#define BAUD  57600  //設定波特率為57600
#define UARTn_RX_TX_IRQ  UART3_RX_TX_IRQn
#define UARTn_RX_TX_VECTORn UART3_RX_TX_VECTORn
void UART_IRQHandler(void);//中斷服務函式宣告
void uart_rx_irq_en(UARTn_e uratn)
{
    UART_C2_REG(UARTN[uratn]) |= UART_C2_RIE_MASK;                          //使能UART接收中斷
    enable_irq((IRQn_t)((uratn << 1) + UART0_RX_TX_IRQn));                  //使能IRQ中斷
}
void uart_init()
{
	uart_init (UARTn, BAUD);									 //初始化串口UARTn,波特率為BAUD
	NVIC_SetPriority(UARTn_RX_TX_IRQn,1);  						 //配置串口中斷優先級為1
    set_vector_handler(UARTn_RX_TX_VECTORn,UART_IRQHandler);  	 //配置串口中斷服務函式UART_IRQHandler
    uart_rx_irq_en(UARTn);										 //使能中斷
}

3資料收發

在進行大量資料的收發之前,先進行簡單資料的收發來測驗,以下程式中實作在上位機中發送一個字符,單片機接收到后再將原資料處理發送回上位機,

void uart_getchar (UARTn_e uratn, char *ch)//接收一個字符
{
    while (!(UART_S1_REG(UARTN[uratn]) & UART_S1_RDRF_MASK));   //等待接收滿了       
    *ch = UART_D_REG(UARTN[uratn]);    							// 獲取接收到的8位資料
}
void uart_putchar (UARTn_e uratn, char ch)//發送一個
{    
    while(!(UART_S1_REG(UARTN[uratn]) & UART_S1_TDRE_MASK));	//等待發送緩沖區空
    UART_D_REG(UARTN[uratn]) = (uint8)ch;   					 //發送資料
}

int main()										//單片機主函式
{
    char ch;
 	uart_init();//串口初始化
    while(1)
    {
    uart_getchar(UARTn,&ch);  //接收一個字符儲存到變數ch
    ch++;//示例處理,轉入'A'輸出'B'
    uart_putchar(UARTn,ch);  //發送字符ch,長資料接收需要在中斷中
    }
}

程式效果:

? 在上位機發送字符’A’,單片機回傳字符’B’

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vkzflyO2-1608480123544)(C:\Users\yejiahang\AppData\Roaming\Typora\typora-user-images\image-20201216231640759.png)]

四、利用傳輸協議收發

1向上位機發送資料

? 在實際使用當中,僅僅單字符傳輸是不夠的,所以這里就要用到傳輸協議了,顧名思義,協議就是傳輸雙方規定好固定傳輸格式,從而使接收到多個資料時不會混淆,并且當產生傳輸資料出錯時可以檢測到甚至糾錯,傳輸協議可以按照自己的上位機或者自己設計,

? 這是我所使用的匿名上位機的傳輸協議格式:

“AAAA”+“02”+Pb+X[0]+X[1]+···+X[n]

AAAA
標志位,標志一幀資料的開始
02
協議代碼, 表示此協議為02號協議
Pb
校驗位,將n個資料求和之后得出的校驗位,檢驗是否有誤
X[n]
資料 ,所要傳輸的n個資料

下面為示例協議的發送函式,注意:由于傳輸的資料為16位,而串口一次傳8位資料,所以單個資料被拆成兩個進行傳輸,

unsigned short int pst[10]={0};
void pstInit(void)//所要發送的資料設定,這里傳輸三姿態角作為示例
{
pst[0]=pitch;
pst[1]=roll;
pst[2]=yaw;
}
/*
*uartn 串口通道
*pst  所要發送的資料
*x    協議代碼 此處為2
*/
void Data_SendMc(UARTn_e uartn,unsigned short int *pst,uint8 x)
{  
 	unsigned char _cnt=0;  unsigned char sum = 0;
 	unsigned char data_to_send[23];         //發送快取
 	data_to_send[_cnt++]=0xAA;
 	data_to_send[_cnt++]=0xAA;
  	data_to_send[_cnt++]=x;
  	data_to_send[_cnt++]=0;
  	data_to_send[_cnt++]=(unsigned char)(pst[0]>>8);  //高8位
  	data_to_send[_cnt++]=(unsigned char)pst[0];  		//低8位
 	data_to_send[_cnt++]=(unsigned char)(pst[1]>>8);
 	data_to_send[_cnt++]=(unsigned char)pst[1];
  	data_to_send[_cnt++]=(unsigned char)(pst[2]>>8); 
  	data_to_send[_cnt++]=(unsigned char)pst[2];
  	data_to_send[_cnt++]=(unsigned char)(pst[3]>>8);
  	data_to_send[_cnt++]=(unsigned char)pst[3];
 	data_to_send[_cnt++]=(unsigned char)(pst[4]>>8);
 	data_to_send[_cnt++]=(unsigned char)pst[4];
 	data_to_send[_cnt++]=(unsigned char)(pst[5]>>8);
 	data_to_send[_cnt++]=(unsigned char)pst[5];
  	data_to_send[_cnt++]=(unsigned char)(pst[6]>>8);
  	data_to_send[_cnt++]=(unsigned char)pst[6];
 	data_to_send[_cnt++]=(unsigned char)(pst[7]>>8);
 	data_to_send[_cnt++]=(unsigned char)pst[7];
 	data_to_send[_cnt++]=(unsigned char)(pst[8]>>8);
  	data_to_send[_cnt++]=(unsigned char)pst[8];
	data_to_send[3] = _cnt-4;
	sum = 0;
	for(unsigned char i=0;i<_cnt;i++)//校驗位計算
    	sum += data_to_send[i];
   	data_to_send[_cnt++] = sum;    
	for(unsigned char i=0;i<_cnt;i++)
		uart_putchar (uartn,data_to_send[i] );//資料發送      
}

接收資料接收部分將區分單片機發送資料與電腦發送的資料,以十六進制數AAAA為標志位的資料是由單片機發送,以字串“AAAA”為標志位的是由上位機發送資料,

2單片機之間相互傳輸

下面是我在單片機之間傳輸資料時使用的格式:

(X1,X2,······,Xn,Pb)

’('
開始位 , 標志一幀資料的開始
Xn
資料 , 所要傳輸的n個資料
Pb
校驗位 , 將n個資料求和之后得出的校驗位,檢驗是否有誤
’)'
停止位, 標志一幀資料的結束

單片機發送

#define START  '(' //開始位設定
#define FINISH ')' //結束位設定
#define SP ','     //以逗號分隔
unsigned short int pst[10]={0};
void pstInt(void)//所要發送的資料設定,同向上位機發送
{
pst[0]=pitch;
pst[1]=roll;
pst[2]=yaw;
}
/*
*uartn 串口通道
*pst  所要發送的資料
*x    發送資料個數 示例中為3
*/
void Data_SendMcu(UARTn_e uartn,unsigned short int *pst,uint8 x)
{  
    
 	unsigned char _cnt=0;  unsigned char sum = 0;
 	unsigned char data_to_send[45];         //發送快取
 	data_to_send[_cnt++]=START;
 	for(unsigned char i=0;i<x;i++)
    {
    data_to_send[_cnt++]=(unsigned char)(pst[i]>>8);  //高8位
  	data_to_send[_cnt++]=(unsigned char)pst[i];  		//低8位   
	data_to_send[_cnt++]=SP;
    }
	sum = 0;
	for(unsigned char i=0;i<_cnt;i++)//校驗位計算
    	sum += data_to_send[i];
    data_to_send[_cnt++]=0;
   	data_to_send[_cnt++] = sum;   
    data_to_send[_cnt++] =FINISH; 
	for(unsigned char i=0;i<_cnt;i++)
		uart_putchar (uartn,data_to_send[i] );//資料發送      
}

與單片機的發送和與上位機發送類似,由于不受上位機協議限制,我們可以自己設定發送資料的個數,即每一幀傳輸資料長度可以不一樣,不需要用0占位,

單片機接收

typedef enum
{
  UART_GET_WAIT,    //等待接收狀態
  UART_GET_ING,     //正在接收資料
  UART_GET_T,       //接收成功
  UART_GET_F,       //接收失敗(校驗失敗)
}UartGetStatusNode;
typedef struct
{
unsigned short int  data_to_Get[45];  //接收快取
unsigned char  n;                //上一分隔符位置
unsigned char  nn;   			//當前接收位置
unsigned char  t;               //接收到資料個數
unsigned short int prt[10];           //接收資料快取
unsigned short int UartGetCh[10];	  //可信資料
}UartInfoNode;
UartGetStatusNode UartGetStatus=UART_GET_WAIT; //接收狀態機
UartInfoNode UartInfo; //資料結構體變數
void Data_GetInit(void)//結構體初始化
{
    memset(UartInfo.data_to_Get,0,45);
    UartInfo.n=0;
    UartInfo.nn=0;
    UartInfo.t=0;
    memset(UartInfo.prt,0,10);
}
void Data_GetMcu(UARTn_e uartn,char ch)
{      
	switch(UartGetStatus)
	{
		case UART_GET_WAIT:                             
                  if(ch=='(')  //找到開始位
                  {
                      UartInfo.data_to_Get[UartInfo.nn++]=ch;
                      UartInfo.n=UartInfo.nn-1;
                      UartGetStatus=UART_GET_ING;                   
                  }                                               
			break;
        case UART_GET_ING:                              
                  if(ch=='(')
                     UartGetStatus=UART_GET_F;//資料位數錯誤,接收失敗
                    
                  else if(ch==',')  //找到分隔位
                  {
                      UartInfo.data_to_Get[UartInfo.nn++]=ch;
                      if(UartInfo.nn==UartInfo.n+4)
                          UartInfo.prt[UartInfo.t++]= UartInfo.data_to_Get[UartInfo.nn-3]<<8+UartInfo.data_to_Get[UartInfo.nn-2];//存入待校驗資料
                      else
                          UartGetStatus=UART_GET_F;//資料位數錯誤,接收失敗
                     UartInfo.n=UartInfo.nn-1;
                  }
                  else if(ch==')')//找到結束位
                  {
                    UartInfo.data_to_Get[UartInfo.nn++]=ch;
                      for(unsigned char i=0;i<UartInfo.nn-3;i++)//進行校驗
                          sum +=UartInfo.data_to_Get[i];
                     if(sum==UartInfo.data_to_Get[UartInfo.nn-3]<<8+UartInfo.data_to_Get[UartInfo.nn-2])
                        UartGetStatus=UART_GET_T;//校驗通過,資料可信
                      else
                          UartGetStatus=UART_GET_F;//檢驗未通過,資料不可信
                  }
                 else
                     UartInfo.data_to_Get[UartInfo.nn++]=ch;
                 if(UartInfo.nn>44)
                     UartGetStatus=UART_GET_F;                            
            break;
        case UART_GET_T:
            for(unsigned char i=0;i<UartInfo.t;i++)	//接收成功,將快取資料存入UartGetCh
                UartInfo.UartGetCh[i]=UartInfo.prt[i];
            Data_GetInit();
            UartGetStatus=UART_GET_WAIT;
            sum=0;
            break;
        case UART_GET_F: //接收失敗,重新查找
            Data_GetInit();
            UartGetStatus=UART_GET_WAIT;
            sum=0;
            break;
        default:
            break;
	}
}
void UART_IRQHandler(void)
{
    if(UART_S1_REG(UARTN[UARTn]) & UART_S1_RDRF_MASK)  //接收資料暫存器滿
		uart_getchar (UARTn, &ch);
		Data_GetMcu(UARTn,ch);//接收處理
   if(UART_S1_REG(UARTN[UARTn]) & UART_S1_TDRE_MASK )  //發送資料暫存器空
   {
		Data_SendMcu(UARTn,pst,x);
   }
}
int main()
{  
    uart_init();
    Data_GetInit();
	while(1)
   {
      //對UartInfo.UartGetCh進行處理
   }
}



當接收到的資料校驗失敗的時候,這一幀的資料直接放棄,等待下一次的接收,只有當校驗通過的時候才會將快取資料存入UartGetCh陣列當中,

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

標籤:其他

上一篇:JS資料型別檢測typeof、instanceof、constructor、Object.prototype.toString.call(val)的區別

下一篇:LeetCode題解:矩陣中戰斗力最弱的 K 行

標籤雲
其他(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