boringhex.top博客

非典型程序员的小破站

引言

无线通信模块广泛应用于无线传感网络、智能家居系统、工业自动化等领域。应用中无线通信模块的通信距离是一个关键问题,即信号能够有效传输的最远距离。了解和掌握影响无线通信模块通信距离的因素,对于设计和优化无线通信系统至关重要。

影响无线模块通信距离的主要因素有:

  • 发射功率
  • 接收灵敏度
  • 频率和带宽
  • 天线设计和放置
  • 障碍物和环境
阅读全文 »

1999年以后的nhanes数据都是以xpt文件格式发布的,而更早的数据有很多是以dat原始数据格式发布,需要将原始数据转为数据表以做进一步统计分析。

NHANES III 为例,其中有一个数据Household Youth File,包含3个数据文件youth.dat, youth.sas, YOUTH-acc.pdfYOUTH-acc.pdf是这个数据的概述报告,可以从这个文件找到数据的概况信息,比如样本数量,以及一些代码的含义,比如DMARACER这个变量标识种族,在原始数据中的位置是13,只有1个字符,就是用代码来表示不同种族的:1表示’White’, 2表示’Black’, 3表示’Other’, 8表示’Mexican-American of unknown race’。youth.sas是数据解析的重点,这个文件描述了原始数据的格式,这是一个文本文件,内容为:

阅读全文 »

之前的文章 将静态库封装成 python 模块 中讲解了如何将静态库封装成python模块,静态库封装相对来说还是有点复杂,今天来介绍下动态库封装成python模块的方法。

主要方法

将动态库封装成Python的主要方法有以下几种:

  1. 使用ctypes库:ctypes是Python标准库中用于调用动态库的工具库。它提供了一组用于描述C数据类型和调用C函数的功能。你可以使用ctypes库来加载动态库并调用其中的函数、访问结构体等。通过定义C函数的原型和C结构体的映射,可以方便地与动态库进行交互。

  2. 使用Cython:Cython是一个Python的扩展语法,允许你编写使用C语言语法的Python扩展模块。通过使用Cython,你可以将动态库中的函数包装为Python的可调用函数,并且可以直接在Python代码中使用这些函数,而无需编写额外的C代码。

  3. 使用SWIG:SWIG(Simplified Wrapper and Interface Generator)是一个自动化工具,用于生成连接C/C++和其他高级语言的接口代码。它可以根据给定的接口描述文件自动生成Python的封装代码。SWIG支持多种语言,包括Python和C/C++,使得将动态库封装成Python模块变得更加简单和高效。

哈哈,其实跟封装静态库差不多,用Cython或SWIG,既能封装静态库,也能封装动态库,但我们今天主要用ctypes,简便、主流。

阅读全文 »

在之前的文章 ESP32 VS Code 开发环境”hello world” 中,我们在vs code中完成了esp32 “hello world”程序的开发。乐鑫将很多操作集成到了vs code插件中,在gui中以按钮的形式与用户进行交互。而在这些按钮的背后,则是idf.py

idf.py

idf.py是一个用python编写的命令行工具,在ESP-IDF中,它提供了一个前端界面,管理工程构建、工程部署及工程调试等操作,我们之前提到的CMake、Ninja等工具也是由它来整合在一起的:

  • CMake 用于配置要构建的工程
  • Ninja 用于构建工程
  • esptool.py 用于烧录目标芯片

注意:idf.py应在ESP-IDF工程目录下运行,即包含顶层CMakeLists.txt文件的目录。

阅读全文 »

很多硬件厂商的底层设备驱动都是以库的形式提供给开发者,有的是动态库,有的是静态库。开发上层应用,最快速便捷的方式当然还是用python,对于动态库,可以用python的ctypes库进行加载,而对于静态库,则要麻烦一些,今天折腾了很长时间,总算跑通了最简流程。

主要方法

静态库(LIB)是在编译链接阶段被静态地链接到程序中的,因此无法直接在 Python 中调用。Python 只能直接调用动态链接库(DLL)。

如果想在 Python 中使用静态库的功能,主要有以下几种方法:

  1. 将静态库转换为动态库:可以通过使用相应的编译器(例如,Visual Studio 或 GCC)将静态库转换为动态库(DLL)。这样就可以直接在 Python 中调用动态库了。

  2. 使用 C/C++ 扩展模块:可以使用 Python 的 C/C++ 扩展机制,将静态库中的函数封装为 C/C++ 扩展模块,然后在 Python 中调用这些模块。通过这种方式,可以直接在 Python 中使用静态库的功能。

  3. 使用第三方工具:有些第三方工具可以帮助将静态库转换为 Python 可用的动态库或 C/C++ 扩展模块。例如,Cython 可以将 C/C++ 代码转换为 Python 可执行的代码;SWIG 可以生成用于 Python 的 C/C++ 接口代码。

