Python 学习笔记四---event的使用

本文介绍如何利用Python中的Event对象进行线程间通信,包括设置信号、清除信号和等待操作,并通过示例代码展示如何优雅地让工作线程退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号被其他线程设置成真。这一点似乎和windows的event正好相反。 Event对象实现了简单的线程通信机制,它提供了设置信号,清除信号,等待等用于实现线程间的通信。

1.设置信号

使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态,当使用event对象的set()方法后,isSet()方法返回真.


2.清除信号


使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设为假,当使用Event的clear方法后,isSet()方法返回假


3.等待


Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时,则wait方法一直等待到其为真时才返回。
可以使用Event让工作线程优雅地退出,示例代码如下:

# make thread exit nicely
class MyThread9(threading.Thread):
	def __init__(self):
		threading.Thread.__init__(self)
	
	def run(self):
		global event
		while True:
			if event.isSet():
				logging.warning(self.getName() + " is Running")
				time.sleep(2)
			else:
				logging.warning(self.getName() + " stopped")
				break;

event = threading.Event()
event.set()

def Test9():
	t1=[]
	for i in range(6):
		t1.append(MyThread9())
	for i in t1:
		i.start()
	time.sleep(10)
	q =raw_input("Please input exit:")
	if q=="q":
		event.clear()
if __name__=='__main__':
	Test9()

