0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

winUSB設(shè)備的開(kāi)發(fā)方法

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:未知 ? 2022-12-14 20:10 ? 次閱讀

1、winUSB功能介紹

winUSB設(shè)備在win10系統(tǒng)下自帶驅(qū)動(dòng)程序的,winUSB設(shè)備連接到USB后,可以直接被系統(tǒng)識(shí)別,無(wú)需安裝驅(qū)動(dòng),實(shí)現(xiàn)了免驅(qū)的功能。就像鍵盤(pán)、鼠標(biāo)插入到電腦上直接使用一下。

winUSB設(shè)備使用BULK傳輸,具有傳輸數(shù)據(jù)量的優(yōu)點(diǎn),設(shè)備使用BULK IN, BULK OUT,CONTROL3個(gè)端點(diǎn)來(lái)進(jìn)行通信。因此winUSB設(shè)備在開(kāi)發(fā)USB產(chǎn)品時(shí)是一個(gè)很好的選擇。

2、winUSB軟件選型

winUSB軟件采用RT thread操作系統(tǒng)自帶的USB device協(xié)議中 Winusb類驅(qū)動(dòng),此協(xié)議棧已經(jīng)實(shí)現(xiàn)了USB的基本功能,具體代碼可以參考分享倉(cāng)庫(kù)地址:GitHub - longtengmcu/USB-HOST-driver-4G-rndis-device: STM32F429 USB HOST driver 4G rndis device, Realization of high speed Ethernet data communication。

1程序在STM32中運(yùn)行USB連接到WIN10電腦后是可以直接枚舉到的,但是具體進(jìn)行數(shù)據(jù)通信時(shí)要做軟件上的修改。
2其中對(duì)于winUSB部分代碼做了改進(jìn):

對(duì)于winUSB的read部分函數(shù):修改成讀取剩余部分的數(shù)據(jù),這樣在USB主機(jī)發(fā)送一包數(shù)據(jù)后就會(huì)立即觸發(fā)接收回調(diào)函數(shù)來(lái)處理數(shù)據(jù),原來(lái)的寫(xiě)法是接收到輸入緩沖區(qū)長(zhǎng)度的數(shù)據(jù)后才什么觸發(fā)接收回調(diào)函數(shù)。

d6566716-7ba4-11ed-8abf-dac502259ad0.png

對(duì)winusb設(shè)備端點(diǎn)IN處理流程中增加對(duì)發(fā)送整最大包數(shù)長(zhǎng)度數(shù)據(jù)的處理,即這種情況下發(fā)送一個(gè)ZLP,0長(zhǎng)度包,讓主機(jī)知道這次傳輸完成。

d6754776-7ba4-11ed-8abf-dac502259ad0.png

到這里,winUSB的驅(qū)動(dòng)部分已經(jīng)改好了。但是要做USB進(jìn)行通信還有很多代碼要寫(xiě)。

3、winUSB應(yīng)用程序的編寫(xiě)

winUSB設(shè)備在RT THREAD操作系統(tǒng)中注冊(cè)成winUSB設(shè)備,所以對(duì)winUSB的讀寫(xiě)要使用設(shè)備操作的幾個(gè)函數(shù)rt_device_find, rt_device_open, rt_device_read, rt_device_write。感覺(jué)跟其他設(shè)備一樣,但是在實(shí)際調(diào)試過(guò)程中由于底層是USB設(shè)備,用法還是有不少區(qū)別的,應(yīng)用時(shí)要做很多特殊的處理。

3.1 winUSB設(shè)備的初始化

1初始化時(shí)跟基他設(shè)備類型,find,open,注意除了注冊(cè)接收回調(diào)函數(shù)外還要注冊(cè)發(fā)送回調(diào)函數(shù)。最后必須先調(diào)用一下rt_device_read()給winUSB設(shè)備接收數(shù)據(jù)時(shí)傳入接收數(shù)據(jù)使用的緩沖區(qū),同時(shí)啟動(dòng)USB設(shè)備接收。
 1/*findandopencommanddevice*/
 2dev_name=“winUSB”
 3client->device=rt_device_find(dev_name);
 4if(client->device)
 5{
 6/*usingthetxinterruptwhenuartisRS485*/
 7open_result=rt_device_open(client->device,RT_DEVICE_OFLAG_RDWR);
 8RT_ASSERT(open_result==RT_EOK);
 9rt_device_set_tx_complete(client->device,utc_d_tx_ind);
10rt_device_set_rx_indicate(client->device,utc_d_rx_ind);
11client->putc_package=client->utcA_package;
12/*waitreadthewinusbdevicesuccess*/
13while(rt_device_read(client->device,0,client->putc_package,sizeof(client->utcA_package))==0)
14{
15rt_thread_mdelay(10);
16}
17}
18else
19{
20LOG_E("Notfindthedevice(%s).",dev_name);
21result=-RT_ERROR;
22}

		
1接收回調(diào)函數(shù),USB設(shè)備接收到數(shù)據(jù)后,發(fā)送一個(gè)信號(hào)量給接收數(shù)據(jù)的線程通知數(shù)據(jù)處理。這個(gè)接收回調(diào)函數(shù)中使用雙緩沖區(qū),讓接收數(shù)據(jù)與處理數(shù)據(jù)互不干擾。

		
 1staticrt_err_tutc_d_rx_ind(rt_device_tdev,rt_size_tsize)
 2{
 3utc_d_client_tclient=&utc_d_client;
 4if(client->package_len)
 5{
 6LOG_W("utcpackageoverwrite!");
 7}
 8client->package_len=size;
 9if(client->putc_package==client->utcA_package)
10{
11client->putc_package=client->utcB_package;
12}
13else
14{
15client->putc_package=client->utcA_package;
16}
17/*readtheusbdatanext*/
18rt_device_read(dev,0,client->putc_package,sizeof(client->utcA_package));
19if(size)
20{
21/*releasethesem*/
22rt_sem_release(client->rx_notice);
23}
24returnRT_EOK;
25}

		

		
1發(fā)送回調(diào)函數(shù),usb設(shè)備發(fā)送成功后會(huì)調(diào)用發(fā)送回調(diào)函數(shù),發(fā)送一個(gè)信號(hào)量,通知發(fā)送函數(shù)已經(jīng)成功完成發(fā)送,這個(gè)功能非常重要,否則,USB設(shè)備無(wú)法正常工作。

		
1staticrt_err_tutc_d_tx_ind(rt_device_tdev,void*buffer)
2{
3utc_d_client_tclient=&utc_d_client;
4rt_sem_release(client->tx_notice);
5returnRT_EOK;
6}

		
1usb設(shè)備發(fā)送函數(shù)通過(guò)rt_device_write函數(shù)把數(shù)據(jù)發(fā)送給usb設(shè)備驅(qū)動(dòng)后,一定要等待發(fā)送完成才行。

			
 1staticintutc_d_send(utc_d_client_tclient,rt_uint8_t*send_data,rt_uint32_tsend_len)
 2{
 3/*sendthepacketcounter*/
 4client->send_packet_counter++;
 5if(rt_device_write(client->device,0,send_data,send_len)==send_len)
 6{
 7/*Mustwaittheusbsenddatafinish*/
 8returnrt_sem_take(client->tx_notice,RT_WAITING_FOREVER);
 9}
10else
11{
12return-RT_ERROR;
13}
14}

			
1至此,winUSB設(shè)備的應(yīng)用程序基本功能就全部實(shí)現(xiàn),你可以基于此來(lái)進(jìn)行與上位機(jī)的數(shù)據(jù)通信了。
2下期預(yù)告,winUSB的調(diào)試環(huán)境搭建與調(diào)試方法。

			

winUSB設(shè)備上位機(jī)驅(qū)動(dòng)開(kāi)發(fā)環(huán)境的搭建:

https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html(請(qǐng)復(fù)制至外部瀏覽器打開(kāi))

版權(quán)聲明:本文為RT-Thread論壇用戶「fhqmcu」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:

https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html


RT-Thread開(kāi)發(fā)者大會(huì)

我們將聯(lián)合重量級(jí)合作伙伴,圍繞AIoT的發(fā)展、產(chǎn)業(yè)技術(shù)趨勢(shì),聚焦控制、連接、行業(yè)應(yīng)用開(kāi)發(fā),通過(guò)主題演講、技術(shù)分享、應(yīng)用演示等環(huán)節(jié),助力開(kāi)發(fā)者探索萬(wàn)物智能的世界,期待與大家一起相聚線上直播間!

現(xiàn)在掃碼報(bào)名 我們將在報(bào)名者中抽取“幸運(yùn)參會(huì)者100名” 贈(zèng)送RT-Thread新款開(kāi)發(fā)板(即將揭秘)

d6952e38-7ba4-11ed-8abf-dac502259ad0.png

本次將在大會(huì)當(dāng)天在直播間宣布中獎(jiǎng)名單

更多獎(jiǎng)品即將來(lái)襲...

原文標(biāo)題:winUSB設(shè)備的開(kāi)發(fā)方法

文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1300

    瀏覽量

    40264

原文標(biāo)題:winUSB設(shè)備的開(kāi)發(fā)方法

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用AT-LINK的WinUSB功能提升下載速率?

    ,ICP會(huì)自動(dòng)彈窗更新固件至V2.0.0以上版本,點(diǎn)擊確定。1.3升級(jí)成功后ICP會(huì)自動(dòng)優(yōu)先連接WinUSB設(shè)備,沒(méi)有識(shí)別WinUSB才會(huì)連接HID。1.4對(duì)于WIN7系統(tǒng),還需要安裝驅(qū)動(dòng),WIN10則不
    發(fā)表于 12-30 14:26

    Verilog 測(cè)試平臺(tái)設(shè)計(jì)方法 Verilog FPGA開(kāi)發(fā)指南

    Verilog測(cè)試平臺(tái)設(shè)計(jì)方法是Verilog FPGA開(kāi)發(fā)中的重要環(huán)節(jié),它用于驗(yàn)證Verilog設(shè)計(jì)的正確性和性能。以下是一個(gè)詳細(xì)的Verilog測(cè)試平臺(tái)設(shè)計(jì)方法及Verilog FPGA開(kāi)
    的頭像 發(fā)表于 12-17 09:50 ?333次閱讀

    云端語(yǔ)言模型開(kāi)發(fā)方法

    云端語(yǔ)言模型的開(kāi)發(fā)是一個(gè)復(fù)雜而系統(tǒng)的過(guò)程,涉及數(shù)據(jù)準(zhǔn)備、模型選擇、訓(xùn)練優(yōu)化、部署應(yīng)用等多個(gè)環(huán)節(jié)。下面,AI部落小編為您分享云端語(yǔ)言模型的開(kāi)發(fā)方法。
    的頭像 發(fā)表于 12-02 10:48 ?165次閱讀

    ESP開(kāi)發(fā)板如何可以增量的設(shè)置設(shè)備編號(hào)嗎?

    比如A開(kāi)發(fā)板刷入固件時(shí)A開(kāi)發(fā)板會(huì)自動(dòng)設(shè)置設(shè)備編號(hào)為10001,B開(kāi)發(fā)板刷入同樣BIN固件時(shí)設(shè)備編號(hào)自動(dòng)為10002,這樣以此類推,以刷入的時(shí)
    發(fā)表于 07-02 06:56

    鴻蒙開(kāi)發(fā):應(yīng)用組件跨設(shè)備交互(流轉(zhuǎn))【多端協(xié)同】

    由于“多端協(xié)同任務(wù)管理”能力尚未具備,開(kāi)發(fā)者當(dāng)前只能通過(guò)開(kāi)發(fā)系統(tǒng)應(yīng)用獲取設(shè)備列表,不支持三方應(yīng)用接入。
    的頭像 發(fā)表于 06-13 10:42 ?868次閱讀
    鴻蒙<b class='flag-5'>開(kāi)發(fā)</b>:應(yīng)用組件跨<b class='flag-5'>設(shè)備</b>交互(流轉(zhuǎn))【多端協(xié)同】

    微波測(cè)試設(shè)備有哪些 微波測(cè)試方法有哪些

    微波測(cè)試設(shè)備方法在現(xiàn)代電子通信領(lǐng)域中扮演著至關(guān)重要的角色。微波測(cè)試設(shè)備方法的精確性直接影響到通信系統(tǒng)的性能和可靠性。本文將詳細(xì)介紹微波測(cè)試設(shè)備
    的頭像 發(fā)表于 05-27 15:40 ?870次閱讀

    使用Cypress驅(qū)動(dòng)的設(shè)備,無(wú)法通過(guò)libusb_open打開(kāi)設(shè)備怎么解決?

    而且Cypress的官方驅(qū)動(dòng)似乎跟 libusb 不兼容,因?yàn)槲沂褂?Cypress 驅(qū)動(dòng)的設(shè)備,無(wú)法通過(guò) libusb_open打開(kāi)設(shè)備,但是基于 winusb 的驅(qū)動(dòng)可以
    發(fā)表于 05-22 06:30

    訊飛星火API接入機(jī)體設(shè)備方法與代碼

    訊飛星火API接入機(jī)體設(shè)備方法與代碼
    的頭像 發(fā)表于 05-15 09:56 ?989次閱讀

    電力儀表在工廠車間設(shè)備電能管理系統(tǒng)的安裝方法

    基于車間用電設(shè)備的電能管理系統(tǒng)架構(gòu)思路及實(shí)施方法,從硬件和軟件方面對(duì)此方法進(jìn)行了闡述。對(duì)車間舊設(shè)備改造以及新的電能管理系統(tǒng)提供一種思路和便捷的方法
    的頭像 發(fā)表于 04-19 10:13 ?618次閱讀
    電力儀表在工廠車間<b class='flag-5'>設(shè)備</b>電能管理系統(tǒng)的安裝<b class='flag-5'>方法</b>

    HarmonyOS開(kāi)發(fā):【數(shù)字管家app設(shè)備接入FA】

    幫助開(kāi)發(fā)者快速將設(shè)備接入到數(shù)字管家,完成FA、服務(wù)端和設(shè)備的通信,實(shí)現(xiàn)數(shù)字管家對(duì)設(shè)備的命令控制、日程管理,以及設(shè)備對(duì)數(shù)字管家的主動(dòng)告警。
    的頭像 發(fā)表于 04-11 17:51 ?967次閱讀
    HarmonyOS<b class='flag-5'>開(kāi)發(fā)</b>:【數(shù)字管家app<b class='flag-5'>設(shè)備</b>接入FA】

    《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例

    一、概述(一)RT-Thread設(shè)備驅(qū)動(dòng)《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解RT-threadIO設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 02-24 08:16 ?1741次閱讀
    《RT-Thread<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>指南》基礎(chǔ)篇--以先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b>為例

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南基礎(chǔ)篇—以先楫bsp的hwtimer設(shè)備為例

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解RT-thread IO設(shè)備驅(qū)動(dòng)開(kāi)發(fā)方法,從三方面進(jìn)行講解
    的頭像 發(fā)表于 02-20 16:01 ?1758次閱讀
    RT-Thread<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>指南基礎(chǔ)篇—以先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b>為例

    軍用設(shè)備環(huán)境試驗(yàn)方法振動(dòng)試驗(yàn)

    電子發(fā)燒友網(wǎng)站提供《軍用設(shè)備環(huán)境試驗(yàn)方法振動(dòng)試驗(yàn).pdf》資料免費(fèi)下載
    發(fā)表于 02-02 10:20 ?1次下載

    鴻蒙OS 跨設(shè)備遷移

    的 Page 請(qǐng)求遷移。 HarmonyOS 處理遷移任務(wù),并回調(diào)設(shè)備 A 上 Page 的保存數(shù)據(jù)方法,用于保存遷移必須的數(shù)據(jù)。 HarmonyOS 在設(shè)備 B 上啟動(dòng)同一個(gè) Page,并回調(diào)其恢復(fù)數(shù)據(jù)
    的頭像 發(fā)表于 01-31 15:47 ?1170次閱讀

    N9H30 WinUSB4NuVCOM驅(qū)動(dòng)安裝失敗如何解決?

    根據(jù)官方《NUC970 N9H30 NuWriter User Manual CHT》文檔,在PC端(Win11)進(jìn)行WinUSB4NuVCOM驅(qū)動(dòng)安裝,整個(gè)安裝過(guò)程未提示任何錯(cuò)誤信息。但安裝完成后在設(shè)備管理模塊無(wú)法找到WinUSB
    發(fā)表于 01-17 06:42