基于Video4Linux 的USB摄像头图像采集实现

2023-05-16

 
J.W.Hu 的 基于Video4Linux 的USB摄像头图像采集实现
Linux本身自带了采用ov511芯片的摄像头,而市场上应用最广泛的是采用中
芯微公司生产的zc301芯片的摄像头,下面我将针对这两大系列的摄像头分别做
介绍。

       (注:所有的开发都是在华恒HHARM-2410-EDU上完成,ov511摄像头采
用的是网眼webeye3000,zc301摄像头采用的是ANC奥尼S888)。

       一 驱动加载

      1.1 ov511 驱动

      1.静态加载

     (1)在arm linux的kernel目录下make menuconfig。
     (2)首先(*)选择Multimedia device->下的Video for linux。加载video4linux模块,
为视频采集设备提供了编程接口;
     (3)然后在usb support->目录下(*)选择support for usb和usb camera ov511
support。这使得在内核中加入了对采用OV511接口芯片的USB数字摄像头的驱动
支持。
     (4)保存配置退出。
     (5)make dep;make zImage
此时在/tftpboot 下就生成了带有ov511 驱动的内核。

      2.动态加载
    (1)在arm linux的kernel目录下make menuconfig。
    (2)首先<*>选择Multimedia device->下的Video for linux。
    (3)然后在usb support->目录下<*>选择support for usb和<M>选择usb camera
ov511 support。
     (4)保存退出。
     (5)Make dep;make zImage;make modules然后就在/driver/usb下生成ov511.o,同
时生成的zImage自动放在/tftpboot下。
     (6)然后用新内核启动板子后insmod ov511.o就可以成功加载。

       动态方式与静态方式相比,测试时要简单的多。不需要下载整个内核,只需通过nfs,加载驱动即可测试。在测试成功后就可以编译进内核。
模块加载中出现的问题:

       1.insmod 和modprobe 间的一个区别试后者不会在当前目录中查找模块,它只在/lib/modules 下的缺省目录下查找,这是因为该程序只是一个系统实用例程,不是一个交互工具。可以通过在/etc/modules.conf 中指定自己的目录,来把它们加到缺省目录集中。
       2.如果插入模块ov511.o 时,出现以下信息:
Ov511.o:unresolved symbol video********之类的,说明还有其它模块videodev.o
没有加。
       3.出现错误:ov511.o:couldn’t find the kernel version this modules was compiled
for。这是试图插入一个不是可装入模块的目标文件。因为在内核配置阶段,是
把ov511 模块静态加到内核中的,虽然看起来和可装入模块的文件名ov511.o 完
全一样,但是不能用insmod 命令加入。
       4.如果出现Ov511.o:unresolved symbol video********,那就<M>选中video for
linux,用新生成的内核启动系统,再insmod videodev.o,insmod ov511.o 就可以啦。

       1.2 zc301 驱动

       摄像头的驱动是从http://mxhaard.free.fr/下的针对embeded环境,有专门的patch,我用的是usb-2.4.31LE06.patch。

       (1)把它放到/HHARM9-EDU/kernel/driver/usb下,解压,打补丁。就会在此目录下看到spca5xx文件夹了。可能会有一些错误,我的错误是在Makefile和config.in文件中,根据它的提示,进行相应的修改即可。Patch时会将修改方法写到 Makefile.rej和config.in.rej文件中,把这两个文件里的内容加到Makefile和config.in
中就行了。
       (2)编译内核,进入/HHARM9-EDU/kernel,make menuconfig。我采用和上面介绍的ov511驱动的方法一样,动态加载。(M)选中SPCA5XX这一项           ( 3 ) make dep ; make zImage ; make modules 。就会在
