STM32在Ubuntu上编写USB上位机程序实现

发布者:龙爱泉也最新更新时间:2018-10-13 来源: eefocus关键字:STM32  Ubuntu  USB  上位机 手机看文章 扫描二维码
随时随地手机看文章

libusb 介绍


libusb是开源的C库,使用该库是的用户可以在应用程序中直接访问 USB 设备,无需为 USB 设备编写内核驱动。libusb支持多个平台 (linux, window, ios),所以可以很方便地将应用程序移植到其他平台。


linux libusb 安装


从网上下载libusb的源码,下载地址:http://www.libusb.org/, 下载后编译安装。


# tar jxvf libusb-1.0.20.tar.bz2


# cd libusb-1.0.20

# ./configure

# make

# sudo make install

ubuntu下可以通过以下命令快速安装。


sudo apt-get isntall libusb*

安装后,libusb的头文件被安装在/usr/local/include/libusb-1.0 ,链接库被安装在/usr/loacal/lib目录下。


usb bulk 传输例程


这个例程演示如何使用 libusb 库,编写 USB bulk xfer 上位机demo,可以正常接收和发送数据。注意,修改程序中的 VID 和 PID 的值和你 device 板子上所定义的一致,传输数据块的大小不要超过 device 定义的最大传输长度。



#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#include "unistd.h"


#include "libusb.h"


#define VID 0x8888

#define PID 0x0088


#define edp2in 0x82

#define edp2out 0x02


int main(void)

{

    libusb_device **devs, *dev;

    int ret, i;

    ssize_t cnt;

    usb_pro_t usb_pro;

    struct libusb_device_handle *handle = NULL;

    libusb_context *ctx = NULL;


    ret = libusb_init(&ctx);

    if (ret < 0)

        return -1;


    libusb_set_debug(ctx, 3);


    cnt = libusb_get_device_list(NULL, &devs);

    if (cnt < 0) {

        printf("no usb dev on bus\r\n");

        return  -1;

    }


    i = 0;

    while((dev = devs[i++]) != NULL) {


        ret = libusb_get_device_descriptor(dev,&desc);

        if (ret < 0) {

            printf("failed to get device descriptor");

            goto error;

        }


        if ((desc.idVendor == VID) && (desc.idProduct == PID)) {

            printf("bLength: 0xx\r\n", desc.bLength);

            printf("bDescriptorType: 0xx\r\n", desc.bDescriptorType);

            printf("bcdUSB: 0xx\r\n", desc.bcdUSB);

            printf("bDeviceClass: 0xx\r\n", desc.bDeviceClass);

            printf("bDeviceSubClass: 0xx\r\n", desc.bDeviceSubClass);

            printf("bDeviceProtocol: 0xx\r\n", desc.bDeviceProtocol);

            printf("bMaxPacketSize0: 0xx\r\n", desc.bMaxPacketSize0);

            printf("vendor id: 0xx\r\n", desc.idVendor);

            printf("product id: 0xx\r\n", desc.idProduct);

            printf("bcdDevice: 0xx\r\n", desc.bcdDevice);

            printf("iManufacturer: 0xx\r\n", desc.iManufacturer);

            printf("iProduct: 0xx\r\n", desc.iProduct);

            printf("iSerialNumber: 0xx\r\n", desc.iSerialNumber);

            printf("bNumConfigurations: 0xx\r\n", desc.bNumConfigurations);


        }


    }


    handle = libusb_open_device_with_vid_pid(ctx, VID, PID);


    if (handle == NULL) {

        printf("cant't open device\r\n");

        goto error;

    } else {

        printf("open device\r\n");

    }


    libusb_free_device_list(devs, 1);


    if (libusb_kernel_driver_active(handle, 0) ==1) {

        printf("kernel driver active, detach it \r\n");


        if (libusb_detach_kernel_driver(handle, 0) == 0) {

            printf("detached kernel driver\r\n");

        }

        else {

            goto error;

        }

    }


    ret = libusb_claim_interface(handle, 0);

    if (ret < 0) {

        printf("can't claim interface\r\n");

        goto error;

    } else {

        printf("claimed interface\r\n");

    }


    char data[64];

    int actual_len = 0;

    int didi = 1000;

    for (int i = 0; i< 1000; i++) {

        memset(data, 0, sizeof(data));

        //  receive data from device  

        //ret = libusb_bulk_transfer(handle, edp2in, data, 64, &actual_len, 0);

        //if (actual_len = 0) {

        //    printf("received nothing\r\n");

        //} else {

        //    printf("bulk transfer: %s\r\n", data);

        //}

        //usleep(200000);


        char *str = "am host";


        sprintf(data, "am host %d\r\n", i);


        ret = libusb_bulk_transfer(handle, edp2out, data, strlen(data), &actual_len, 0);


        if (actual_len != 0) {

            printf("send data: %s\r\n", data);

        }


        usleep(200000); 

    }


    libusb_close(handle);


error:


    printf("free device list\r\n");

    libusb_free_device_list(devs, 1);


    libusb_exit(NULL);


    return 0;

}