需要注意的是,将静态库转换为动态库或者创建 C/C++ 扩展模块都需要一定的 C/C++ 编程经验。如果你不熟悉 C/C++,可以考虑使用其他方法解决问题,如寻找已经有 Python 绑定的动态库或者使用其他库或工具实现相同的功能。

阅读全文 »

前两天调试在Windows上的docker容器中连接usb设备,发现在Windows上可以找到设备,但是在容器中找不到设备,怀疑是系统usb设备资源没有挂载到容器中。经搜索,确定wsl并不直接支持USB设备的连接,这就意味着我们必须寻找一个解决方案,而usbipd-win就是提供这个解决方案的工具。它支持在Windows计算机上设置USB/IP项目,以支持一些常见的开发场景,比如刷写Arduino或访问智能卡读取器等。

usbipd-win

Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2.

在工作和开发中,我们经常需要将USB设备连接到不同的操作系统中,包括常用的Linux发行版。近期,Microsoft的一项开源项目——usbipd-win,打开了一条通向将USB设备连接到WSL 2 Linux发行版的大门。

阅读全文 »

CMake、Make和SCons都是流行的C语言构建系统,它们用于自动化项目构建过程。这些构建系统的主要目标是简化编译和链接源代码以创建可执行文件的过程。Ninja则是后起之秀,最初设计用于构建Chrome浏览器这个大型代码库,以其简单快速著称。

阅读全文 »

CMake是一个跨平台的构建系统,它可以根据简单的配置文件生成各种平台的构建工具(例如Makefile、Visual Studio项目文件等)。CMake使用CMakeLists.txt文件来描述项目的构建规则和依赖关系。在这个文件中,可以设置各种编译选项。

阅读全文 »

简介

平时经常有一种需求,就是我在调试树莓派的时候,经常要在pc电脑和开发板之间来回操作,因此就需要两套键盘和鼠标,但是我的桌子实在是太小了,两套键鼠不能并排放置,因此需要换来换取,再加上两套键盘手感不同。换起来着实烦气,因此就设计了这个键鼠切换工具。

实现键鼠pc之间的切换有好多种方法。包括软件来实现和硬件来实现,对于硬件来实现也有很多种方法,包括通过使用模拟开关来实现,和采用专业芯片来实现,对于使用模拟开关来实现,除了切换那一对差分信号线外,对上下电顺序也是有要求的,因此总会存在延时,而对于使用专门的芯片,延时将不复存在,就是成本略贵。

本设计基于CH9374B设计的KVM,CH9374B是一款4口USB KVM控制芯片,1套键鼠支持4套主机共享使用,即插即用,无需安装驱动程序。

功能特性

  • 工作电压:5V或3.3V。
  • 晶振频率:24MHz,支持内置晶振,最高主频48MHz。
  • 支持1.5Mbps低速和12Mbps全速USB传输,兼容USB V2.0。
  • 外围电路简单、元器件只需电源退耦电容。
  • 支持Win98/ME/2K/XP/2003/Vista/Win7/Linux/AppleMAC等操作系统。
  • 支持市面上常见品牌的USB键盘和USB鼠标。
  • 支持PS2键盘,预留蓝牙键盘、蓝牙鼠标通信接口。
  • 支持单键轮循切换、多键指定切换、键盘热键切换和鼠标热键切换。
  • 支持红外遥控切换。
  • 支持自动轮询切换模式,便于监控,切换时间间隔可热键设置。
  • 支持开启/关闭自动侦测模式,用于检测插拔自动智能切换。
  • 支持开启/关闭蜂鸣器提示音。
  • 支持开启/关闭全部热键。
  • 支持开启/关闭鼠标穿屏功能。
  • 支持LED指示,指示当前选中的PC。
  • 支持4组不同的键盘切换热键,且可任意切换及掉电保存。
  • 支持DC-DC升压功能。
  • 支持在线升级固件。
  • 提供LQFP-64无铅封装,兼容RoHS。
阅读全文 »

内置指令

CMake 内置了很多指令,下面列举了一些常用的指令:

  1. add_executable:指定生成可执行文件。
  2. add_library:指定生成库文件。
  3. add_subdirectory:添加子目录。
  4. aux_source_directory:自动收集目录下的源文件。
  5. cmake_minimum_required:指定所需的 CMake 最低版本。
  6. execute_process:在构建时执行外部程序。
  7. find_package:查找库文件和头文件。
  8. include_directories:指定头文件搜索路径。
  9. link_directories:指定库文件搜索路径。
  10. list:操作列表,例如添加、删除、查找、排序等。
  11. message:输出信息、警告、错误等消息。
  12. project:声明项目名称和使用的编程语言。
  13. set:设置变量的值。
  14. target_include_directories:为目标指定头文件搜索路径。
  15. target_link_libraries:为目标指定链接库。
  16. option:提供一个用户可以选择的选项。
  17. file:对文件进行操作,如读取、写入、删除等。
  18. install:指定项目安装时的目标文件和路径。
  19. string:操作字符串,例如转换为大写、小写、比较等。
  20. ifelseifelseendif:条件语句。
阅读全文 »
0%