<think>我们正在讨论STM32F4上的USB自定义HID设备通信。根据引用内容,我们可以构建一个学习笔记,包括配置步骤、代码修改和测试方法。注意:引用[1]提到新建工程项目常规配置、USB时钟配置等;引用[2]提供了USB库中自定义HID类的结构体;引用[3]基于CubeMX的步骤和测试;引用[4]提供了官方库的链接(但链接可能已失效,我们主要参考方法)。我们将按照以下步骤进行:1.硬件准备:STM32F4开发板,需支持USB(如USBFS或HS)。2.软件准备:STM32CubeMX、KeilMDK(或其他IDE)、USBHID生成工具(可选,用于生成报告描述符)。3.配置步骤:使用STM32CubeMX配置USB为HID设备模式。4.代码修改:根据自定义HID的需求修改报告描述符和数据处理函数。5.编译下载:将代码编译并烧录到开发板。6.测试:在电脑上查看设备管理器,并使用工具进行通信测试。详细步骤:一、CubeMX配置1.新建工程,选择对应型号。2.配置时钟:确保USB时钟正确(例如,全速USB需要48MHz时钟,通常由PLL提供)。3.配置USB:在Connectivity中激活USB_OTG_FS(或HS)模式,选择“DeviceOnly”,并在中间件中选择“HID”。4.配置GPIO:检查USB相关引脚(如DM、DP)是否自动配置。5.生成工程:选择IDE,生成代码。二、代码修改(以自定义HID为例)1.报告描述符(ReportDescriptor):定义HID设备的数据格式。可以在`usbd_customhid.c`中修改。例如,定义一个64字节输入和64字节输出的报告描述符:```c__ALIGN_BEGINstaticuint8_tCUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE]__ALIGN_END={0x06,0x00,0xFF,//UsagePage(VendorDefined0xFF00)0x09,0x01,//Usage(0x01)0xA1,0x01,//Collection(Application)//输入报告(设备到主机)64字节0x09,0x02,//Usage(0x02)0x15,0x00,//LogicalMinimum(0)0x26,0xFF,0x00,//LogicalMaximum(255)0x75,0x08,//ReportSize(8)0x95,0x40,//ReportCount(64)0x81,0x02,//Input(Data,Var,Abs)//输出报告(主机到设备)64字节0x09,0x03,//Usage(0x03)0x15,0x00,//LogicalMinimum(0)0x26,0xFF,0x00,//LogicalMaximum(255)0x75,0x08,//ReportSize(8)0x95,0x40,//ReportCount(64)0x91,0x02,//Output(Data,Var,Abs)0xC0//EndCollection};```2.修改设备描述符:在`usbd_customhid.c`中,修改PID和VID(可选,默认有ST的VID,PID可以自定义)。3.处理数据收发:在`usbd_customhid.c`中,找到数据输入和输出的回调函数。例如:-`staticint8_tCUSTOM_HID_OutEvent_FS(uint8_tevent_idx,uint8_tstate)`:处理从主机接收的数据(输出报告)。-发送数据使用`USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,report_data,report_size)`。三、测试1.连接USB到电脑,设备管理器应出现HID设备(可查看VID/PID)。2.使用HID通信测试工具(如BusHound、HIDAPI测试程序等)进行数据收发测试。注意:引用[3]中提到了修改后查看设备管理器,引用[4]提到修改收发64字节(即报告描述符中定义64字节)。以上是一个简要的教程笔记。下面生成相关问题。</think>### STM32F4 USB Custom HID 实现教程 #### 一、开发环境配置 1. **硬件要求** - STM32F4系列开发板(如STM32F407VG) - USB Type-A转Micro-B数据线 - 支持USB Device模式的USB接口(如OTG_FS) 2. **软件工具** - STM32CubeMX(配置引脚和时钟) - Keil MDK-ARM或STM32CubeIDE - USB HID描述符生成工具(如[USB-IF HID Descriptor Tool](https://www.usb.org/hid)) #### 二、CubeMX工程配置 1. **时钟配置** - 启用外部高速晶振(HSE) - 配置PLLCLK为168MHz,**确保USB时钟=48MHz**(关键!) - 公式:$f_{USB} = \frac{PLLCLK}{Q}$,Q分频值设为3.5或7[^1] 2. **USB中间件配置** ```plaintext Connectivity → USB_OTG_FS → Mode: Device_Only Middleware → USB_DEVICE → Class: Custom Human Interface Device (HID) ``` 3. **报告描述符设置** 在`USBD_CUSTOM_HID`配置中定义报告描述符: ```c /* 示例:64字节输入/输出报告 */ __ALIGN_BEGIN static uint8_t HID_ReportDesc[52] __ALIGN_END = { 0x06, 0x00, 0xFF, // USAGE_PAGE (Vendor Defined) 0x09, 0x01, // USAGE (Vendor 1) 0xA1, 0x01, // COLLECTION (Application) 0x09, 0x02, // USAGE (Vendor 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x40, // REPORT_COUNT (64) → 64字节 0x81, 0x02, // INPUT (Data,Var,Abs) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xC0 // END_COLLECTION }; ``` #### 三、关键代码实现 1. **USB初始化流程** ```c MX_USB_DEVICE_Init(); // CubeMX生成的初始化函数 ``` 2. **数据发送函数** ```c uint8_t report[64] = {0}; USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, 64); ``` 3. **数据接收回调** 在`usbd_customhid.c`中修改接收处理: ```c static int8_t CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state) { USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData; /* 接收主机发送的数据 */ uint8_t* rx_buf = hhid->Report_buf; // 处理rx_buf中的数据... return USBD_OK; } ``` #### 、设备枚举验证 1. **Windows设备管理器检查** - 连接USB后应显示 **"HID-compliant device"** - VID/PID匹配代码设置(默认VID=0x0483,PID=0x5750)[^3] 2. **报告描述符解析工具** 使用[USBTreeView](https://www.uwe-sieber.de/usbtreeview_e.html)验证描述符: ```plaintext HID Descriptor: Report Descriptor Length: 52 Report ID 1: Input=64 bytes, Output=64 bytes ``` #### 五、通信测试方法 1. **PC端Python测试脚本** ```python import hid device = hid.device() device.open(0x0483, 0x5750) # STM32默认PID/VID # 发送64字节数据 device.write([0]*64) # 接收数据 data = device.read(64) ``` --- ### 常见问题解决 1. **枚举失败** - 检查VBUS引脚是否连接(PA9) - 验证USB时钟精确为48MHz(±0.25%误差) - 使用USB分析仪抓取描述符请求[^4] 2. **数据传输错误** ```c /* 在usbd_conf.c中增加堆栈大小 */ #define USB_RX_FIFO_SIZE 0x200 // 推荐512字节 ``` 3. **报告描述符更新后无效** - 需调用`USBD_CUSTOM_HID_SendReport()`强制重新枚举 - 或重启PC端USB主机控制器 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值