精华内容
下载资源
问答
  • 通过USB来作数据传输的期间,可能会由硬件来检测若干错误现象。当然,通过驱动器、传送器以及缆线等的USB规范,所构建出的硬件,基本上发生错误的几率很小。因此,在稍前所介绍过,用来设计整合至USB数据交易协议的...
  • 本文着重介绍了该插座与上位机通信USB实现。为了将该插座的用途拓展到工业现场,文章对使用一种RS485到USB接口转换卡进行了初步探讨。  关键词:USB;RS-485;设备驱动程序;转换卡 1. 概述  现有的插座在...
  •  自动测试系统ATS(Automatic Test System)集成测试所需的全部激励与测量设备,计算机高效完成各种模式的激励及响应信号的采集、存储与分析,对被测单元进行自动状态监测、性能测试和故障诊断。总线是ATS的重要组成...
  • USB通信接口介绍

    2020-04-30 17:00:43
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...收起 /*********************************************************************** USB入门系列: 1、U...

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/go_str/article/details/80802452
    收起
    /***********************************************************************
    USB入门系列:

    1、USB行业标准介绍

    2、USB具体通讯过程

    3、USB中端点详细了解

    4、USB传输之控制传输

    …(待补充)

    ************************************************************************/

    前言
    现在刚开始接触USB的开发,零零散散学习了一些USB基础知识,但是却得不到连贯。在这个学习过程中首先困惑的就是USB通讯过程究竟是什么样子的,我觉得做一下的了解后整合后记录下来,首先从USB整体结构基础来入手直到整个通讯过程。可能有理解不到位的地方,望各位能够指正,我会及时改正。
    一、USB系统的结构
    USB系统是由三个逻辑层组成功能层USB设备层USB总线接口层。并且每一层都是由主机和USB设备不同的功能模块组成,如下图所示:

    1、功能层(接口)
    功能层是由客户软件和设备方的功能单元组成,其能够实现USB设备传输的特定功能。通过功能层可直观地理解USB传输的数据内容。其中,客户软件通过USB系统软件来与USB设备进行通信。功能单元对于客户软件,可视为接口的集合。

    2、USB设备层 (端点)
    USB设备层是由USB系统软件和USB设备的USB逻辑设备组成,其实现主机和USB设备之间传输的具体配置。USB逻辑设备对于USB系统软件,可视为端点的集合。

    3、USB总线接口层 
    USB总线接口层是由主机的USB主控制器和设备的USB总线接口组成。其实现主机和USB设备实际的数据传输。

    4、主机部分
    USB主机部分由客户软件、USB系统软件和USB总线接口组成。
    4.1 客户软件
    客户软件负责和USB设备的功能单元进行通信,以实现特定的功能。客户软件不能直接与USB设备相连接,必须通过USB系统软件和USB总线接口才能实现连接。客户软件包括USB设备驱动程序和界面应用程序两部分。

    4.2 USB系统软件
    USB系统软件负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据。一般包括USB总线驱动程序、USB主控制驱动程序和非USB主机软件三个部分,这部分会由系统提供。

    4.3 USB总线接
    USB总线接口包括主控制器和跟集线器两部分。其中,主控制器是负责完成主机和USB设备间的数据实际传输。根集线器是为USB系统连接起点。

    5、设备部分
    USB设备部分由三个功能模块组成,分别是USB总线接口、USB逻辑设备和功能单元。
    功能单元看作是一个接口的集合;USB 逻辑设备被USB系统软件看作一个端点的集合;USB总线接口是USB设备中的串行接口引擎(SIE)。

    当客户程序通过USB管道发送或接收数据时,它首先调用Win32 APl,调用最终将使功能驱动程序收到一个IRP。而驱动程序的工作就是把客户的请求引导到有正确端点的管道上。它把请求提交到总线驱动程序,总线驱动程序再把请求分解成多个事务,然后这些事务被送往总线。总线上的信息流以每毫秒一帧数据的形式流动。总线驱动程序必须安排好多个事务以使它们能被装入同一帧中。
    

    二、USB的拓扑结构
    USB是一种主从结构的系统。主机叫Host,从机叫做Device(也叫设备)。通常所说的主机具有一个或者多个USB主控制器(host controller)和根集线器(root hub)。主控制器主要负责数据处理,而跟集线器则提供一个连接主控制器与设备之间的接口和通路。
    通常情况下,PC机上有多个主控器和多个USB口,一个主控器下有一根集线器,一根集线器通常具有一个或者几个USB接口。通常集线器可以通过USB集线器来扩展USB接口,只是带宽是不能够拓宽的,因为带宽是共享一个USB主控器的。
    了解上面的信息后,再来看USB的拓扑结构如下图:

    USB的拓扑结构看起来是一个金字塔形的结构,具体构成如下:
    塔顶是USB的主控器和根集线器,下面接USB集线器,USB集线器将一个USB口扩展为多个USB口,多个USB口同样可以通过USB集线器扩展出更多的接口。不过USB口并不能通过USB集线器无止境的扩展,他是有限制的,例如在USB2.0规定它最多扩展6次。
    理论上一个USB主控器最多可接127个设备,这是因为协议规定每个USB设备具有一个7bit地址(取值范围为0~127,地址用于给主机识别是哪个设备,其中0地址值得注意,是给刚接入未初始化的设备使用的)。

    三、USB的设备架构
    设备架构认为设备是由一些配置、接口和端点构成的。其中配置和接口是USB功能的抽象,实际的数据传输由端点来完成。其对应关系如下图所示:

    1.设备 
    设备代表USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指出其所包含配置的个数。

    2.配置 
    在使用USB设备前,必须为其选择一个合适的配置。如USB设备的低功耗模式和高功耗模式分别对应一个配置。配置描述符用于说明USB设备中各个配置的特性。

    3.接口 
    一个配置可以包含一个或多个接口。接口是一个端点的集合。接口描述符用于说明USB设备中各个接口的特性。

    4.端点 
    端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。

    5、管道
    管道,是主机软件(数据缓冲区)和USB设备的各个端点之间的数据传输链接,它是两者之间通信流的抽象。然而,实际的数据传输是由USB总线接口层来完成的。管道和USB设备中的端点一一对应,并且各个管道的数据传输是相互独立的。
    管道有两种类型:流管道和消息管道。其中最为重要的消息管道是“缺省控制管道”,这个管道在设备开始上电后就存在了,它用于提供设备的配置与状态等信息。主机与设备之间的联络就是通过消息管道实现的。

    四、USB枚举与通信的具体过程
    1、USB接头
    下图是一个USB接头的结构图:

    由图可以看出,标准的USB链接线使用4芯电缆:5V电源线(Vbus)\差分数据线负(D-)、差分数据线正(D+)和地线(GND)。
    在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。
    

    2、USB通信过程
    主机和USB设备可以相互传输数据,其具体过程如下(以主机箱设备传输为例):
    step1:客户软件首先将要传输的数据放入缓冲区,同时向USB总线驱动程序发出IRPS,请求数据传输。(客户软件)step2:USB总线驱动接收到程序接收请求,并对数据进行处理,转化为具有USB格式的事务处理。(USB系统软件)
    step3:USB主控制器驱动程序将这些事务处理建立成事务列表,同时要求不能超过USB带宽。(USB系统软件)
    step4:USB主控制器读取到事务列表并将事务转化为信息包,发送到USB总线上。(USB总线接口)
    step5:USB设备收到这些信息后,SIE(USB总线接口是USB设备中的串行接口引擎)将其解包后放入指定端点的接收缓冲区内,由芯片固件对其进行处理。

    用框图表示如下:

    3、USB枚举通信具体过程
    枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

    枚举通信过程具体如下:
    step1:检测电压变化,报告主机
    首先,USB设备上电后,一直监测USB设备接口电平变化HUB检测到有电压变化,将利用自己的中断端点将信息反馈给主控制器有设备连接。

    Step2:主机了解连接设备
    主机在知道有设备接入后会发送一个Get_Port_Status请求(request)给hub以了解此次状态改变的确切含义。

    Step3:Hub检测所插入的设备是高速还是低速
    hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

    Step4:hub复位设备
    主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位其管理的端口(刚才设备插上的端口)。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不受影响。

    Step5: Host检测所连接的全速设备是否是支持高速模式
    因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。
    同样的,从设备的角度来看,如果是一个高速设备,在刚连接bub或上电时只能用全速信号模式运行(根据USB 2.0协议,高速设备必须向下兼容USB 1.1的全速模式)。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

    Step6:Hub建立设备和主机之间的信息通道
    主机不停地向hub发送Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。
    当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),准备接收主机发来的请求。设备和主机之间的通信通过控制传输,默认地址0,端点号0进行。此时,设备能从总线上得到的最大电流是100mA。(所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。)

    Step7:主机发送Get_Descriptor请求获取默认管道的最大包长度
    默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。
    设备描述符的第8字节代表设备端点0的最大包大小。虽然说设备所返回的设备描述符(Device Descriptor)长度只有18字节,但系统也不在乎,此时,描述符的长度信息对它来说是最重要的,其他的瞄一眼就过了。当完成第一次的控制传输后,也就是完成控制传输的状态阶段,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态。

    Step8:主机给设备分配一个地址
    主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

    Step9:主机获取设备的信息
    主机发送 Get_Descriptor请求到新地址读取设备描述符,这次主机发送Get_Descriptor请求可算是诚心,它会认真解析设备描述符的内容。设备描述符内信息包括端点0的最大包长度,设备所支持的配置(Configuration)个数,设备类型,VID(Vendor ID,由USB-IF分配), PID(Product ID,由厂商自己定制)等信息。
    之后主机发送Get_Descriptor请求,读取配置描述符(Configuration Descriptor),字符串等,逐一了解设备更详细的信息。事实上,对于配置描述符的标准请求中,有时wLength一项会大于实际配置描述符的长度(9字节),比如255。这样的效果便是:主机发送了一个Get_Descriptor_Configuration 的请求,设备会把接口描述符,端点描述符等后续描述符一并回给主机,主机则根据描述符头部的标志判断送上来的具体是何种描述符。
    接下来,主机就会获取配置描述符。配置描述符总共为9字节。主机在获取到配置描述符后,根据里面的配置集合总长度,再获取配置集合。配置集合包括配置描述符,接口描述符,端点描符等等。
    如果有字符串描述符的话,还要获取字符串描述符。另外HID设备还有HID描述符等。

    Step10: 主机给设备挂载驱动(复合设备除外)
    主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。 然后tell the world(announce_device)说明设备已经找到了,最后调用设备模型提供的接口device_add将设备添加到 usb 总线的设备列表里,然后 usb总线会遍历驱动列表里的每个驱动,调用自己的 match(usb_device_match) 函数看它们和你的设备或接口是否匹配,匹配的话调用device_bind_driver函数,现在就将控制权交到设备驱动了。
    对于复合设备,通常应该是不同的接口(Interface)配置给不同的驱动,因此,需要等到当设备被配置并把接口使能后才可以把驱动挂载上去。

    Step11:设备驱动选择一个配置
    驱动(注意,这里是驱动,之后的事情都是有驱动来接管负责与设备的通信)根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured),当然,设备也应该使能它的各个接口(Interface)。
    对于复合设备,主机会在这个时候根据设备接口信息,给它们挂载驱动。

    参考资料
    圈圈教你如何玩USB
    百度文库-USB工作过程:https://wenku.baidu.com/view/345ffa740a1c59eef8c75fbfc77da26925c596d8.html
    USB枚举过程:https://blog.csdn.net/MyArrow/article/details/8270029
    ————————————————
    版权声明:本文为CSDN博主「go_str」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/go_str/article/details/80802452

    展开全文
  • 导读:LPC1768 开发板可以使你快速建立起基于LPC...使用LPC1768为控制核心,配合高效的AD7656模/数芯片,构成采样数据带时标的实时采样系统,在工业实时监测系统中有十分广阔的应用前景。  二、LPC1768主要特性  L
  • Android USB设备通信--插拔监测

    千次阅读 2019-04-18 20:03:31
    电子秤和读卡器都可以通过usb口和pos通信。 设备插拔,系统广播 插入或者拔出usb设备时,Android系统都会发出广播,我们可以通过广播监听者BrocastReceiver监听相应的广播,进行相应的初始化或者资源释放。共有三种...

    电子秤和读卡器都可以通过usb口和pos通信。

    设备插拔,系统广播

    插入或者拔出usb设备时,Android系统都会发出广播,我们可以通过广播监听者BrocastReceiver监听相应的广播,进行相应的初始化或者资源释放。共有三种广播:

    • 设备插入广播

    • 设备授权广播

    • 设备播出广播

    public class UsbDeviceHelper extends BroadcastReceiver {
    		//android标准的广播action
        private static final String ACTION_USB_DEVICE_PERMISSION = "com.android.example.USB_PERMISSION";
    		@Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) return;
            String action = intent.getAction();
            if (TextUtils.isEmpty(action)) return;
            if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)){
            		//设备插入,获取这个插入的UsbDevice
                usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
               //向用户获取连接USB设备的授权
               requestUserPermission();
            }else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)){
            		//设备拔下,资源释放
            }else if (action.equals(ACTION_USB_DEVICE_PERMISSION)){
            		//获取连接设备的权限
                boolean isGranted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false);
                if (isGranted){
    						//用户已授权
                }else {
                //用户未授权
                }
            }
        }
        
        /**
         * 检测到设备插入之后,向用户请求连接设备的权限
         */
        private void requestUserPermission(UsbDevice usbDevice) {
            if (usbManager.hasPermission(usbDevice)){
                //已经有权限的话,直接初始化驱动
               	//判断已经授予权限
                return;
            }
            //发一个延时广播
            PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0,
                    new Intent(ACTION_USB_DEVICE_PERMISSION), 0);
            //这一句会由系统弹出对话框,向用户获取连接授权
            usbManager.requestPermission(usbDevice, mPendingIntent);
        }
        
        /**
         * 注册USB设备插拔事件监听
         */
        public void registerUsbEventReceiver(Context context){
                this.context = context.getApplicationContext();
                usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
                IntentFilter filter = new IntentFilter();
                filter.addAction(ACTION_USB_DEVICE_PERMISSION);
                filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
                filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
                this.context.registerReceiver(this, filter)}
    }
    

    在这里插入图片描述
    整体流程如上面流程图:

    • 设备插入,Android系统检测到后会发出一个广播。android系统检测到设备的插入,可能会花费1秒左右的时间;

    • BrocastReceiver监听到设备插入的广播,向用户获取连接设备的权限,弹出对话框,让用户选择是否连接。这样做是为了系统安全性,防止恶意的USB设备连接Android设备;

    • 用户授权完毕后,也会发出广播,授权结果可以通过Intent对象获取;

    • 用户授权允许连接,进行初始化,连接设备;

    • 用户未授权,不允许连接,提示用户。

    • 设备拔出,Android系统也可以检测到并发出一个广播,BrocastReceiver接收到广播后,进行资源释放,结束。

    至于BrocastReceiver,可以在用户登录成功后再进行注册,在应用退出时进行反注册。

    展开全文
  • 本文重点讨论USB通信协议及其接口芯片的控制方法,针对临床需求,设计实现了具有心电、血压智能监测和USB高速数据传输功能的小型化设备,提供心电、血压数据电子病历查询、打印和网络传输等功能,对于提高家庭健康...
  •  本文重点讨论USB通信协议及其接口芯片的控制方法,针对临床需求,设计实现了具有心电、血压智能监测和USB高速数据传输功能的小型化设备,提供心电、血压数据电子病历查询、打印和网络传输等功能,对于提高家庭健康...
  •  本文重点讨论USB通信协议及其接口芯片的控制方法,针对临床需求,设计实现了具有心电、血压智能监测和USB高速数据传输功能的小型化设备,提供心电、血压数据电子病历查询、打印和网络传输等功能,对于提高...
  • USB数据监控抓包软件BusHound_v6.0.1正式版, Bus Hound是由美国perisoft公司研制的一款超级软件总线协议分析器,它是一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名“hound”的中文意思为“猎犬”,即...
  • 安卓 USB通信

    2017-12-25 08:36:30
    >>建立USB通信,需要在设备端与配件端分别进行开发。 1 设备端:一般作为从机(因手机电池电量有限)。 2 配件端:将AOA协议烧进硬件芯片中;开发USB通信程序。 >>安卓配件(作为主机)端开发程序...

    /*android,accessory,protocol*/

    >>安卓设备:

    一般指以安卓为系统的设备,如安卓手机、安卓平板等。


    >>安卓配件:

    一般指与安卓设备通过USB连接的外围设备,如嵌入式开发板等(也可以是另一台安卓设备)。


    >>安卓开放配件协议(android open accessory protocol)

    简称AOA协议,就是支持安卓设备(安卓手机、安卓平板等)通过USB数据线与外围配件进行通信、互控等操作的协议。


    >>支持AOA的安卓系统版本:

    Android3.1(API Level 12)及其以上版本才支持AOA协议。


    >>安卓设备在AOA协议下的两种模式:

    1 主机模式:安卓设备为USB供电。

    2 从机模式:安卓挂件为USB供电。

    注:一般是主机主动检测USB配件并建立连接。


    >>建立USB通信,需要在设备端与配件端分别进行开发。

    1 设备端:一般作为从机(因手机电池电量有限)。

    2 配件端:将AOA协议烧进硬件芯片中;开发USB通信程序。


    >>安卓配件(作为主机)端开发程序需要具备4项功能:

    1 监测USB接口,等待与其连接的安卓设备。

    2 检测与其连接的安卓设备是否支持AOA协议。

    3 如有需要(当安卓设备已经启动USB配件模式,则不需要此步骤),启动安卓设备的USB配件模式(设置安卓设备为从机)。

    4 与安卓设备建立USB通信。


    >>具体编程实现可以查询libusb相关资料。

    展开全文
  •  本文重点讨论USB通信协议及其接口芯片的控制方法,针对临床需求,设计实现了具有心电、血压智能监测和USB高速数据传输功能的小型化设备,提供心电、血压数据电子病历查询、打印和网络传输等功能,对于提高家庭健康...
  • 摘 要:本文介绍了一种应用于家用心电血压监测仪与计算机进行高速数据传输的接口...传统的通信接口采用简单的RS-232串行UART ,这种方式速度慢且适用性差,而USB转串口芯片的传输性能不能得到根本改善。USB总线接口则
  • 主要是通过系统发广播来获取USB连接的状态,代码很简单 package com.test.socket.usb; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android....

    主要是通过系统发广播来获取USB连接的状态,代码很简单

    package com.test.socket.usb;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.UsbManager;
    import android.widget.Toast;
    
    public class USBReceiver extends BroadcastReceiver {
        private static final String TAG = "PiCalib usb";
        private final Activity ctx;
        private final String action;
        public static boolean mUsbConnectStatus = false;
    
        public USBReceiver(Activity mainActivity, String action) {
            this.ctx = mainActivity;
            this.action = action;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 这里可以拿到插入的USB设备对象
            UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    //registerReceiver()
            if (this.action.equals(intent.getAction())) {
                mUsbConnectStatus = intent.getExtras().getBoolean("connected");
                Toast.makeText(ctx,mUsbConnectStatus+",",Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    
    private final static String ACTION = "android.hardware.usb.action.USB_STATE";
    //注册广播!!!注意要activity退出的时候要反注册,我这里偷懒就不写了
        private void registerReceiver() {
            IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION);
            registerReceiver(new USBReceiver(this,ACTION), filter);
            //这里就能返回实时状态
            boolean mUsbConnectstatus = USBReceiver.mUsbConnectStatus;
        }
    

    这里有个小问题,我一直理解的是android.hardware.usb.action.USB_STATE这一条广播是在状态切换的时候才会发送广播,当然状态切换一定会发广播,但是在下列场景下,广播依然会发出来:

    1、在APP启动前,USB没有连接,APP启动后,注册动态广播,仍然没有连接USB线,这个广播还是会发送一次USB的状态,此时它是false
    2、在APP启动前,USB已经连接,APP启动后,注册动态广播,连接USB线,这个广播依然会发送一次USB的状态,此时它是true

    就是说不论有没有切换USB的状态,APP启动,注册了动态广播,它一定会发一条广播给app,也就是说你的APP确实是会拿到状态,我猜测是注册动态广播的时候,系统会给你的APP补发一条广播信息,仅仅是猜测,待后续我去验证

    接下来是QT程序中监测USB拔插状态

    1、头文件引用

    #include <QWidget>
    #include <windows.h>
    #include <QAbstractNativeEventFilter>
    #include <dbt.h>
    
    class ClassA: public QWidget
    {
        Q_OBJECT
    public:
        explicit ClassA(QWidget *parent = nullptr);
        ~ClassA();    
    protected:
        bool nativeEvent(const QByteArray &eventType, void *message, long *result);
    };    
    

    2、cpp文件实现

    ClassA::ClassA(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::TabFirmwareDownload)
    {
        qDebug()<<"ClassA::ClassA+++";
        ui->setupUi(this);
        RegisterHIVDeviceNotification();
        qDebug()<<"TabFirmwareDownload::TabFirmwareDownload ---";
    }
    //注册消息
    bool ClassA::RegisterHIVDeviceNotification()
    {
        HDEVNOTIFY hDeviceNotify;
        /*
         *这里注册的设备是  Human Interface Devices (HID) 类
         *GUID_DEVINTERFACE_HID = {4D1E55B2-F16F-11CF-88CB-001111000030}
        */
        GUID  guid_hiv = {0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30};
        DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
        HWND hWnd = (HWND)(this->winId()); //获取当前窗口句柄
        ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
        NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
        NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        NotificationFilter.dbcc_classguid = guid_hiv;
        hDeviceNotify = RegisterDeviceNotification (hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
    
        qDebug() << "hDeviceNotify: "<<hDeviceNotify ;
        if (NULL == hDeviceNotify)
            return false;
        else
            return true; //注册消息成功
    }
    bool ClassA::nativeEvent(const QByteArray &eventType, void *message, long *result)
    {
        Q_UNUSED(eventType);
        Q_UNUSED(result);
        MSG* msg = reinterpret_cast<MSG*>(message);
    //    qDebug() << "msg: "<<msg ;
        int msgType = msg->message;
        if(msgType == WM_DEVICECHANGE){
            switch(msg->wParam){
            case DBT_DEVICEARRIVAL:
                qDebug() << "插入 " ;
                break;
            case DBT_DEVICEREMOVECOMPLETE:
                qDebug() << "拔出 " ;
                break;
    
            }
        }
        return false;
    }
    

    这样就能在运行这个类后,usb拔插实时返回状态了,但是有一个问题,如果你的USB线先连接,再运行程序,这里是无法返回状态的!!!就得想其他办法了,例如程序运行,直接去尝试打开设备节点,

    展开全文
  • 使用Wireshark捕捉USB通信数据

    千次阅读 2017-11-15 22:07:00
    使用Wireshark捕捉USB通信数据 USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口支持设备的即插即用和热插...
  • 设计了一种车用电动天窗检测系统,完成了车用电动天窗的控制、位置、状态检测及判别,通过USB接口实现了PC机与STM32系统通信,并采用C#语言设计了系统PC端软件界面及USB通信程序主要控制天窗开启,设置天窗电机参数和...
  • 家用心电血压监测系统由采集记录设备和上位机电子病历管理系统组成,因此,需要解决数据传输方式问题。...
  • 自动测试系统ATS(Automatic Test System)集成测试所需的全部激励与测量设备,计算机高效完成各种模式的激励及响应信号的采集、存储与分析,对被测单元进行自动状态监测、性能测试和故障诊断。总线是ATS的重要组成...
  • 目前,主要有两种方法:一种是使用PC机通过PC机端口(如RS232、USB接口)或数据采集卡来采集数据同时提供网络接口[3],这种方法利用强大的PC机软件支持,容易实现网络通信功能,但是PC机端口资源有限,专用采集卡...
  • USB端口监测数据 BUSHOND

    热门讨论 2009-04-10 13:02:06
    可用于调试监测USB端口,无须安装,使用很方便
  • 基于CH375多通道USB接口与PC机通信的实现、电子技术,开发板制作交流
  • USB通信包标识字段PID

    2020-03-15 23:10:50
    特殊包 PID[3:0] 含义 PRE 1100B 主机发送的用于使能USB低速数据通信的令牌信息先导包 ERR 0100B 用于SPLIT事务中,表示错误握手信号 SPLIT 1000B 表示SPLIT事务的令牌信息 PING 0100B 用于数据流量监测控制
  • C# WPF USB 串口插入拔出识别监测

    千次阅读 2018-05-15 17:41:03
    注意与WinForm的USB串口识别不太一样,消息传递不一样,只能用引用窗口句柄的方式获取系统消息 private void Window_Loaded(object sender, RoutedEventArgs e) { //用于监听Windows消息 //注意获取窗口句柄...
  • USB具体通讯过程(含枚举过程)

    万次阅读 多人点赞 2018-06-25 15:21:36
    前言 现在刚开始接触USB的开发,零零散散学习了一些USB基础知识,但是却得不到连贯。在这个学习过程中首先困惑的就是USB通讯过程究竟是什么样子的,我觉得做一下简单的了解后记录下来,首先从USB整体结构基础来入手...
  • QT5 下 usb 设备插拔检测

    热门讨论 2015-12-09 18:20:13
    基于QT 5做的usb插拔检测,我主用是用于检测usbkey的(通过 VID,PID),其他设备应该也是可以的,测试过u盘,usb转串口线,usb key都能识别,
  • USB基本知识 概念:USB是一种通用串行总线。 USB系统:一定是由一个PC和外围设备组成。外设称为USB设备,PC为主机。主机里有USB主控制器,负责完成主机和USB设备之间的物理数据传输。USB主控制器分为两种,具体...
  • 项目开发中,在安装linux系统的ARM9板上,需要实时检测USB口与Windows客户端的连接和断开情况,从而中断命令的发送,由于USB的连接和数据交互使用的串口通讯,在板子启动的脚本就直接加载了g_serial.ko的模块,在dev...
  • 软件介绍: HID Test Tool用于测试hid和pc连接后的通信,连接Hid和电脑后,可测试HID输入输出信息,发送数据工具测试工具。
  • 为了对小型独立光伏发电装置进行状态监测.设计了一种基于LabVIEW和MSP430单片机的USB串口通信系统...用高精度的USB—UAKT桥接器CP2102将MSP430的UART0转换成USB口,通过USB电缆实现上层监测和下位控制器间的数据通信

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,123
精华内容 1,649
关键字:

usb通信监测