编译


编译代码可以使用 makefile 文件,也可以是使用命令行命令编译,这里给出两种编译方法。


makefile


CC = gcc


# your libusb library path, be careful your path.

LDIR = /usr/loacal/lib


# link flag

LFLAG = -lusb-1.0


# libusb hearder file path

INCLUDES = /usr/local/include/libusb-1.0


CFLAGS = -I$(INCLUDES) -std=c99


src = $(wildcard *.c)


obj = $(patsubst %.c, %.o, $(src))


.PHONY: all clean


all: main


main: $(obj)

    $(CC)   $(obj) -o main -L$(LDIR) $(LFLAG)


%.o:%.c

    $(CC) $(CFLAGS) -c $< -o $@


clean:

    @-rm -f main $(obj)

命令行编译 

命令中-I/usr/local/include/libusb-1.0 告诉编译器 libusb 的头文件所在的路径。-L/usr/local/lib/ 告诉链接器所要链接的库文件路径。-lusb-1.0 告诉编译器需要链接 libusb-1.0.so这个库。

 gcc -I/usr/local/include/libusb-1.0 -std=c99 main.c -o main -L/usr/local/lib/ -lusb-1.0

运行


编译后会在当前目录下生成一个名叫“main“的可执行文件,运行这个文件。如果打开USB设备时出错提示permission error,那么使用


# sudo ./main

运行后,HOST每隔200ms 向 device 发送一个数据包。


源码下载


我的源码已上传到http://download.csdn.net/detail/chengwenyang/9479835 ,包含STM32F4Discovery板子的 usb bulk 传输的工程文件和 使用 libusb 编写的上位机程序。


关键字:STM32  Ubuntu  USB  上位机 引用地址:STM32在Ubuntu上编写USB上位机程序实现

上一篇:进入存量市场,硬件巨头要开辟哪些新市场?
下一篇:arm-none-eabi-gcc编译STM32优化删除代码解决办法

推荐阅读最新更新时间:2024-03-16 16:16

