国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32狀態(tài)機編程實例——全自動洗衣機(上)

這篇具有很好參考價值的文章主要介紹了STM32狀態(tài)機編程實例——全自動洗衣機(上)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前面幾篇文章,以按鍵功能,介紹了狀態(tài)機的原理與按鍵狀態(tài)機實例,實現(xiàn)按鍵單擊、雙擊、長按等狀態(tài)的檢測。

本篇,繼續(xù)使用狀態(tài)機編程,來實現(xiàn)一個更有趣的功能——全自動洗衣機。

1 全自動洗衣機功能分析

下面是一個全自動洗衣機的控制面板:

STM32狀態(tài)機編程實例——全自動洗衣機(上)

面板上有4個按鍵:

  • 電源:控制洗衣機通電與斷電
  • 水位:選擇洗衣時需要的水位,有1~8個水位
  • 程序:選擇不同的洗衣模式,有1~10個模式
    • 01:標準
    • 02:輕柔
    • 03:快速
    • 10:桶風(fēng)干
  • 啟動/暫停:用于啟動或暫停洗衣任務(wù)

面板上還有一個數(shù)碼管,用于顯示當前的工作狀態(tài)與剩余時間,可顯示的工作模式有:

  • AA:浸泡
  • BB:洗滌
  • CC:漂洗
  • DD:脫水

本篇,就按照這款洗衣機的操作方式實現(xiàn)對應(yīng)的洗衣機控制邏輯。需注意的是:

  • 實際的洗衣機有水位檢測傳感器,本篇中,暫用時間延時模擬水位的增加,且默認開機時水位為0
  • 實際的洗衣機中的洗衣模式,會根據(jù)不同的模式自動設(shè)置清洗次數(shù)每次清洗的時間以及清洗力度,本篇為了簡化起見,清洗模式的設(shè)置僅用于區(qū)分不同的清洗次數(shù)
  • 某些特殊的清洗模式,如單獨的脫水,桶風(fēng)干等,本篇暫不實現(xiàn)
  • 對于狀態(tài)的顯示 ,本篇先以串口打印的實現(xiàn)展示,下篇使用OLED小屏幕來顯示不同清洗狀態(tài)的圖標等信息

2 畫狀態(tài)圖

根據(jù)上面分析的全自動洗衣機的功能,以及我們自己使用洗衣機時的經(jīng)驗,可以畫出如下的全自動洗衣機的狀態(tài)圖:

STM32狀態(tài)機編程實例——全自動洗衣機(上)

首先是上電開機,洗衣機可能會開機自檢,檢測洗衣機的各個部件是否正常,次過程很短。

然后就處于空閑狀態(tài),此時用戶可以設(shè)置水位與清洗模式,若不設(shè)置,則為默認的水位與洗衣模式。

接著觸發(fā)開始按鍵后,就開始清洗了,一般流程就是:加水、清洗、排水、甩干、結(jié)束。

根據(jù)不同的清洗模式,加水、清洗和排水這3個過程會循環(huán)執(zhí)行一定的次數(shù)。

另外,在不同的工作階段,按下暫停鍵可以讓洗衣任務(wù)暫停,再按繼續(xù)可讓洗衣任務(wù)繼續(xù)。

3 編程實現(xiàn)

3.1 多按鍵檢測功能

本篇介紹的洗衣機的按鍵,僅需要檢測按鍵單擊即可,不需要雙擊與長按功能,因此,可使用之前文章介紹的最基礎(chǔ)的按鍵狀態(tài)機來為洗衣機狀態(tài)機提供按鍵事件。

之前介紹的按鍵狀態(tài)機,只有一個按鍵,本篇需要用到4個按鍵(除去電源鍵,3個也可以),因此,需要對按鍵狀態(tài)機稍加修改,實現(xiàn)按鍵狀態(tài)機的復(fù)用。

之前介紹的按鍵狀態(tài)機,使用了幾個全局變量來表示狀態(tài),更合理的做法是將其封裝起來:

typedef struct {
	KEY_STATUS keyStatus;    //當前循環(huán)結(jié)束的(狀態(tài)機的)狀態(tài)
	KEY_STATUS nowKeyStatus; //當前狀態(tài)(每次循環(huán)后與pKeyFsmData->keyStatus保持一致)
	KEY_STATUS lastKeyStatus; //上次狀態(tài)(用于記錄前一狀態(tài)以區(qū)分狀態(tài)的來源)
	int keyIdx;
}KeyFsmData;

