前言假如有一个视频文件 video.mp4,需要在 Python 里面调用外部程序打开,你可能会直接使用 os.startfile() 方法,传入文件的路径,就能调用外部的播放器打开这个文件了,但是如果需要对播放器指定参数呢?这种方法就不适用了。好在有一个 AssocQueryStringW 函数(参考文档),支持通过注册表查找关联的默认程序,这样就能直接获取到默认程序的路径,再加上自定义的参数就可以实现了,非常省事。代码import ctypes from ctypes import wintypes def query_association(file_ext): buffer = ctypes.create_unicode_buffer(512) pcchOut = wintypes.DWORD(512) result = ctypes.windll.shlwapi.AssocQueryStringW(0x00000000, 1, file_ext, None, buffer, ctypes.byref(pcchOut)) i
在 Python 中打开文件夹并选中该文件(不直接打开),有两种实现方式:方式一使用 os 模块,最简单。无论是否存在已经选中该文件的资源管理器窗口,每次执行都会新建一个。例如,打开文件夹并选中 D:\ 下的 111.pdf 文件:import os os.system(r"explorer /select,D:\111.pdf")但是有一个问题,容易被杀毒软件拦截,用户体验不佳;如果文件名包含特殊符号,就无法识别,默认就打开我的文档目录了。"安全大脑" "极智守护"方式二使用 SHOpenFolderAndSelectItems 函数(参考文档),与方式一不同的是,若存在已打开此位置的资源管理器窗口,则会切换到该窗口,并选中文件,反之则新建一个资源管理器窗口并选中。这种方式有一个好处,就是不会被杀毒软件拦截。这里使用 ctypes 实现,不需要再安装 pywin32 了。import os import ctypes class ITEMIDLIST(ctypes.Structure): _fields_ = [("mkid", ct
前言上一篇文章分析了美的空调 R05D 红外协议原理,接下来将通过 STM32 单片机编程实现空调控制。代码初始化 PWM将红外发射管接在 PA1 引脚上,使用 TIM2 时钟控制 PWM 波形,输出 38kHz 载波。通过分频和自动重装载值设定,得出 PWM 波形频率为 72MHz / 19(预分频)/ 101(计数次数)≈ 38kHz。void PWM_Init(void) { // 38kHz 初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPI
背景通常情况下红外遥控采用NEC协议传输数据,而美的空调采用 R05D 协议,因此一般的红外发射模块无法对空调进行控制。本文将对美的空调 R05D 协议展开分析,并通过 STM32 单片机进行红外遥控。R05D 红外协议原理1.编码格式编码格式为 L A A' B B' C C' S L A A' B B' C C'2.L S A B C 字母说明L 为引导码,S 为分隔码,A 为识别码 (一般为 10110010 = 0xB2,预留方案 10110111 = 0xB7),A' 为 A 的反码,B' 为 B 的反码,C' 为 C 的反码3.帧第一帧和第二帧相同,二者之间有一个分隔码 S4.长度A B C 长度均为 8 位,故一帧长度为 48 位(不包含 L S)5.发送顺序高位先发,即 MSB 在先,LSB 在后6.B、C 含义如下表所示:BB7 B6 B5B4 B3 B2 B1 B0风速1 1 1 1 1CC7 C6
背景最近在研究红外收发,0/1信号延迟需要达到微秒级,而 time.sleep() 达不到这么高的精度,好在 time.time() 时间戳可以实现微秒级别,故采用此方式。代码原理非常简单,只是做个记录。def delay_us(t): start, end = 0, 0 start = time.time() offset = 10 t = (t - offset) / 1000000 while end - start < t: end = time.time()说明: offset 为修正值,根据实际情况修改。验证以延迟 30us 为例:注意事项仅 Linux 有效,Windows 下延迟最低 1000us,无法正常使用。
Scott Sloan