/HHARM9-EDU/kernel/driver/usb/spca5xx 中生成
spca5xx.o,spcadecoder.o,spca_core.o啦。这就是我们要的驱动。
       (4)用新内核启动,insmod这三个.o文件(可以不用加载spcadecoder.o),摄像头就加载成功啦。
      

       不过这种LE的驱动有许多问题,比如运行到设置图像格式(RGB565或RGB24)时出错, 说不支持此参数。原因在于: ( 摘自驱动程序主页
http://mxhaard.free.fr/spca5le.html)
       The spca5xx-LE design is very different from the spca5xx full package(LE版的驱动
和完全版的差很多)。
       The memory in use are the most smaller as possible(LE版的驱动会尽量减少内存的
使用)
       The spcadecoder is reduce and only raw jpeg webcam are used.(驱动模块只支持输
出原始jpeg格式)。
        还有一种方法, 从http://mxhaard.free.fr/download.html 下载最新的驱动
spca5xx -20060402.tar.gz。这个可独立编译,无需放到linux内核里面,编译生成一个spca5xx.o即可,不要三个.o做驱动了。因为这个驱动是针对2.6的,编译时会出现很多错误,修改CFLAGS即可。华恒的群里已经有编译好的驱动提供大家下载。

       模块加载中出现的问题:

       1.运行./servfox时出现Error Opening V4L interface.

       我测试一下,是没有加载驱动。虽然内核中(M)选中了驱动,但是启动后要手工加进去。insmod一下啦。

       2.insmod spcadecoder.o时,出现错误:spcadecoder.o:couldn’t find the kernel version this modules was compiled for。如果你insmod spca5xx.o成功的话就不需要再
insmod其他模块了。

       3.insmod video.o时却说can't find the kernel version the modules was compiled for。

      这是因为video for linux一般是直接编译到内核中去的.不需要加载的。

       二 Video4linux 编程

      2.1 Video4linux 简介

       Video4Linux是为市场现在常见的电视捕获卡和并口及USB口的摄像头提供
统一的编程接口。同时也提供无线电通信和文字电视广播解码和垂直消隐的数据接口。本文主要针对USB摄像头设备文件/dev/video0,进行视频图像采集方面的程序设计。

       2.2 Video4linux 编程指南

       1.视频编程的流程

       (1)打开视频设备:
       (2)读取设备信息
       (3)更改设备当前设置(可以不做)
       (4)进行视频采集,两种方法:

       a.内存映射
       b.直接从设备读取
       (5)对采集的视频进行处理
       (6)关闭视频设备。
       定义的数据结构及使用函数
struct _v4l_struct
{
int fd;
struct video_capability capability;
struct video_buffer buffer;
struct video_window window;
struct video_channel channel[8];
struct video_picture picture;
struct video_mmap mmap;
struct video_mbuf mbuf;
unsigned char *map;
};
typedef struct _v4l_struct v4l_device;
extern int v4l_open(char *, v4l_device *);
extern int v4l_close(v4l_device *);
extern int v4l_get_capability(v4l_device *);
extern int v4l_set_norm(v4l_device *, int);
extern int v4l_get_picture(v4l_device *);
extern int v4l_grab_init(v4l_device *, int, int);
extern int v4l_grab_frame(v4l_device *, int);
extern int v4l_grab_sync(v4l_device *);
extern int v4l_mmap_init(v4l_device *);
extern int v4l_get_mbuf(v4l_device *);
extern int v4l_get_picture(v4l_device *);
extern int v4l_grab_picture(v4l_device *, unsigned int);
extern int v4l_set_buffer(v4l_device *);
extern int v4l_get_buffer(v4l_device *);
extern int v4l_switch_channel(v4l_device *, int);

     3.Video4linux支持的数据结构及其用途

     (1)video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨
率、信号源信息等)
name[32] 设备名称
maxwidth
maxheight
minwidth
minheight
Channels 信号源个数
type 是否能capture , 彩色还是黑白, 是否能裁剪等等。值如
VID_TYPE_CAPTURE等

    (2)video_picture 设备采集的图象的各种属性
Brightness 0~65535
hue
colour
contrast
whiteness
depth 8 16 24 32
palette VIDEO_PALETTE_RGB24 | VIDEO_PALETTE_RGB565|
VIDEO_PALETTE_JPEG| VIDEO_PALETTE_RGB32

    (3)video_channel 关于各个信号源的属性