注意,額外增加了一個按鍵索引值,用來告訴狀態(tài)機要檢測哪個按鍵。

再將原來的按鍵狀態(tài)機程序,通過入?yún)?/strong>的形式將上述定義的結(jié)構(gòu)體傳入,并通過函數(shù)返回的形式返回按鍵是否被按下。

這樣修改后的按鍵狀態(tài)機,就是一個獨立的模塊了,可以通過傳入不同的參數(shù),實現(xiàn)不同按鍵的檢測。

bool key_press_check(KeyFsmData *pKeyFsmData)
{
	bool bPress = false;
		
	switch(pKeyFsmData->keyStatus)
	{
//省略...

對于本篇需要的4個按鍵的檢測,就可以定義4個數(shù)據(jù)結(jié)構(gòu)體,分別調(diào)用4次狀態(tài)機函數(shù)即可,實現(xiàn)代碼的復(fù)用。

KeyFsmData pKey0FsmData;
KeyFsmData pKey1FsmData;
KeyFsmData pKey2FsmData;
KeyFsmData pKey3FsmData;

void key_check_init(KeyFsmData *pKeyFsmData, int keyIdx)
{
	pKeyFsmData->keyStatus = KS_RELEASE;
	pKeyFsmData->lastKeyStatus = KS_RELEASE;
	pKeyFsmData->nowKeyStatus = KS_RELEASE;
	pKeyFsmData->keyIdx = keyIdx;
}

void multi_key_check_init()
{
	key_check_init(&pKey0FsmData, 0);
	key_check_init(&pKey1FsmData, 1);
	key_check_init(&pKey2FsmData, 2);
	key_check_init(&pKey3FsmData, 3);
}

int g_keyPressIdx = -1;
void multi_key_check()
{
	bool key0 = key_press_check(&pKey0FsmData);
	bool key1 = key_press_check(&pKey1FsmData);
	bool key2 = key_press_check(&pKey2FsmData);
	bool key3 = key_press_check(&pKey3FsmData);
	
	if (key0 | key1 | key2 | key3)
	{
		//printf("key0:%d, key1:%d, key2:%d, key3:%d, \r\n", key0, key1, key2, key3);
		
		if (key0)
		{
			g_keyPressIdx = 0;
		}
		else if (key1)
		{
			g_keyPressIdx = 1;
		}
		else if (key2)
		{
			g_keyPressIdx = 2;
		}
		else if (key3)
		{
			g_keyPressIdx = 3;
		}
	}
}

int get_press_key_idx()
{
	int idx = g_keyPressIdx;
	g_keyPressIdx = -1;
	
	return idx;
}

其中,multi_key_check函數(shù),放到50ms周期的定時器中斷服務(wù)函數(shù)中,使按鍵狀態(tài)機程序運行起來。

get_press_key_idx函數(shù),用于洗衣機程序來獲取不同按鍵的按下事件,每次獲取后,將按鍵事件清除(g_keyPressIdx設(shè)為無效值-1)

3.2 洗衣功能

按照上面繪制的洗衣機狀態(tài)圖,使用switch-case法編寫對應(yīng)的程序即可:

#define WASHER_STATUS_ENUM(STATUS)                     \
	STATUS(WS_INIT)         /*開機初始化自檢*/         \
	STATUS(WS_IDLE)         /*空閑(等待模式設(shè)置)狀態(tài)*/ \
	STATUS(WS_ADD_WATER)    /*加水狀態(tài)*/               \
	STATUS(WS_WASH)         /*清洗狀態(tài)*/               \
	STATUS(WS_DRAIN_WATER)  /*排水狀態(tài)*/               \
	STATUS(WS_SPIN_DRY)     /*甩干狀態(tài)*/               \
	STATUS(WS_PAUSE)        /*暫停狀態(tài)*/               \
	STATUS(WS_NUM)          /*狀態(tài)總數(shù)(無效狀態(tài))*/ 

typedef enum
{
	WASHER_STATUS_ENUM(ENUM_ITEM)
}WASHER_STATUS;

const char* washer_status_name[] = {
	WASHER_STATUS_ENUM(ENUM_STRING)
};

WASHER_STATUS g_washerStatus = WS_INIT;    //當前循環(huán)結(jié)束的(狀態(tài)機的)狀態(tài)
WASHER_STATUS g_nowWasherStatus = WS_INIT; //當前狀態(tài)(每次循環(huán)后與pKeyFsmData->keyStatus保持一致)
WASHER_STATUS g_lastWasherStatus = WS_INIT; //上次狀態(tài)(用于記錄前一狀態(tài)以區(qū)分狀態(tài)的來源)

int g_WorkLoopCnt = 0;
int g_WaterLevel = 5; //1~8
int g_WashMode = 2; //暫定為清洗次數(shù):1~3
int g_curWashCnt = 0;

void washer_run_loop()
{
	switch(g_washerStatus)
	{
		/*開機初始化自檢*/ 
		case WS_INIT:
			g_washerStatus = washer_do_init();
			break;
		
		/*空閑(等待模式設(shè)置)狀態(tài)*/
		case WS_IDLE:
			g_washerStatus = washer_do_idle();
			break;
		
		/*加水狀態(tài)*/
		case WS_ADD_WATER:
			g_washerStatus = washer_do_add_water();
			break;
		
		/*清洗狀態(tài)*/
		case WS_WASH:
			g_washerStatus = washer_do_wash();
			break;
		
		/*排水狀態(tài)*/
		case WS_DRAIN_WATER:
			g_washerStatus = washer_do_drain_water();
			break;
		
		/*甩干狀態(tài)*/
		case WS_SPIN_DRY:
			g_washerStatus = washer_do_spin_dry();
			break;
		
		/*暫停狀態(tài)*/
		case WS_PAUSE:
			g_washerStatus = washer_do_pause();
			break;
		
		default: break;
	}
	
	if (g_washerStatus != g_nowWasherStatus)
	{
		g_lastWasherStatus = g_nowWasherStatus;
		g_nowWasherStatus = g_washerStatus;
		//printf("new washer status:%d(%s)\r\n", g_washerStatus, washer_status_name[g_washerStatus]);
	}
}

這里將洗衣機不同狀態(tài)時的處理邏輯,都分別使用函數(shù)來實現(xiàn),并將其返回值作為下一個要跳轉(zhuǎn)的狀態(tài)。

各個狀態(tài)的處理函數(shù)如下:

/*開機初始化自檢*/ 
WASHER_STATUS washer_do_init()
{
	WASHER_STATUS nextStatus = WS_INIT;
	
	g_WorkLoopCnt++;
	if (10 == g_WorkLoopCnt) //自檢結(jié)束
	{
		printf("default water level:%d\r\n", g_WaterLevel);
		printf("default wash mode:%d\r\n", g_WashMode);
		printf("washer idle...\r\n");
		
		g_WorkLoopCnt = 0;
		nextStatus = WS_IDLE;
	}
	
	return nextStatus;
}

/*空閑(等待模式設(shè)置)狀態(tài)*/
WASHER_STATUS washer_do_idle()
{
	WASHER_STATUS nextStatus = WS_IDLE;
	
	const WASHER_KEY key = check_key_press();
	switch(key)
	{
		case W_KEY_START_PAUSE:
			g_WorkLoopCnt = 0;
			nextStatus = WS_ADD_WATER;
			printf("add water...\r\n");
		break;
		
		case W_KEY_WATER_LEVEL:
			g_WaterLevel = (g_WaterLevel == 8) ? 1 : (g_WaterLevel+1);
			printf("set water level:%d\r\n", g_WaterLevel);
		break;
			
		case W_KEY_WASH_MODE:
			g_WashMode = (g_WashMode == 3) ? 1 : (g_WashMode+1);
			printf("set wash mode:%d\r\n", g_WashMode);
		break;
		
		default: break;
	}
	
	return nextStatus;
}

/*加水狀態(tài)*/
WASHER_STATUS washer_do_add_water()
{
	WASHER_STATUS nextStatus = WS_ADD_WATER;
	
	const WASHER_KEY key = check_key_press();
	if (key == W_KEY_START_PAUSE)
	{
		nextStatus = WS_PAUSE;
		printf("[%s] pause...\r\n", __func__);
	}
	else
	{
		g_WorkLoopCnt++;
		if (g_WaterLevel == (g_WorkLoopCnt / 10)) //加水結(jié)束
		{
			g_WorkLoopCnt = 0;
			nextStatus = WS_WASH;
			printf("[%s] done\r\n", __func__);
			printf("wash...\r\n");
		}
	}
	
	return nextStatus;
}

/*清洗狀態(tài)*/
WASHER_STATUS washer_do_wash()
{
	WASHER_STATUS nextStatus = WS_WASH;
	
	const WASHER_KEY key = check_key_press();
	if (key == W_KEY_START_PAUSE)
	{
		nextStatus = WS_PAUSE;
		printf("[%s] pause...\r\n", __func__);
	}
	else
	{
		g_WorkLoopCnt++;
		if (6 == (g_WorkLoopCnt / 10)) //清洗結(jié)束
		{
			g_WorkLoopCnt = 0;
			nextStatus = WS_DRAIN_WATER;
			printf("[%s] done\r\n", __func__);
			printf("drain water...\r\n");
		}
	}
	
	return nextStatus;
}

/*排水狀態(tài)*/
WASHER_STATUS washer_do_drain_water()
{
	WASHER_STATUS nextStatus = WS_DRAIN_WATER;
	
	const WASHER_KEY key = check_key_press();
	if (key == W_KEY_START_PAUSE)
	{
		nextStatus = WS_PAUSE;
		printf("[%s] pause...\r\n", __func__);
	}
	else
	{
		g_WorkLoopCnt++;
		if (3 == (g_WorkLoopCnt / 10)) //排水結(jié)束
		{
			printf("[%s] done\r\n", __func__);
			g_curWashCnt++;
			printf("current wash and drain count:%d(target:%d)\r\n", g_curWashCnt, g_WashMode);
			g_WorkLoopCnt = 0;
			if (g_WashMode == g_curWashCnt)
			{
				printf("spin dry...\r\n");
				nextStatus = WS_SPIN_DRY;
			}
			else
			{
				printf("add water...\r\n");
				nextStatus = WS_ADD_WATER;
			}
		}
	}
	
	return nextStatus;
}

/*甩干狀態(tài)*/
WASHER_STATUS washer_do_spin_dry()
{
	WASHER_STATUS nextStatus = WS_SPIN_DRY;
	
	const WASHER_KEY key = check_key_press();
	if (key == W_KEY_START_PAUSE)
	{
		nextStatus = WS_PAUSE;
		printf("[%s] pause...\r\n", __func__);
	}
	else
	{
		g_WorkLoopCnt++;
		if (100 == g_WorkLoopCnt) //甩干結(jié)束
		{
			g_WorkLoopCnt = 0;
			nextStatus = WS_IDLE;
			printf("[%s] done\r\n", __func__);
			printf("enter idle mode\r\n");
		}
	}
	
	return nextStatus;
}

/*暫停狀態(tài)*/
WASHER_STATUS washer_do_pause()
{
	WASHER_STATUS nextStatus = WS_PAUSE;
	
	const WASHER_KEY key = check_key_press();
	if (key != W_KEY_NULL)
	{
		switch (g_lastWasherStatus)
		{
			case WS_ADD_WATER:   nextStatus = WS_ADD_WATER;   printf("resume...\r\n"); break;
			case WS_WASH:        nextStatus = WS_WASH;        printf("resume...\r\n"); break;
			case WS_DRAIN_WATER: nextStatus = WS_DRAIN_WATER; printf("resume...\r\n"); break;
			case WS_SPIN_DRY:    nextStatus = WS_SPIN_DRY;    printf("resume...\r\n"); break;
			default: break;
		}
	}
	
	return nextStatus;
}

對于按鍵的獲取,這里定義了幾個對應(yīng)的功能按鍵,并從按鍵狀態(tài)機函數(shù)中獲取按鍵索引,再轉(zhuǎn)為洗衣機程序所需的對應(yīng)功能按鍵:

typedef enum
{
	W_KEY_NULL,        //沒有按鍵按下
	W_KEY_POWER,       //電源鍵按下
	W_KEY_WATER_LEVEL, //水位鍵按下
	W_KEY_WASH_MODE,   //清洗模式鍵按下
	W_KEY_START_PAUSE  //啟動/暫停鍵按下
}WASHER_KEY;

WASHER_KEY check_key_press()
{
	WASHER_KEY washerKey = W_KEY_NULL;
	int idx = get_press_key_idx();
	if (idx != -1)
	{
		switch(idx)
		{
			case 0: washerKey = W_KEY_POWER; break; //電源鍵按下
			case 1: washerKey = W_KEY_WATER_LEVEL; break; //水位鍵按下
			case 2: washerKey = W_KEY_WASH_MODE; break; //清洗模式鍵按下
			case 3: washerKey = W_KEY_START_PAUSE; break; //啟動/暫停鍵按下
			default: break;
		}
		//printf("%s idx:%d -> washerKey:%d\r\n", __func__, idx, washerKey);
	}
	
	return washerKey;
}

洗衣機狀態(tài)機主程序,可以放到main函數(shù)中,每隔100ms調(diào)用一次,使其運行起來:

int main(void)
{	
	delay_init();
	KEY_Init();
	uart_init(115200);
	TIM3_Int_Init(500-1,7200-1); //調(diào)用定時器使得50ms產(chǎn)生一個中斷

	printf("hello\r\n");
	
	while(1)
	{
		washer_run_loop();
		delay_ms(100);
	}
}

3.3 測試

將代碼燒寫到STM32板子中,通過3個按鍵(電源鍵暫不使用)操作,并通過串口打印,查看全自動洗衣機的運行情況:

STM32狀態(tài)機編程實例——全自動洗衣機(上)

4 總結(jié)

本篇實現(xiàn)了一款全自動洗衣機的基礎(chǔ)洗衣控制流程,可實現(xiàn)不同水位與清洗次數(shù)的設(shè)置,以及任務(wù)的暫停與繼續(xù)。此外,通過對之前按鍵狀態(tài)機的進一步優(yōu)化修改,實現(xiàn)了按鍵狀態(tài)機的復(fù)用,實現(xiàn)多個按鍵的檢測。下篇文章將進一步進行功能優(yōu)化,添加OLED小屏幕實現(xiàn)不同狀態(tài)的可視化展示。文章來源地址http://www.zghlxwxcb.cn/news/detail-492886.html

到了這里,關(guān)于STM32狀態(tài)機編程實例——全自動洗衣機(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 大麥搶票腳本全自動化

    大麥搶票腳本全自動化

    代碼中首先進行改造,基于autojs實現(xiàn)安卓端自動搶購,簡單來說就是在代碼中填寫好場次、票價、觀影人等信息后,停留在搶購頁面,出現(xiàn)立即搶購按︾便會執(zhí)行自動化點擊,直到處于待付款狀態(tài)才停止。 ? 可以自動檢測最新版本圖片滑塊,并滑動。 更新不自動點搶票按鈕

    2024年02月04日
    瀏覽(23)
  • Spring動態(tài)添加數(shù)據(jù)源(全自動)

    Spring動態(tài)添加數(shù)據(jù)源(全自動)

    一、使用場景 1、現(xiàn)在網(wǎng)上所有寫的動態(tài)數(shù)據(jù)源,都是假動態(tài)數(shù)據(jù),都是預(yù)先知道要連接幾個數(shù)據(jù)庫,但這不滿足具體真正需要動態(tài)添加連接數(shù)據(jù)庫的需求; 2、在很多業(yè)務(wù)場景下,如項目默認連一個主數(shù)據(jù)庫,服務(wù)啟動后,因業(yè)務(wù)不停的變更,需要動態(tài)連接其它數(shù)據(jù)庫處理數(shù)

    2024年02月01日
    瀏覽(31)
  • 全自動網(wǎng)頁生成系統(tǒng)網(wǎng)站源碼重構(gòu)版

    全自動網(wǎng)頁生成系統(tǒng)網(wǎng)站源碼重構(gòu)版

    所有模板經(jīng)過精心審核與修改,完美兼容小屏手機大屏手機,以及各種平板端、電腦端和360瀏覽器、谷歌瀏覽器、火狐瀏覽器等等各大瀏覽器顯示。 為用戶使用方便考慮,全自動網(wǎng)頁制作系統(tǒng)無需繁瑣的注冊與登入,直接選擇喜歡的模板輸入網(wǎng)頁信息即可制作,并且所以模板

    2024年01月22日
    瀏覽(30)
  • 一個開源的全自動視頻生成軟件MoneyPrinterTurbo

    一個開源的全自動視頻生成軟件MoneyPrinterTurbo

    只需提供一個視頻 主題 或 ,就可以全自動生成視頻文案、視頻素材、視頻字幕、視頻背景音樂,然后合成一個高清的短視頻。 一:功能特性 完整的 MVC架構(gòu),代碼 結(jié)構(gòu)清晰,易于維護,支持 API 和 Web界面 支持視頻文案 AI自動生成,也可以自定義文案 支持多種 高清

    2024年04月17日
    瀏覽(28)
  • 12吋全自動劃片機有哪些功能?

    12吋全自動劃片機有哪些功能?

    1、大面積工作盤:可容納多個工件,并自動對位。 2、軸光/環(huán)光:采用合適的光源照射,顯示影像更能呈現(xiàn)工作物表面特征。 3、雙倍率顯微鏡頭:視野更大,精準快速進行對準校正工作。 4、非接觸測高:消除刀具因測高而損傷的可能性,實時補償下刀高度誤差,提升切削

    2024年02月07日
    瀏覽(24)
  • 新版百度答題手機腳本,半自動腳本(全自動輔助搶題,手動答題)

    標題:《探秘半自動百度答題手機腳本:提升答題效率的輔助利器》 篇文: 引言: 在現(xiàn)代社會,知識獲取和學(xué)習(xí)已成為人們追求進步和提高自我的重要途徑。而移動互聯(lián)網(wǎng)時代的到來,使得移動答題應(yīng)用如百度答題成為了廣大用戶在碎片化時間中獲取知識的首選方式。本文

    2024年01月19日
    瀏覽(67)
  • CASAIM與大疆達成全自動化測量技術(shù)合作,CASAIM IS全自動化藍光測量儀實現(xiàn)無人機葉片全尺寸檢測及質(zhì)量控制

    CASAIM與大疆達成全自動化測量技術(shù)合作,CASAIM IS全自動化藍光測量儀實現(xiàn)無人機葉片全尺寸檢測及質(zhì)量控制

    近期,CASAIM與大疆達成全自動化測量技術(shù)合作,CASAIM IS全自動化藍光測量儀實現(xiàn)無人機葉片全尺寸檢測及質(zhì)量控制。 無人機行業(yè)在過去幾年里取得了迅猛發(fā)展, 大疆是全球領(lǐng)先的無人飛行器控制系統(tǒng)及無人機解決方案的研發(fā)商和生產(chǎn)商, 客戶遍布全球100多個國家。隨著技術(shù)

    2024年02月16日
    瀏覽(22)
  • 自定義WEB框架結(jié)合Jenkins實現(xiàn)全自動測試

    自定義WEB框架結(jié)合Jenkins實現(xiàn)全自動測試

    1.allure–純命令運行 -固定的–稍微記住對應(yīng)的單詞即可。 2 安裝,2個步驟: 1.下載allure包,然后配置環(huán)境變量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在你的終端去安裝一個插件 pip install allure-pytest 具體的命令 第一步:生成對應(yīng)的allure的數(shù)據(jù) pytest.main([“-vs”,“

    2024年02月12日
    瀏覽(25)
  • Jmeter +Maven+jenkins 接口性能全自動化測試

    Jmeter +Maven+jenkins 接口性能全自動化測試

    背景: 首先用jmeter錄制或者書寫性能測試的腳本,用maven添加相關(guān)依賴,把性能測試的代碼提交到github,在jenkins配置git下載性能測試的代碼,配置運行腳本和測試報告,配置運行失敗自動發(fā)郵件通知,這樣一來性能測試的job配置完成。接著,把性能測試的job配置成開發(fā)job的下

    2024年02月06日
    瀏覽(25)
  • Python爬蟲使用selenium爬取qq群的成員信息(全自動實現(xiàn)自動登陸)(1)

    Python爬蟲使用selenium爬取qq群的成員信息(全自動實現(xiàn)自動登陸)(1)

    browser.find_element_by_xpath(‘.//ul[@id=“headerNav”]/li[4]’).click() 8.點擊群管理之后,進入群管理界面,我們需要的是成員管理 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, ‘color-tit’) ) ) browser.find_element_by_class_name(‘color-tit’).click() 9.點擊成員管理之后會重新

    2024年04月28日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包