具有USB2.0接口的高速数据采集卡设计
摘要:讨论基于USB接口的高速数据采集卡的设计与实现。详细讲述数据采集卡的硬件部分设计,并简要介绍固件程序、驱动程序和应用软件的设计。 关键词:USB2.0 FPFO FPGA 固件程序 主从系统 引言 数据采集在现代工业生产及科学研究中的重要地位日益突出,并且实时高速数据采集的要求也不断提高。在信号测量、图像处理、音频信号处理等一些高速、高精度的测量中,都需要进行高速数据采集。现在通用的高速数据采集卡一般多是PCI卡或ISA卡,这些采集卡存在很多缺点,比如安装麻烦,价格昂贵,尤其是受计算机插槽数量、地址、中断资源的限制,可扩展性差。 通用串行总线USB是用来连接外围设备与计算机之间的新式标准接口总线。它是一种快速、双向、
[应用]
iTOP-4412开发板-QtE4.7-usb3G上网卡移植教程
开发板用的是迅为的iTOP-4412开发板 移植华为 E261 WCDMA 12d1:1446USB 上网卡到 4412 开发板 QtELinux 系统。 1 内核配置 配置内核以下选项 和 如下图所示 然后编译内核,烧写到开发板。 2 工具的编译 本次移植共需要四个工具,它们互相有依赖关系,为了方便编译,将它们拷贝到同一目录 并解压,如下图所示。 2.1 编译libusb-0.1.12 进入文件夹 libusb-0.1.12,执行以下命令。 进入文件夹 libusb-0.1.12,执行以下命令。 ./configure --host=arm-none-linux-
[单片机]
iTOP-4412开发板-QtE4.7-<font color='red'>usb</font>3G上网卡移植教程
STM32 CAN学习
最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的。开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用来传输数据通信的,对其工作原理一窍不通,还是从基础开始看书看资料,先了解它的基本原理吧。 原来can总线有以下特点: 主要特点 ? 支持CAN协议2.0A和2.0B主动模式 ? 波特率最高可达1兆位/秒 ? 支持时间触发通信功能 发送 ? 3个发送邮箱 ? 发送报文的优先级特性可软件配置 ? 记录发送SOF时刻的时间戳 接收 ? 3级深度的2个接收FIFO ? 14个位宽可变的过滤器组-由整个CAN共享 ? 标
[单片机]
<font color='red'>STM32</font> CAN学习
STM32普通定时器(TIM2-7)的时钟源
iframe id="iframe_0.9722621580585837" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://img.ph.126.net/Q5uD6HNVvCLylT0oKY6Z2w==/3353492872531932260.jpg?_=2389336&_=6218048%22%20style=%22border:none;max-width:1058px%22%3E%3Cscript%3Ewindow.onload%2
[单片机]
<font color='red'>STM32</font>普通定时器(TIM2-7)的时钟源
基于STM32+ESP8266+华为云IoT设计的云端绿化管理系统
1. 设计需求、硬件环境介绍 1.1 项目背景 绿化管理系统在现实生活、生产中的应用十分广泛,它是集环境感知、规划决策、自动管理等功能于一体的综合系统。目前,在城市道路两旁的区域绿化主要为花、草、树、灌木等,其中较多种植物对水的敏感性较高,如果供水不足够或过多,会造成枯萎,甚至死亡。而且采用人工的方式进行管理,不能够较好的了解种植区域的数据,而造成水资源极大地浪费,为响应国家“十四五”规划提出的生态文明建设实现新进步,能源资源配置更加合理、利用效率大幅提高,生态环境持续改善;因此发展先进的智能灌溉技术对绿化管理至关重要。 传统的手动绿化管理控制多采用人工方式通过观察地表潮湿度来进行灌溉,这样不仅造成水资源浪费和人力资源的浪费,
[单片机]
基于STM32+ESP8266+华为云IoT设计的云端绿化管理系统
STM32学习记录17 串口一键下载
1.MCUISP串口软件一键下载设置: DTR低电平复位,RTS高电平进入bootload串口下载 在ch340芯片对应DTR和RTS输出电平与电脑软件设置的电平相反。一键下载电路根据ch340芯片对应引脚的控制信号完成对应功能具体实现过程如下: 2.单片机启动设置单片机低电平复位 Boot0=0,boot1=x,从用户区flash启动Boot0=1,boot1=0,进入串口下载区Boot0=1,boot1=1,从SRAM启动改变boot0电平就可以从不同区域启动 3.一键下载电路如下: 4.当MUCISP软件点击下载后(需要选中下载后执行):DTR#,RTS#信号由MUCISP软件控制MUCISP软件设置为:
[单片机]
<font color='red'>STM32</font>学习记录17 串口一键下载
再造STM32---第十九部分:I2C—读写 EEPROM
本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《I2C 总线协议》。 若对 I2C 通讯协议不了解,可先阅读《I2C 总线协议》文档的内容学习。若想了解SMBUS,可阅读《smbus20》文档。 关于 EEPROM 存储器,请参考“ 常用存储器介绍”章节, 实验中的 EEPROM,请参考其规格书《AT24C02》来了解。 19.1 I2C协议简介: I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩
[单片机]
再造STM32---第十九部分:I2C—读写 EEPROM
基于CBI传输结构的USB硬盘接口应用设计
    摘要: 主要介绍采用CBI传输结构进行USB大容量存储设备设计时应该注意的问题;详细说明对应CBI结构在设计时应进行哪些设置和如何设置;给出用台湾创品公司的T33510设计USB键盘的实例。     关键词: USB CBI 大容量存储设备 引言 USB是英文Universal Serial Bus的缩写,中文含义是“通用串行总线”。它不是一种新的总线标准,而是应用在PC领域的新型接口技术,具有使用方便、速度较快、连接灵活、独立供电等特点。1998年后,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB逐步走进了实用阶段,USB协议已经发展到2
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved