设备读写通用对象 Delphi下创建

Delphi读取Usb设备所属端口 笔者近期做的项目,要求能够读取到Usb设备连接电脑的端口序号。usb设备指Android平板、手机等类似安卓的设备。设备通过UsbHub连接到电脑上也需要能够读取。类似Windows设备管理中的“位置路径”,如下图所示: 尝试了很多种方法,比如:WMI、SetupApi、注册表等,都以失败告终。都只能读取到一些基础的设备信息,始终无法获取到具体哪个端口。后来在注册表中翻找的过程中,发现某一项:LocationInfo与设备管理中的“位置路径”完全一致,通过分析总结出得到... 阅读详情

因为要在delphi下读写USB设备,而ReadFile和WriteFile同步是很麻烦的事,同时在主线程里操作这两个读写函数也不合适。在DELPHI下搞过串口编程的很多人知道有名的SPCOMM控件,其实只要稍稍对SPCOMM改进一下就可以读写任何设备文件了(当然你要提供设备的符号名SymbolicName),如果是串口当然还是“COM1,COM2...”,如果是其他设备就需要在注册表里查找以下了,例如我知道我的USB设备的GUID是“{7cbbad7c-3873-476b-a122-1e8e1a7ec66a}”,查找一下,马上可以找到它的符号名“//?/Root#NEWDEVICECLASS#0004#{7cbbad7c-3873-476b-a122-1e8e1a7ec66a}”。在对象的UsbName属性里输入上面的符号名,同时保留了OnReceiveData,OnRequestHangup两个事件属性。更多说明还是看实现代码吧。

{

PROPERTY
========
你自己看吧

METHOD
======

  procedure StartUsb

      Start a Usbunication for this Usb port.
      If failure, raise EUsbsError exception and EUsbsError.Message contain
      following string:
          'This usb already opened'
          'Error opening usb'
          'File handle is not a Usb handle'
          'Cannot setup Usb buffer'
          'Unable to create event'
          'Unable to create read thread'
          'Unable to create write thread'

  procedure StopUsb

      Stop and end all Usbunication threads for this Usb port.
      No any return.

  function WriteUsbData( pDataToWrite: PChar;
                          dwSizeofDataToWrite: Word ): Boolean

      Send a String to the Write Thread to be written to the Usb.
      This subroutine will return immediately. The send operation will
      do in background.
      Parameters:
          pszStringToWrite     - string to Write to Usb port.
          nSizeofStringToWrite - length of pszStringToWrite.
      Return:
          TRUE : if the PostMessage to write thread is successful.
          FALSE: if PostMessage fails or Write thread doesn't exist.

 
EVENT HANDLER
=============

  OnReceiveData : procedure (Sender: TObject;
                             Buffer: Pointer;
                             BufferLength: Word) of object

      When The input buffer contains received data
      the event handler is called
      Sender : point to TUsb object which raise this call
      Buffer : the buffer which contains received data
      BufferLength : the size of received data in Buffer


LEGALITIES
==========

This component is totally free (along with source code).

James Deng     http://blog.youkuaiyun.com/yueyahe  dyong0329@sina.com

}

unit SPUsb;
// This Usbunications Component is implemented using separate Read and Write
// threads. Messages from the threads are posted to the Usb control which is
// an invisible window. To handle data from the usb port, simply
// attach a handler to 'OnReceiveData'. There is no need to free the memory
// buffer passed to this handler. If TAPI is used to open the usb port, some
// changes to this component are needed ('StartUsb' currently opens the usb
// port). The 'OnRequestHangup' event is included to assist this.
//   
// James Deng
// 04/03/2006
// DYong0329@sina.com

//   ****Special Note:this unit SPUsb adapt From SPCOMM ****//

interface

uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

const
     // messages from read/write threads
     PWM_GOTUSBDATA = WM_USER + 1;
     PWM_REQUESTHANGUP = WM_USER + 2;

     PWM_SENDDATAEMPTY = WM_USER + 5;
type
    EUsbsError = class( Exception );
    TReceiveDataEvent = procedure(Sender: TObject; Buffer: Pointer;
                                  BufferLength: Word) of object;
