娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年09月17日(星期二)

2018年09月17日 | STM32 USB 上位機程序實現

發布者:碼字先生 來源: eefocus關鍵字:STM32  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

#include

#include

#include


#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: 0x%04x\r\n", desc.bLength);

            printf("bDescriptorType: 0x%04x\r\n", desc.bDescriptorType);

            printf("bcdUSB: 0x%04x\r\n", desc.bcdUSB);

            printf("bDeviceClass: 0x%04x\r\n", desc.bDeviceClass);

            printf("bDeviceSubClass: 0x%04x\r\n", desc.bDeviceSubClass);

            printf("bDeviceProtocol: 0x%04x\r\n", desc.bDeviceProtocol);

            printf("bMaxPacketSize0: 0x%04x\r\n", desc.bMaxPacketSize0);

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

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

            printf("bcdDevice: 0x%04x\r\n", desc.bcdDevice);

            printf("iManufacturer: 0x%04x\r\n", desc.iManufacturer);

            printf("iProduct: 0x%04x\r\n", desc.iProduct);

            printf("iSerialNumber: 0x%04x\r\n", desc.iSerialNumber);

            printf("bNumConfigurations: 0x%04x\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  USB  上位機程序 引用地址:STM32 USB 上位機程序實現

上一篇:STM32F4中USB與PC雙向通信
下一篇:使用stm32F10XX芯片開發的USB HID 雙向通信

推薦閱讀

只要愿意行動,機器永遠無法取代你 面對數字技術驅動的智能時代,有觀點認為機器人將搶走很多人的飯碗,如果說機器人能勝任很多工作,那人就一定能找到他自己生存的空間和這些問題的解決方法。 有兩件事情,機器是不替代的: 第一,就是你的個性,這是沒有人可以模仿的,「個性」是動詞,是一個變量。你如果不斷的去變化,不斷的去調整,沒有人可以...
新浪手機訊 9月13日上午消息,剛剛OPPO沈義人發布微博,OPPO旗艦手機將于10月發布,并且首搭載65瓦快速充電技術。  在上周OPPO Reno 2發布會尾聲時,官方宣布新旗艦名為——OPPO Reno Ace將于10月發布。  今日沈義人透露了該機的一項特點,支持65瓦SuperVOOC快速充電技術。  OPPO在快充技術上,一直有自己獨特的技術。2014年,OPPO率先推出自主...
9月16日,阿里巴巴公布新業務,沉淀三年的“新制造”樣板“犀牛工廠”正式于浙江杭州亮相。“犀牛工廠”從服裝業切入,通過阿里巴巴平臺上沉淀的消費行為,為淘寶、天貓商家提供時尚趨勢預判;同時,借助阿里巴巴數字化能力,對傳統服裝供應鏈進行柔性化改造,將行業平均1000件起訂、15天交付的流程,縮短為100件起訂、7天交貨,為中小企業提供小單量、多...
在全球科技行業,中國臺灣地區的南亞電路板股份有限公司(Nan Ya Printed Circuit Board Corp.)并不是一個家喻戶曉的名字,但這家鮮為人知的公司卻生產著眼下芯片制造過程中急需的一種重要零部件——ABF載板(Ajinomoto build-up film substrate)。  目前,芯片荒已日益成為汽車制造商和電子科技企業所面臨的嚴峻挑戰。而對于世界上許多最先...

史海拾趣

問答坊 | AI 解惑

請教開關電源變壓器

現在開發一款開關電源.輸入為美規120V.輸出5V/1A.單片開關電源芯片選定為TOP221.高頻變壓器為3個繞組.120V輸入繞組,5V輸出繞組和檢測電源繞組.請教象這樣的變壓器的參數是怎樣的?謝謝!…

查看全部問答∨

EPS扭矩傳感器的相關研究

         EPS主要由[url=http://www.ftxsensor.cn/]扭矩傳感器[/url]、車速傳感器、電動機、減速機構和電子控制單元(ECU)等組成。          通過傳感器探測司機在轉向操作時方向盤產 ...…

查看全部問答∨

基于DSP+CPLD的交流電機調速在水處理控制中的應用

1 引言 生化反應池在水處理過程中非常重要。需要通過調整風機的轉速控制反應池中的DO值。理論上應該通過調節電動機的轉速來實現,但實際上卻是利用擋板閥門后者放空的方法進行調節。這種方法極大地浪費了電力資源。以美國TI公司推出的TMS320LF240 ...…

查看全部問答∨

急!急!急!請教一個關于udp通信的問題

我想在一個多任務程序中用udp方式實現任務之間的通信,應該屬于在本地機上實現通信,不知道怎么做啊,把ip設成一樣的127.0.0.1就可以了嗎?…

查看全部問答∨

關于在2440上移植linux的問題

1,請教幾個問題,是不是理論上來說,任何linux版本都可以移植到2440上,只是易難不同? 2.如果2440移植的不是三星提供的版本,那是不是移植非常困難,但是據我所知三星只提供mizi版呀?而mizi是面對2410的呀?貴公司在2440的板子上移植Linux 2.6.1 ...…

查看全部問答∨

ADS 1.2開發環境下如何使用libxml2庫?

我想在ADS下調用libxml2解析器的函數,有知道怎么導入的么? 或者還有其他更方便的xml解析庫么? 剛用tinyxml試了下,好多Error,是不是ADS下對c++支持不怎么好?…

查看全部問答∨

網絡最佳兼職

假如你想創業但資金不多或想找個兼職請看這 與您現有的工作相容互補而不沖突             不需要受學歷的限制        不需要特殊的專業技能        不需要受 ...…

查看全部問答∨

哪里有SN8P1929資料?謝謝

本帖最后由 paulhyde 于 2014-9-15 09:21 編輯 哪里有SN8P1929資料?謝謝  …

查看全部問答∨

誰有MSP-FET430X110的資料

誰有MSP-FET430X110的資料。看圖…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 大渡口区| 山阳县| 揭西县| 青冈县| 商都县| 杨浦区| 海南省| 平和县| 石屏县| 武冈市| 巨野县| 黄山市| 丰镇市| 砚山县| 蓝田县| 四会市| 淅川县| 同江市| 延边| 平塘县| 兰州市| 中卫市| 乐清市| 汝州市| 抚州市| 枞阳县| 大姚县| 武胜县| 荣成市| 雷山县| 疏勒县| 博乐市| 象山县| 凌海市| 屏东市| 女性| 乐至县| 永嘉县| 乐业县| 吴桥县| 崇阳县|