Channel 信号源的编号
name
tuners
Type VIDEO_TYPE_TV | IDEO_TYPE_CAMERA
Norm 制式 PAL|NSTC|SECAM|AUTO

     (4)video_window 包含关于capture area的信息
x x windows 中的坐标.
y y windows 中的坐标.
width The width of the image capture.
height The height of the image capture.
chromakey A host order RGB32 value for the chroma key.
flags Additional capture flags.
clips A list of clipping rectangles. (Set only)
clipcount The number of clipping rectangles. (Set only)
(5)video_mbuf 利用mmap进行映射的帧的信息
size 每帧大小
Frames 最多支持的帧数
Offsets 每帧相对基址的偏移
(6)video_mmap 用于mmap

     4.关键步骤介绍
【注】接多个摄像头。方法如下:买一个usb hub接到开发板的usb host上。cat
/proc/devices可以知道video capture device的major是81,再ls –l /dev看到video0
的次设备号是0。两个摄像头当然要两个设备号,所以mknod /dev/video1 c 81 1,
如果接4个,就mknod /dev/video2 c 81 2,mknod /dev/video3 c 81 3。依次类推。
(1)打开视频:
int v4l_open(char *dev, v4l_device *vd)
{
if (!dev)
dev = ”/dev/video0”;
if ((vd ->fd = open(dev, O_RDWR)) < 0) {
perror("v4l_open:");
return -1;
}
if (v4l_get_capability(vd))
return -1;
if (v4l_get_picture(vd))
retu rn -1;
return 0;
}
(2)读video_capability 中信息
int v4l_get_capability(v4l_device *vd)
{
if (ioctl(vd ->fd, VIDIOCGCAP, &(vd->capability)) < 0) {
perror("v4l_get_capability:");
return -1;
}
return 0;
}
成功后可读取vd->capability各分量

(3)读video_picture中信息
int v4l_get_picture(v4l_device *vd)
{
if (ioctl(vd ->fd, VIDIOCGPICT, &(vd->picture)) < 0) {
perror("v4l_get_picture:");
return -1;
}
return 0;
}
成功后可读取图像的属性
(4)改变video_picture中分量的值 (可以不做的)
先为分量赋新值,再调用VIDIOCSPICT
vd->picture.colour = 65535;
if(ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0)
{
perror("VIDIOCSPICT");
return -1;
}
(5)初始化channel (可以不做的)
必须先做得到vd->capability中的信息
int v4l_get_channels(v4l_device *vd)
{
int i;
for (i = 0; i < vd ->capability.channels; i++) {
vd ->channel[i].channel = i;
if (ioctl(vd ->fd, VIDIOCGCHAN, &(vd->channel[i])) < 0) {
perror("v4l_get_channel:");
return -1;
}
}
return 0;
}
(6)关闭设备
int v4l_close(v4l_device *vd)
{
close(vd ->fd);
return 0;
}
重点:截取图象的两种方法
一、用mmap(内存映射)方式截取视频
mmap( )系统调用使得进程之间通过映射同一个普通文件实现共享内存。普
通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访
问,不必再调用read(),write()等操作。两个不同进程A、B共享内存的意思是,
同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进
程B对共享内存中数据的更新,反之亦然。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写
内存,而不需要任何数据的拷贝
(1)设置picture的属性
(2) 初始化video_mbuf,以得到所映射的buffer的信息
ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))
(3)可以修改video_mmap和帧状态的当前设置
(4)将mmap与video_mbuf绑定
void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
len:映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始
算起
Prot:指定共享内存的访问权限 PROT_READ(可 读), PROT_WRITE (可写),
PROT_EXEC (可执行)
Flags:MAP_SHARED MAP_PRIVATE中必选一个,MAP_ FIXED不推荐使用
Addr:共内存享的起始地址,一般设0,表示由系统分配
Mmap( ) 返回值是系统实际分配的起始地址
int v4l_mmap_init(v4l_device *vd)
{
if (v4l_get_mbuf(vd) < 0)
return -1;
if ((vd ->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE,
MAP_SHARED, vd->fd, 0)) < 0) {
perror("v4 l_mmap_init:mmap");
return -1;
}
return 0;
}
(5)Mmap方式下真正做视频截取的 VIDIOCMCAPTURE

ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) ;
若调用成功,开始一帧的截取,是非阻塞的,
是否截取完毕留给VIDIOCSYNC来判断
(6)调用VIDIOCSYNC等待一帧截取结束
if(ioctl(vd->fd, VIDIOCSYNC, &frame) < 0)
{
perror("v4l_sync:VIDIOCSYNC");
return -1;
}
若成功,表明一帧截取已完成。可以开始做下一次 VIDIOCMCAPTURE
frame是当前截取的帧的序号。
********关于双缓冲************
video_bmuf bmuf.frames = 2;一帧被处理时可以采集另一帧
int frame; //当前采集的是哪一帧
int framestat[2]; //帧的状态 没开始采集|等待采集结束
帧的地址由vd->map + vd->mbuf.offsets[vd->frame]得到。
采集工作结束后调用munmap取消绑定
munmap(vd->map, vd->mbuf.size)
在实际应用时还可以采用缓冲队列等方式。
二、视频截取的第二种方法:直接读设备
关于缓冲大小,图象等的属性须由使用者事先设置
调用read();
int read (要访问的文件描述符;指向要读写的信息的指针;应该读写的字符数);
返回值为实际读写的字符数
int len ;
unsigned char
*vd->map=
(unsigned char *) malloc(vd◊capability.maxwidth*vd◊capability.maxheight );
len = read(vd◊fd,vd◊ vd->map,
vd◊capability.maxwidth*vd◊capability.maxheight*3 );