type
    TReadThread = class( TThread )
    protected
      procedure Execute; override;
    public
      hUsbFile:          THandle;
      hCloseEvent:        THandle;
      hUsb32Window:      THandle;

      function SetupReadEvent( lpOverlappedRead: POverlapped;
                               lpszInputBuffer: LPSTR; dwSizeofBuffer: DWORD;
                               var lpnNumberOfBytesRead: DWORD ): Boolean;
      function HandleReadEvent( lpOverlappedRead: POverlapped;
                                lpszInputBuffer: LPSTR; dwSizeofBuffer: DWORD;
                                var lpnNumberOfBytesRead: DWORD ): Boolean;
      function HandleReadData( lpszInputBuffer: LPCSTR; dwSizeofBuffer: DWORD ): Boolean;
      function ReceiveData( lpNewString: LPSTR; dwSizeofNewString: DWORD ): BOOL;

      procedure PostHangupCall;
    end;

    TWriteThread = class( TThread )
    protected
      procedure Execute; override;
      function HandleWriteData( lpOverlappedWrite: POverlapped;
                                pDataToWrite: PChar; dwNumberOfBytesToWrite: DWORD): Boolean;
    public
      hUsbFile:          THandle;
      hCloseEvent:        THandle;
      hUsb32Window:      THandle;
      pFSendDataEmpty:    ^Boolean;
      procedure PostHangupCall;
    end;

    TSPUsb = class( TComponent )
    private
      { Private declarations }
      ReadThread:         TReadThread;
      WriteThread:        TWriteThread;
      hUsbFile:          THandle;
      hCloseEvent:        THandle;
      FHWnd:              THandle;
      FSendDataEmpty:     Boolean;            // True if send buffer become empty

      FUsbName:          String;
      FOnReceiveData:     TReceiveDataEvent;
      FOnRequestHangup:   TNotifyEvent;
      procedure UsbWndProc( var msg: TMessage );

    protected
      { Protected declarations }
      procedure CloseReadThread;
      procedure CloseWriteThread;
      procedure ReceiveData(Buffer: PChar; BufferLength: Word);

      procedure RequestHangup;
    public
      { Public declarations }
      property Handle: THandle read hUsbFile;
      property SendDataEmpty : Boolean read FSendDataEmpty;//? will be del
      constructor Create( AOwner: TComponent ); override;
      destructor Destroy; override;
      procedure StartUsb;
      procedure StopUsb;
      function WriteUsbData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean;
    
    published
      { Published declarations }
      property UsbName: String read FUsbName write FUsbName;
      property OnReceiveData: TReceiveDataEvent
               read FOnReceiveData write FOnReceiveData;

      property OnRequestHangup: TNotifyEvent       {挂起通知}
               read FOnRequestHangup write FOnRequestHangup; 
    end;

const
// This is the message posted to the WriteThread
// When we have something to write.
     PWM_USBWRITE = WM_USER+3;

// Default size of the Input Buffer used by this code.
     INPUTBUFFERSIZE = 4096;// 4k

procedure Register;

implementation

(******************************************************************************)
//   TSPUsb PUBLIC METHODS
(******************************************************************************)

constructor TSPUsb.Create( AOwner: TComponent );
begin
     inherited Create( AOwner );

     ReadThread := nil;
     WriteThread := nil;
     hUsbFile := 0;
     hCloseEvent := 0;
     FSendDataEmpty := True;

     //You can Find this string from Regester
     FUsbName := '//?/ROOT#WAHBOOK#0000#{7cbbad7c-3873-476b-a122-1e8e1a7ec66a}';

{AllocateHWnd(WndProc)创建一个看不见的窗口,返回他的句柄,并指定WndProc为窗口的消息处理过程}
     if not (csDesigning in ComponentState) then
        FHWnd := AllocateHWnd(UsbWndProc) 
end;

