libftdi1学习笔记 1 - 打开/关闭设备

目录

1. 获取版本信息

2. 创建上下文对象

3. 查找FTDI设备

4. 获取字符串描述符

5. 指定接口

6. 打开设备

6.1 指定VID/PID的方式

6.2 指定描述符的方式

6.3 指定描述符和设备索引的方式

6.4 其他方式

7. 关闭设备


libftdi1是一个升级版本的库(旧的版本是libftdi),用于与FTDI芯片进行通信。在Ubuntu系统中可以先安装好ibftdi1库。

sudo apt-get install libftdi1-dev

其他系统可以下载源代码编译安装。

下载一个通用makefile。

####################################################
# Generic makefile - 万能Makefile
# for compiling and linking C++ projects on Linux 
# Author: George Foot  Modified:Jackie Lee
####################################################
### Customising
#
# Adjust the following if necessary; EXECUTABLE is the target
# executable's filename, and LIBS is a list of libraries to link in
# (e.g. alleg, stdcx, iostr, etc). You can override these on make's
# command line of course, if you prefer to do it that way.
#
#
# 可执行文件名
EXECUTABLE := 
# 静态库目录
LIBDIR:=                                    
# 静态库 文 件 名
LIBS := 
# 头文件目录
INCLUDES:=
# 除了当前目录外,其他的源代码文件目录
SRCDIR:=
#
# # Now alter any implicit rules' variables if you like, e.g.:CC:=gcc
CPP:=g++
CFLAGS := -g -Wall -O3
CPPFLAGS := $(CFLAGS)
CPPFLAGS += $(addprefix -I,$(INCLUDES))
CPPFLAGS += -MMD
#
# # The next bit checks to see whether rm is in your djgpp bin
# # directory; if not it uses del instead, but this can cause (harmless)
# # `File not found' error messages. If you are not using DOS at all,
# # set the variable to something which will unquestioningly remove
# # files.
#RM-F := rm -f # # You shouldn't need to change anything below this point.
#
SRCS_CPP = $(wildcard *.cpp) $(wildcard $(addsuffix /*.cpp, $(SRCDIR)))
SRCS_C := $(wildcard *.c) $(wildcard $(addsuffix /*.c, $(SRCDIR))) 
OBJS_C := $(patsubst %.c,%.o,$(SRCS_C))
OBJS_CPP := $(patsubst %.cpp,%.o,$(SRCS_CPP))
DEPS := $(patsubst %.o,%.d,$(OBJS_C)) $(patsubst %.o,%.d,$(OBJS_CPP))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.cpp,$(MISSING_DEPS))).PHONY : all deps objs clean veryclean rebuild infoall: $(EXECUTABLE)deps : $(DEPS)clean :@$(RM-F) *.o@$(RM-F) *.d
veryclean: clean@$(RM-F) $(EXECUTABLE)rebuild: veryclean all
ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :@$(RM-F) $(patsubst %.d,%.o,$@)
endif
-include $(DEPS)
$(EXECUTABLE) : $(OBJS_CPP) $(OBJS_C)$(CC) -o $(EXECUTABLE) $(OBJS_CPP) $(OBJS_C) $(addprefix -L,$(LIBDIR)) $(addprefix -l,$(LIBS)) -lstdc++
info:@echo $(SRCS_CPP)@echo $(SRCS_C)@echo $(OBJS_CPP)@echo $(OBJS_C)@echo $(DEPS)@echo $(MISSING_DEPS)@echo $(MISSING_DEPS_SOURCES)

新建一个libftdi1-example的文件夹,然后在该文件夹内创建上面的makefile和main.c。编辑makefile文件:

EXECUTABLE := libftdi1-example
# 静态库目录
LIBDIR:= /usr/lib/x86_64-linux-gnu/
# 静态库 文 件 名
LIBS := ftdi1

下载libftdi1的源代码,找到ftdi.h文件,拷贝到当前文件夹。编辑main.c

#include <stdio.h>
#include <stdlib.h>
#include "ftdi.h"int main(void)
{return -1;
}

运行make编译,此时应该可以编译通过。

libftdi-example$ make
gcc -o libftdi1-example  main.o -L/usr/lib/x86_64-linux-gnu/ -lftdi1 -lstdc++

1. 获取版本信息

 可以通过函数ftdi_get_library_version获取库的版本信息。

struct ftdi_version_info version;
version = ftdi_get_library_version();
fprintf(stdout, "version:%d.%d.%d, %s\n", version.major, version.minor, version.micro, version.version_str);

运行结果:

libftdi-example$ ./libftdi1-example 
version:1.5.0, 1.5

2. 创建上下文对象

在使用libftdi1的API函数前,需要先创建一个FTDI的上下文对象。

struct ftdi_context *ftdi_new(void)

使用结束后需要通过ftdi_free释放该对象。 

void ftdi_free(struct ftdi_context *ftdi)

参考例程:

struct ftdi_context *ftdi;
if ((ftdi = ftdi_new()) == 0)
{fprintf(stderr, "ftdi_new failed\n");return EXIT_FAILURE;
}ftdi_free(ftdi);

3. 查找FTDI设备

查找USB总线上指定VID:PID的所有ftdi设备。注意,使用后需要由ftdi_list_free()释放。

int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)

参数说明:

  • ftdi - 上下文对象,即ftdi_new的返回值。
  • devlist - 保存找到的设备列表
  • vendor, product - 指定设备的VID和PID,如果为0则表示查找所有的FTDI设备。

返回值表示找到的设备数。

参考例程:

struct ftdi_device_list *devlist;
int devnum = 0;
if ((devnum = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0)
{fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ftdi_get_error_string(ftdi));ftdi_free(ftdi);return EXIT_FAILURE;
}ftdi_list_free(&devlist);

4. 获取字符串描述符

获取设备的制造商、产品描述和序列号。

int ftdi_usb_get_strings(struct ftdi_context *ftdi,struct libusb_device *dev,char *manufacturer, int mnf_len,char *description, int desc_len,char *serial, int serial_len)
  • ftdi - 上下文对象,即ftdi_new的返回值。
  • dev - USB设备对象
  • manufacturer/mnf_len - 制造商字符串缓存及长度
  • description/desc_len - 产品字符串缓存及长度
  • serial/serial_len - 序列号缓存及长度

注意,这个函数必须放在ftdi_usb_find_all后执行,因为使用后关闭了内部“usb_dev”。

如果manufacturer、description和serial设置为NULL则表示不读取该字符串。

参考例程:

    struct ftdi_device_list *curdev;char manufacturer[128], description[128], serial[128];int i;printf("Number of FTDI devices found: %d\n", devnum);curdev = devlist;for(i = 0; i < devnum; i++){if (ftdi_usb_get_strings(ftdi, curdev->dev, manufacturer, 128, description, 128, serial, 128) < 0){fprintf(stderr, "ftdi_usb_get_strings failed: (%s)\n", ftdi_get_error_string(ftdi));ftdi_list_free(&devlist);ftdi_free(ftdi);return EXIT_FAILURE;}printf("Manufacturer: %s, Description: %s, Serial: %s\n\n", manufacturer, description, serial);curdev = curdev->next;}

注意,运行这个例程时需要管理员权限(sudo ./libftd1i-example),否则会报

ftdi_usb_get_strings failed: (libusb_open() failed)

运行结果:

libftdi-example$ sudo ./libftdi1-example 
version:1.5.0, 1.5
Number of FTDI devices found: 1
Manufacturer: FTDI, Description: FT4232H MiniModule, Serial: FT8NZV77

5. 指定接口

对于多接口的设备(例如FT2232H/FT4232H),可以指定不同的接口(例如FT2232H支持2路接口,而FT4232H支持4路)。

int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)

参数说明:

  • ftdi - 上下文对象,即ftdi_new的返回值。
  • interface - 指定的接口。INTERFACE_ANY表示第一个
enum ftdi_interface
{INTERFACE_ANY = 0,INTERFACE_A   = 1,INTERFACE_B   = 2,INTERFACE_C   = 3,INTERFACE_D   = 4
};

返回值说明:

  • 0 - 指定成功
  • -1 - 指定的接口不支持
  • -2 - 无效的USB设备
  • -3 - 设备已经打开,不能再指定接口

参考例程:

ftdi_set_interface(ftdi, INTERFACE_A);

6. 打开设备

6.1 指定VID/PID的方式

int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)

该函数实际上是调用ftdi_usb_open_desc,其中字符串描述符参数部分为NULL

6.2 指定描述符的方式

int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,const char* description, const char* serial)

该函数实际上是调用ftdi_usb_open_desc_index,其中设备索引参数部分为0

6.3 指定描述符和设备索引的方式

int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,const char* description, const char* serial, unsigned int index)

参数说明:

  • 其他略
  • index - 设备索引值,一般为0,当有多个相同设备(PID、VID、描述符都相同)时才有意义。

注意参数vendor和product必须指定,不能设置为0。

返回值说明:

  • 0 - 打开设备成功
  • -1 - 调用底层usb_find_busses()失败
  • -2 - 调用底层usb_find_devices()失败
  • -3 - 没找到对应设备
  • -4 - 打开设备失败
  • -5 - 无法声明设备
  • -6 - 复位失败
  • -7 - 设置波特率失败
  • -8 - 获取产品描述符失败
  • -9 - 获取序列号失败
  • -10 - 无法关闭设备
  • -11 - ftdi上下文对象无效
  • -12 - 调用底层libusb_get_device_list()失败

参考例程:

    int ret;ret = ftdi_usb_open_desc_index(ftdi, 0x0403, 0x6011, NULL, NULL, 0);if(ret < 0){printf("Open device Fail: %d\n", ret);ftdi_list_free(&devlist);ftdi_free(ftdi);return EXIT_FAILURE;}printf("Open device OK: %d\n", ret);ftdi_usb_close(ftdi);

运行结果:

libftdi-example$ sudo ./libftdi1-example 
version:1.5.0, 1.5
Number of FTDI devices found: 1
Manufacturer: FTDI, Description: FT4232H MiniModule, Serial: FT8NZV77Open device OK: 0

6.4 其他方式

略过,包括ftdi_usb_open_bus_addr、ftdi_usb_open_string、ftdi_usb_open_dev

7. 关闭设备

int ftdi_usb_close(struct ftdi_context *ftdi)

在ftdi_free前要关闭设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/813326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s 命令行工具

文章目录 K8s 命令行工具kubectl 工具在任意节点使用kubectl方式创建对象命令显示和查找资源更新资源修补资源编辑资源Scale 资源删除资源查看pod信息节点相关操作 K8s 命令行工具 在搭建集群的时候&#xff0c;我们通过yum 下载了kubeadm kubelet kubectl 三个命令行工具&…

华为云配置安全组策略开放端口

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

这家动画公司,女神表情灵动秒杀90%的国漫女角色!

当3D国漫市场逐渐加入“内卷”的行列&#xff0c;从大的底层创作引擎UE的运用迭代&#xff0c;到细节的人物动捕、面捕技术的实际结合&#xff0c;在这场内卷的百舸争流中&#xff0c;涌现出一家家风格各异的头部国漫制作公司&#xff1a;有整体偏写实风格的原力动画&#xff0…

乌龟棋(c++实现)

题目 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘只有一行&#xff0c;该行有 N个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。 棋盘第 1 格是唯一的起点&#xff0c;第 N 格是终点&#xff0c;游戏要求玩家控制一个…

多媒体互动装置如何助力智慧城市展厅的信息化建设?

随着现代化科技技术的发展&#xff0c;智慧城市的建设概念与实施也日益成熟&#xff0c;其中智慧城市展厅便是用于展示智慧城市理念、技术和规划的重要平台&#xff0c;而应用在其中的多媒体互动装置&#xff0c;更是起着重要的作用&#xff0c;它们能够让观众更直观地了解和体…

天空盒1-天空盒的实现原理

天空盒是一种常用的实时渲染技术&#xff0c;用于在三维场景中模拟远处环境&#xff0c;例如天空、山脉或城市等。它通过将一个立方体贴图&#xff08;也称为环境贴图&#xff09;投影到场景的背景中&#xff0c;给人一种无限远的感觉。以下是天空盒的实现原理&#xff1a; 创建…

对策略设计模式的一个小扩展

在基于产品的二次开发过程中&#xff0c;有时需要对产品项目中预制的某一个策略实现作些修改。但又不想修改策略的路由信息。以免调用方需要更新参数或修改代码等。基于此&#xff0c;对产品的策略接口作了一个小扩展&#xff0c;加上了一个可替换相同策略的boolean函数。效果还…

统一登陆实现简化流程

比如,前端使用vue,后端使用abp框架 则首先需要一个统一的中央认证服务,来给每个后端服务通信以验证用户凭据,并返回访问令牌, 中央认证服务保存各自后端的令牌,后端服务使用JWT或其他机制验证令牌的有效性。 1、前端登录请求中央认证服务,返回认证服务自己的令牌 2、…

AI识别技术详解 --在windows环境中部署基于YOLO v8模型的目标检测

首先 YOLO是一个端到端的目标检测算法&#xff0c;一次前向传播计算&#xff0c;实现图像的多目标检测任务&#xff0c;我么可以在ultralytics官网上查看YOLO的各个版本&#xff08;v1-v8&#xff09;以及源码 使用YOLO v8提供的python接口&#xff0c;训练一个佩戴安全帽的目标…

解释Python中的并发和并行编程

解释Python中的并发和并行编程 在Python编程中&#xff0c;并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是两个经常被提及的概念&#xff0c;它们都与程序的执行方式有关&#xff0c;但各自有着不同的含义和应用场景。下面我们将详细解…

无人机空气动力学

在现代科技的飞速发展中&#xff0c;无人机已经成为了备受关注的热门话题。它们能够在天空中自由翱翔&#xff0c;执行各种复杂的任务&#xff0c;这一切都离不开空气动力学的奇妙原理。本文将深入剖析无人机的空气动力学&#xff0c;带您领略无人机在空中飞行的神秘世界。 引…

关于Unity使用DLL的说法

最近在研究一些构建依赖相关的&#xff0c;特别是Unity在不同平台上使用第三方类库时候的问题。简单查了一下资料&#xff0c;其实不难理解&#xff0c;这里只是简单的记录一下&#xff0c;弄明白一个简单的道理就行了。 为什么有的第三方库(DoTween),NewtonSoft等的dll库&…

数组算法——查询位置

需求 思路 使用二分查找找到第一个值&#xff0c;以第一个值作为界限&#xff0c;分为左右两个区间在左右两个区间分别使用二分查找找左边的7,&#xff1a;找到中间位置的7之后&#xff0c;将中间位置的7作为结束位置&#xff0c;依次循环查找&#xff0c;知道start>end,返回…

c++运算符重载详细笔记,有关重载的最常用的用法

在类中重新定义运算符&#xff0c;赋予它新的 只能在类中使用的类运算&#xff0c;称之为运算符重载。 c加入了运算符重载&#xff1a;而实际上我们在不知不觉的情况下就已经在使用运算符重载了。就比如我们经常使用的string类&#xff0c;c在string内部进行了运算符重载&…

uniapp小程序中使用video视频播放卡顿

问题:在使用uniapp小程序的video视频播放,视频已经在播放了,但是进度条没走,还是卡顿的状态(测试ios能正常使用,安卓手机会出现此问题) 在网上找了很多方法,最多的说是用:custom-cache"false",试了并没有效果,看来和我问题不一样,后来用了个简单粗暴的方法,发现是有效…

超标量处理器设计:两位饱和计数器基于局部历史的分支预测

★ 继续学习体系结构的知识。 1. 什么是分支预测 程序中有一种叫做分支指令的指令&#xff0c;如果在取指令阶段就可以预知本周期所取指令中是否存在分支指令&#xff0c;并且知道其方向&#xff08;跳转/不跳转&#xff09;以及目标地址&#xff0c;就可以从在下个周期从分支…

一文读懂Java中的WebEndpointProperties类(附Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 对于Java的相关知识&#xff0c;推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; 1. 基本知识 Spring Boot 的配置类 WebEndpointProperties&#xff0c;用于配置 Web 端…

为什么市面上的数藏都长得很像?

为什么市面上的数藏都长得很像 一、NFT数藏的市场前景和概念二、目前市面上的数藏类型&#xff08;九类&#xff09;1. 头像类&#xff08;PFP&#xff09;2. 游戏类3. 艺术品/文物类4. 音乐类5. 影视类6. 演出类7. 门票类8. 体育类9. 品牌实物联名 三、各大数藏的相同点&#…

(弟)递归•斐波那契数、n的k次方

这里是目录哦 题目一&#xff1a;递归计算斐波那契数斐波那契数的定义代码运行截图递归过程递归停止条件&#xff08;1个参数&#xff09;✨非递归实现方法 题目二&#xff1a;递归实现n的k次方代码运行截图递归过程递归停止条件&#xff08;不止1个参数&#xff09;✨ 加油&am…

Java 中文官方教程 2022 版(四十九)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html JAXB 示例 原文&#xff1a;docs.oracle.com/javase/tutorial/jaxb/intro/examples.html 以下部分描述如何使用包含在 JAXB RI 捆绑包中的示例应用程序。JAXB RI 捆绑包可从jaxb.java.net获取。下载并安装…