2.3 编程实例(mouse_capture)
不管是ov511还是zc301的摄像头,它们采集的方式都是相同的,只不过采集
到的数据有所差异,ov511的就是rgb的位流,而zc301是jpeg编码的位流。
mouse_capture是根据servfox改编的一个专门从zc301摄像头获取一张jpeg图片,
用来测试摄像头是否加载成功的小程序。这样就可以不用cat /dev/video0>1.jpg来
测试摄像头是否正常。cat命令一运行,就源源不断地采集jpeg流。但是采到的图片只能显示第一个jpeg头和jpeg尾之间的数据。mouse_capture仅仅获得一张完整的jpeg。 可以从
http://www.hhcn.com/cgi-bin/topic.cgi?forum=1&topic=247&start=144&show=0
处下载参考。

      现将主要函数的功能介绍如下:
static int GetVideoPict (struct vdIn *vd);//获取图片属性信息。
static int SetVideoPict (struct vdIn *vd);//设置图片属性。
static int isSpcaChip (const char *BridgeName);//测试芯片类型
static int GetStreamId (const char *BridgeName); //测试输出数据的格式
static int GetDepth (int format);//获取颜色深度。
void exit_fatal(char *messages);//错误显示。
int init_videoIn(struct vdIn *vd,char *device,int width,int height,int format,int
grabmethod);//初始化设备。
int convertframe(unsigned char *dst,unsigned char *src, int width,int height, int
formatIn, int size);//把共享缓冲区中的数据放到一个变量中,通知系统已获得一
帧。
int v4lGrab (struct vdIn *vd,char *filename );//从摄像头采集图片。
int close_v4l (struct vdIn *vd);//关闭摄像头。
int get_jpegsize (unsigned char *buf, int insize);//获取jpeg图片大小。

       三 实例程序

      3.1 LCD 实时显示从ov511 上采集的图像

       参考HHARM9-EDU/applications/usbcam2lcd。从摄像头获取bmp位流直接显示