destructor TSPUsb.Destroy;
begin
     if not (csDesigning

Delphi USB HID 设备控制示例 在计算机和电子设备的世界中,USB(通用串行总线)技术因其快速、高效和易用性而被广泛采用。本章将介绍USB HID(人机接口设备)协议,这是USB应用领域中一个特别重要的协议,它定义了计算机和人机交互设备之间的通信标准。USB通信协议是一种广泛使用的通用串行总线标准,它定义了设备如何通过USB接口进行数据传输。USB有几种不同的版本,比如USB 1.1、2.0、3.0等,它们在速度和功能上有显著差异。Delphi通过API可以支持大部分USB版本,开发者需要根据实际硬件选择合适的USB版本进行开发。 阅读详情

相关推荐

Delphi 7 USB HID设备交互组件HIDController

人机接口设备(HID)是一种允许用户与计算机系统进行交互的设备。HID设备设计用来提供直观的输入,例如键盘、鼠标、游戏手柄等。这类设备通过减少设备与操作系统之间的交互,使得设备的操作更加简单快速。Delphi 7是Borland公司(现为Embarcadero Technologies)在2002年发布的一个稳定的RAD(Rapid Application Development)开发环境,它凭借其VCL(Visual Component Library)和高效的编译器著称。

weixin_30205153的博客 1019

Delphi实现的磁卡读写器源代码解析

磁卡读写器是一种广泛应用于金融、交通、门禁等领域的设备,它能够读取和写入磁卡上的信息。磁卡读写器的工作原理基于磁性数据存储技术,通过磁头与磁条间的相对运动来完成数据的读写过程。Delphi是一种强大的编程语言,它以Pascal语言为基础,拥有面向对象的特性,易于学习且功能丰富。Delphi在早期被广泛用于开发Windows桌面应用程序,因其高效的编译器和丰富的组件库而备受青睐。现代的Delphi支持跨平台开发,能够创建适用于Windows、macOS、Linux甚至是移动平台的应用程序。

weixin_42602241的博客 968

Delphi RFID IC读写器源代码与应用

在Delphi中,类是一种数据结构,用来定义对象的属性(字段)、方法(函数和过程)、事件和嵌套类型。类的定义通常以关键字type开始,遵循class关键字。以下是创建一个简单的Delphi类的基本语法:typeprivate// 私有字段和方法public// 公共字段和方法end;这里的private和public关键字分别用于指定类成员的访问级别。射频识别(RFID)技术是一种非接触式的自动识别技术。它通过无线电频率自动识别目标对象并获取相关数据。

weixin_32389853的博客 867

Delphi 11实现的DICOM文件处理库

Delphi 11是一个强大的集成开发环境(IDE),用于快速开发企业级应用程序,支持跨平台开发,使得开发人员能够为Windows, macOS, Linux, iOS和Android等多个平台编译应用。它不仅提供了丰富的组件和库,还内置了调试和性能分析工具,帮助开发者在构建过程中实现高效和高质量。在Delphi 11中,开发者能够利用其内置的FireMonkey(FMX)框架和VCL(Visual Component Library)来开发具有高度视觉保真的用户界面。

weixin_42576186的博客 833

Delphi串口通信项目实战指南

Delphi,作为快速开发应用的集成开发环境(IDE),以其编译速度快、编译代码执行效率高和易于使用而闻名。它使用Object Pascal语言,为开发者提供了强大的组件和框架支持,使其在桌面应用程序开发领域长期占据一席之地。在Delphi中,对象的创建遵循面向对象编程(OOP)的原则。我们首先定义一个串口通信对象的类,这个类将包含串口通信所需的所有属性和方法。通过使用TObject作为基类,我们可以扩展出适合我们通信需求的类。例如:typeprivate// 其他私有成员。

weixin_42360846的博客 1026

Delphi串口通信开发必备工具:SPComm控件详解

串口通信是一种常见的设备间数据交换方式,广泛应用于工业控制、数据采集、仪器仪表等领域。Delphi作为一款高效的Windows应用程序开发语言,凭借其强大的可视化设计能力和丰富的组件支持,成为串口编程的理想选择。在Delphi平台中,SPComm控件作为实现串口通信的核心组件,提供了简便的接口与稳定的通信机制,极大简化了开发流程。本章将引导读者理解串口通信的基本原理,并初步认识Delphi开发环境及其在串口编程中的优势,为后续章节中SPComm控件的深入使用奠定坚实基础。SPComm 控件通过。

weixin_42514750的博客 969

安全删除(断开)U盘获取其他移动储存设备的DELPHI源码

通过封装系统API,实现和“安全删除硬件”相同的功能。

delphi 的USB设备读写(HID)

delphi 整理的一个 HID 硬件的USB接口的读写程序,经过delphi6 windows2003测试通过。

usb编程delphi源代码示例

用delphi开发的一个USB小应用,下载免积分

DELPHI 做的USB调用

学习用,需要的下载吧 function Open(usbguid:String) :boolean; //打开USB设备 procedure Close(); //关闭USB设备 procedure WriteBytes(bs:TDataBuffer); //向USB设备发送字节数组 function ReadBytes():TDataBuffer; //从USB设备读取数据

Delphi读取Usb设备所属端口(UsbView)

能够读取到Usb设备连接电脑的端口序号。usb设备指Android平板、手机等类似安卓的设备。设备通过UsbHub连接到电脑上也需要能够读取。类似Windows设备管理中的“位置路径”。

USB.rar_Delphi-USB_USB delphi_delphi usb_setupapi.pas_usb

USB设备扫描程序,使用DELPHI开发

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 246

Python声音识别实战:从音频处理到智能分类

本文详细介绍了使用Python进行声音识别的完整实战流程。从音频预处理、特征提取(如MFCC)到构建分类模型(SVM、CNN),并最终实现一个实时环境音分类器。文章以Python为核心工具,结合librosa等库,为开发者提供了从理论到实践的清晰路径,适用于智能家居、工业监测等多种应用场景。

weixin_29064009的博客 324

浪潮服务器ESXI6.7部署实战:手动集成RAID驱动避坑指南

本文详细介绍了在浪潮服务器上部署ESXI6.7时手动集成RAID驱动的完整流程和避坑指南。从驱动获取、解压技巧到封装实战,逐步解决国产服务器常见的驱动缺失问题,特别针对PM8060 RAID卡提供具体解决方案,帮助IT运维人员顺利完成ESXI部署。

weixin_33725722的博客 461

从音频录制到智能手表:Sigma-Delta ADC是如何在低功耗场景下‘欺骗’噪声的?

本文深入解析Sigma-Delta ADC在智能穿戴设备中的低功耗高精度实现原理,重点介绍其通过过采样和噪声整形技术‘欺骗’噪声的独特方法。以TWS耳机和医疗级健康监测为例,展示该技术如何在有限功耗预算下实现专业级信号采集,为消费电子设计提供关键解决方案。

weixin_30825581的博客 389

sphincs+ Nist Round3文档中文译版(SPHINCS+ Submission to the NIST post-quantum project, v.3)

1. 引言 哈希基础签名方案最初是由Lamport [14]在1970年代后期作为一次性签名方案开发的,并由Merkle [16]扩展为多次签名方案。这些方案的安全性易于分析,并仅依赖于所使用的哈希函数的属性。然而,Merkle基于树的签名方案需要在密钥生成时就确定要进行签名的数量,且为了保持性能这个数字要小。最重要的是,该系统需要用户记住一个状态:这个状态包含一些信息以记住密钥已经进行了多少次签名。 在Lamport方案诞生后的40年里,产生了许多想法改进了哈希基础签名的性能、实用性和理论基础,最终XMS

dedanddwb的博客 394

总结个人关于雷达样式的见解(脉内脉间调制)

概述 雷达有各种各样的脉内脉间调制样式,对于雷达的设计者来说,不外乎三个目的: 1、增加雷达性能,如提高测距精度,增大侦察距离等; 2、雷达的工作机制决定雷达必须采用此种样式的调制,如有些SAR雷达为保证径向测距精度,需要使用脉内宽带调制信号; 3、降低雷达被电子战装备截获的概率,也就是LPI设计。 对于雷达对抗方,则只会观察到信号存在脉内及脉间的调制。对于一般的雷达信号,通常只采用脉内调制,脉间频率调制,脉间PRI调制。 脉间调制类型 1、PD雷达的脉间特征 雷达进行脉间调制的主要是PRI..

年糕的博客 3万+

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 145

NVIDIA Isaac GR00T N1 入门教程(一) 人形机器人多模态大语言模型

英伟达™ Isaac GR00T N1 是世界上首个用于通用仿人机器人推理和技能的开放式基础模型。该跨体模型采用多模态输入(包括语言和图像)在不同环境中执行操作任务。GR00T N1 在一个庞大的仿人机器人数据集上进行训练,该数据集包括真实捕获数据、使用英伟达 Isaac GR00T Blueprint 组件生成的合成数据(神经生成轨迹示例)以及互联网规模的视频数据。通过后期训练,它可以适应特定的应用、任务和环境。

2506_90492529的博客 3049

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: GDB调试技术
下一篇: 对VC中有关数据类型转换的整理
yueyahe
博客等级 码龄26年 15粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值