在framebuffer中。此程序图像的采集采用read的方式,注意由于lcd液晶屏显示的
是16bits的RGB图片,所以,ov511输出的图片格式也应该是16bits的RGB图片数
据,宏VIDEO_PALETTE_RGB565定义的就是16bits的RGB数据图片。而linux自
带的ov511驱动中图像采集是32位的,这样采集到的图片显示在lcd上是雪花点。
因此需要修改驱动。 在kernet/driver/usb/目录下有ov511芯片的驱动ov511.c,驱
动里的ov51x_set_default_params函数是设置芯片默认的输出图片的格式,该函数
中的
for (i = 0; i < OV511_NUMFRAMES; i++)
{
ov511->frame[i].width = ov511->maxwidth;
ov511->frame[i].height = ov511->maxheight;
ov511->frame[i].bytes_read = 0;
if (force_palette)
ov511->frame[i].format = force_palette;
else
ov511->frame[i].format = VIDEO_PALETTE_RGB24;
ov511->frame[i].depth = ov511_get_depth(ov511->frame[i].format);
}
部分语句是主要设置ov511默认输出图片格式的,其中maxwidth和maxheight
设置了图片的最大的宽度和高度。Ifelse语句设置了图片的格式,作如下的修改:
for (i = 0; i < OV511_NUMFRAMES; i++)
{
ov511->frame[i].width = ov511->maxwidth;
ov511->frame[i].height = ov511->maxheight;
ov511->frame[i].bytes_read = 0;
ov511->frame[i].format = VIDEO_PALETTE_RGB565;
ov511->frame[i].depth = ov511_get_depth(ov511->frame[i].format);
}
如果需要,也可以改变图片的默认输出大小。

     3.2 LCD 实时显示从zc301 上采集的图像
编程思想:从摄像头采集到的图片存放在本地文件夹,通过minigui加载jpeg
来实现显示。

      具体过程:
1.从网上下载jpegsrc-6b的jpeg库,交叉编译。
(1)./configure –enable-static –enable-shared –prefix=.libs
(2)修改Makefile,将编译器改成交叉编译器。
例如:我改成/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
(3)make 后即在.libs目录中生成for arm的
libjpeg.a, libjpeg.la,libjpeg.so,libjpeg.so.62,libjpeg.so.62.0.0。将这些文件拷贝到系
统库文件目录,我的是/usr/lib中。
2.因为看从zc301采集的图片的二进制位流,jpeg头是ff d8 ff db。而在minigui库
文件libminigui的源文件src/mybmp/jpeg.c中,load_jpg和check_jpg的时候测试的头
位EXIF和JFIF两种格式的jpeg图片。这两种对应的二进制分别是ff d8 ff e1和ff d8
ff e0。所以我们minigui通过判断认为这是错误的jpeg格式而不加载,故无法显示。
实际上通过测试,在源码中去掉这两个判断就能正确加载。
3.交叉编译minigui
( 1 ) 编译库: ./configure --host=arm-unknown-linux --enable-jpgsupport=yes
--enable-pngsupport=no --enable-gifsupport=no --disable-lite
--prefix=/HHARM9-EDU/applications/minigui-free/nfsroot
--enable-smdk2410ial=yes
make
make install
(2)编译实例程序时,要加上jpeg库的支持,即在Makefile中加上-ljpeg。此时
将在nfsroot生成的库文件和可执行文件移到ramdisk.image.gz相应的目录下。(具
体参考华恒的2410开发手册)。

       3.Minigui程序的编写

       编程小技巧,我采取的方法是一刻不停地从摄像头采集到图片存储在
/tmp/1.jpg中,在minigui中通过loadbitmap函数来加载图片。而图片加载后不会自
动更新,不能自动根据1.jpg的改变自动变化。因此,我在程序中设定一个timer。

       每隔100ms刷新屏幕,基本上实现实时更新了。而出现另外一个问题,刷新时会以背景色来填充桌面,导致屏幕闪烁严重。故想到采用MSG_ERASEBKGND的方式,用前一张图片做为刷新屏幕时的填充背景图片。这样就保证了lcd上图像的连续性啦。
Minigui程序如下:其中一些自定义的函数跟mouse_capture中的一样,只是
变采集单幅到采集多幅。具体您可以自己改一下:)。也可以向我索取源码。
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include "spcav4l.h"
#define IDTIMER 100
static BITMAP bmp;
static int LoadBmpWinProc(HWND hWnd, int message, WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
RECT rc={0,0,240,320};
switch (message) {
case MSG_CREATE:
SetTimer(hWnd,IDTIMER,100);
return 0;
case MSG_ERASEBKGND:
{
RECT rcTemp;
if( LoadBitmap(HDC_SCREEN,&bmp,"/tmp/1.jpg"))
{
printf("load wrong!\n");
return -1;
}
GetClientRect(hWnd, &rcTemp);
hdc = BeginPaint (hWnd);
FillBoxWithBitmap (hdc, rcTemp.left, rcTemp.top, rcTemp.right-rcTemp.left,
rcTemp.bottom-rcTemp.top, &bmp);
EndPaint(hWnd, hdc);
return 0;
}
case MSG_TIMER:
InvalidateRect(hWnd,&rc,TRUE);
return 0;
case MSG_CLOSE:
UnloadBitmap (&bmp);
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
char videodevice[] = "/dev/video0";
char jpegfile[] = "/tmp/1.jpg";
int grabmethod = 0;
int format = VIDEO_PALETTE_JPEG;
int width = 240;
int height = 320;
int i;
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "Load and display a bitmap";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = LoadBmpWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 320;
CreateInfo.iBkColor = PIXEL_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow (hMainWnd, SW_SHOWNORMAL);
memset(&videoIn, 0, sizeof (struct vdIn));
if(init_videoIn(&videoIn, videodevice, width, height, format,grabmethod) == 0)
{
printf("init is ok!\n");
}
else printf("init is wrong!\n");
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
v4lGrab(&videoIn, jpegfile);
DispatchMessage(&Msg);
}
close_v4l (&videoIn);
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
先写到这里吧,呵呵,希望能对您有所帮助。如果您在阅读的过程中发现问
题,欢迎和我交流。

      参考文献

     1.HHARM2410摄像头调试记录 华恒科技
     2.基于video4linux的视频设备编程 Lingzhi_Shi Apr 7 2004
     3.《video4linux programming》 Alan Cox
     4.《video streaming 探讨》 陈俊宏
     5.《Video4Linux Kernel API Reference 》
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Video4Linux 的USB摄像头图像采集实现 的相关文章

  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 发现多个 USB-IrDA 设备,打开并连接每个设备的套接字

    对于任何优秀的套接字程序员 是否可以使用套接字枚举通过 USB 端口连接到 PC 的多个活动 IrDA 设备 如果是这样 怎么办 这确实是我的主要问题 帖子的其余部分完善了细节并描述了我所尝试的内容 我正在使用 Microsoft SDK
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • libv4l2:打开流时出错:设备上没有剩余空间

    我尝试为 opencv 获取立体声对 我将 Logitech B910 和 Logitech C910 网络摄像头连接到 USB 但有这个错误 我玩弄了怪癖参数并设置outfmt mjpeg在mplayer中 但又出现此错误 在哪里可以找到
  • Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

    使用 pyinstaller 3 1 python 2 7 9 和 tkinter 尝试使用 pyusb 而不是 pyserial 但没有可用的后端 调查Windows 上的 Pyusb 没有可用的后端 https stackoverflo
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • 时间:2019-03-17 标签:c#usbdecision

    我们当前的应用程序中有几个进程 一个进程处理 USB 加载程序的检测和删除 处理检测和删除的代码如下 protected override void WndProc ref Message m switch m Msg case Win32
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • 如何使用 python / pywinusb 将 hid 数据发送到设备?

    我正在尝试使用 pywinusb 将输出报告发送到 pic18f4550 该设备可以接收数据 我已经使用 C 应用程序对其进行了测试 效果很好 另外 我可以使用 pywinusb 从设备读取数据 但我在尝试发送数据时遇到问题 这是我正在运行
  • 如何在java中访问USB端口[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试编写一个java应用程序来访问USB端口以读取和写入通过USB连接的设备 我面临的问题是我不
  • 使用 Windows 原始访问 API 直接访问 USB 驱动器

    在USB物理驱动器的末尾 我想使用Windows原始访问API直接写入数据 我不想使用内核驱动程序来做到这一点 据我所知 出于安全原因 Windows XP SP2 或 SP3 阻止了 HDD 直接访问 我不确定 USB 驱动器是否如此 请
  • Python:获取USB闪存驱动器设备的名称[windows]

    我正在尝试编写一个小程序 它将能够读取有关 REMOVEABLE DEVICE USB 的一些信息 我试过了pyusb https github com walac pyusb但我无法提取我需要的数据 我想从系统中读取 USB 设备的名称
  • ASP.NET/Silverlight 控制 USB 设备

    我想使用某种 USB 设备 例如闪光灯 提醒用户有新消息 是否可以从 ASP NET 或 Silverlight 控制 USB 设备 您可以在网页中使用自定义 ActiveX 组件和一些 javascript 来完成此操作 或者 您可以使用
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • 如何在Android上读取/写入外部USB存储设备?

    我目前正在制作一个应用程序 需要能够读取和写入通过 USB OTG 适配器连接的 USB 闪存驱动器 有没有一种简单的方法可以通过标准访问此存储Java io File蜜蜂 该应用程序只能在运行 Android 4 2 2 的已 root
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 以编程方式连接和断开 USB,“无需拔出和重新插入”

    我需要以编程方式连接和断开 USB 也就是说 我已经插入了USB设备 我需要使用 C NET 应用程序传输文件 该应用程序将监视特定文件夹并将文件从该文件夹传输到 USB 驱动器 我需要在文件传输后断开 USB 设备的连接 并在需要时连接
  • 通过 USB 将原始文本发送到打印机

    我正在尝试将 ZPL 命令发送到 Zebra ZT230 打印机 打印机和驱动程序已安装 打印机端口为 USB003 PC 通过 Zebra 打印机设置实用程序或 ZebraDesign 与打印机完美通信 我尝试了以下代码 Private

随机推荐

  • stm32单片机OLED取字模软件使用 PCtoLCD2002

    PCtoLCD2002 xff0c 适用单色屏取字模制作字库 xff0c 进行位图转换 xff0c 还可自行描点 xff0c 使用非常简单方便 1 取字模 xff0c 制作字库 打开PCtoLCD2002 单片机OLED或者其他单色屏 xf
  • Linux 下编译并安装配置 Qt 全过程

    1 获得源代码 src 官网下载地址 xff1a ftp ftp qt nokia com qt source 2009 年 10 月 1 日发布的 qt x11 opensource src 4 5 3 tar gz xff0c 大小 1
  • CentOS8使用gmssl搭建demoCA及配置OCSP服务

    本文档以CentOS8 43 GmSSL2 5 4版本为例 1 GmSSL搭建CA 1 1 安装GmSSL 我们知道 xff0c Linux下默认只有openssl的发行版 xff0c 并没有默认安装GmSSL xff0c 所以需要手动下载
  • 二、Linux SSH远程连接Windows

    1 关闭防火墙 2 允许远程访问 3 安装SSH服务器并启动 4 打开Linux查看防火墙状态 xff0c 未关闭则用system stop firwall暂时关闭防火墙 5 测试网络连通性 xff0c 不通则检查网卡 xff0c 保证网络
  • Linux qt6安装

    首先qt目前正常安装的话 xff0c 需要先在官网注册一个账号 xff0c 邮箱激活下 xff0c 记住账号密码就好 xff0c 这个是目前qt安装必须的 目前安装的方式有两种 xff0c 推荐大家使用在线联网安装 xff08 官网已不提供
  • Shell系统学习之如何执行Shell程序

    系列文章目录 Shell系统学习之什么是Shell Shell系统学习之创建一个Shell程序 Shell系统学习之向Shell脚本传递参数 Shell系统学习之如何执行Shell程序 Shell系统学习之Shell变量和引用 Shell系
  • 个人Obsidian同步和分享方案:AList+rclone+PicHoro

    Obsidian同步方案 最近尝试了下Obsidian这款笔记工具 xff0c 整体体验还是不错的 xff0c 但obsidian的同步确实是个大问题 我的主要需求是windows编辑加安卓端的查看 xff0c 偶尔可能需要编辑一下 xff
  • MySQL之limit用法

    SELECT FROM table LIMIT offset rows rows OFFSET offset 意思就是说 xff1a 可以这样子 xff1a SELECT FROM table LIMIT offset rows 或者这样子
  • 安卓定时器每5分钟执行一次方法

    import android os Handler 定时任务实现 private Handler handler 61 new Handler Runnable runnable 61 new Runnable 64 Override pu
  • 文件操作汇总

    为方便复习 xff0c 汇总一下以前相关笔记的索引 linux操作总结汇总 xff1a 进程内存通信 C语言 详解C中的系统调用open close read write C中文件操作复习 最近有关linux文件操作的总结
  • Anaconda安装及基本使用

    1 linux安装 conda可以创建多种语言环境 xff0c 支持的语言有 xff0c 可以创建多种复杂环境 xff0c 如果只需要python环境 xff0c pycharm自带的应该可以满足需求 Python R Ruby Lua S
  • Ubuntu18.04安装过程中界面卡死,完美解决办法

    让我们开始吧 在网上搜了资料 xff0c 总结如下 xff1a 1 u盘启动过程中 xff0c 会出现选择界面 xff0c try ubuntu install ubuntu等 xff0c 此时点 e 键 xff0c 会出现一个黑框 xff
  • 打包成jar文件后运行出现Invalid or corrupt jarfile 解决

    Invalid or corrupt jarfile home WebService jar Failed to load Main Class manifest attribute from home WebService jar 打ja
  • TX2(ubuntu 18.04)更换清华镜像源

    注意 xff0c 该版本的TX2有两个特点 xff1a Arm架构和ubuntu18 04 一 备份 sudo cp etc apt sources list etc apt sources list bak 先备份原文件sources l
  • Ubuntu22.04+Nvidia RTX 3060 显卡驱动安装

    新装 Ubuntu22 04 LTS xff0c 电脑配的是Nvidia RTX 3060 xff0c 所以需要安装显卡驱动 xff0c 未安装前显卡显示如下 xff1a 1 设置阿里源 在软件和更新在第一栏Ubuntu 软件页面中 xff
  • 基于深度学习算法实现视频人脸自动打码

    前言 1 在当下的环境上 xff0c 短视频已是生活的常态 xff0c 但这是很容易就侵犯别人肖像权 xff0c 好多视频都会在后期给不相关的人打上码 xff0c 这里是基于yolov5的人脸检测实现人脸自动打码功能 2 开发环境是win1
  • 树莓派4B设置双网卡静态IP、网卡优先级、查看系统多少位

    1 设置静态IP 下面两种方法都试过 xff0c 可以永久保存 方法2更官方一些 但是 xff0c 方法 1 右上角可视化设置IP不知道为什么无法使用 xff0c 设置好后重启 xff0c 再ping局域网设备 xff0c 总是出现提示 x
  • 基于ZLG/BOOT的linux2.6内核移植(s3c2410)

    基于ZLG BOOT的linux2 6内核移植 s3c2410 ZLG BOOT是广州致远arm实验箱自带的bootloader 我用的这款实验箱自带的linux内核还是2 4版本的 有点儿老了 所 以想移植个2 6上去 由于bootlod
  • Linux如何挂载Windows的NTFS分区?

    使用的是RedHat Linux xff0c 其暂时还不能支持NTFS 分区的直接挂载 xff0c 目前有两种方法可以解决这个问题 一是重新编写Linux 内核 xff0c 二是安装一个功能RPM补丁 本文讨论的是第二种方法 第一步 xff
  • 基于Video4Linux 的USB摄像头图像采集实现

    J W Hu 的 基于Video4Linux 的USB摄像头图像采集实现 Linux本身自带了采用ov511芯片的摄像头 xff0c 而市场上应用最广泛的是采用中 芯微公司生产的zc301芯片的摄像头 xff0c 下面我将针对这两大系列的摄