12 Ocak 2013 Cumartesi

Delphi ile USB port okuma/yazma


Mikrochip firmasının USB destekli çiplerini uzun zamandır kullanıyorum. Özellikle HID protokolü ile kullanıldığında, sürücü gerektirmeden, hızlı bir haberleşme sağlıyor. bunun için yazılması gereken kodu da bazı programlar sizin için üretiyor. Size de gelen dataları işlemek ve göndermek kalıyor.

Bu iş için benim kullandığım yazılım, Mecanique firmasının  EasyHID yazılımı.
Bu program, hem PIC için hem de PC tarafı için örnek kod üretiyor.




PIC tarafında üretilen kod için söylenecek fazla birşey yok. Yapmanız gereken; 
ProductID, VendorID ve data uzunluklarını belirlemek ve kodu oluşturmak.

Burada, easyHID tarafından oluşturulan, cUSBInterface ve cUSBInterfaceTypes dosyalarının ve mcHID.dll dosyasının, yazdığınız programla aynı klasörde olması gerekiyor. Uygulama derlendikten sonra, dll dosyasının olması yeterli. 

aşağıda, Delphi için oluşturulmuş, 8 byte data alıp gönderen bir kod örneği var. Sayfanın sonunda da, indirme linkini bulabilirsiniz.

HID kullanan diğer cihazları da, hazırladığınız yazılımla izleyebilirsiniz. Aşağıdaki uygulama, UPS bilgilerini, USB portundan okumakta ve ekrana yazmaktadır.


UPS'in Vendor ve product ID'lerini ve cihazdan gelen dataları, HID terminal yazılımı ile görebilirsiniz.
Bu bilgileri aldıktan sonra, yapmanız gereken; Vendor ve product ID'lerini, kodun başında tanımlamak ve USBEvent fonksiyonunda gelen bilgileri alıp işlemek.



----------------------------------------Örnek program kodu--------------------------------------------------

unit FormMain;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, OleCtrls, DBOleCtl, ComCtrls, VrControls, VrSlider;

const

   // input and out buffer size constants...
   BufferInSize  = 8;
   BufferOutSize = 8;
type

   // input and output buffers...
   TBufferIn = array[0..BufferInSize] of byte;
   TBufferOut = array[0..BufferOutSize] of byte;

   // main form
   TForm1 = class(TForm)
    LabelProductName: TStaticText;
    LabelVendorName: TStaticText;
    LabelUsbStat: TStaticText;
    Button3: TButton;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
   private
      FBufferIn:TBufferIn;
      FBufferOut:TBufferOut;
      function USBEvent(var Msg: TMessage): Boolean;
      function SendData: Boolean;
   public
   end;

var
  Form1: TForm1;

implementation

uses
   cUSBInterface,
   cUSBInterfaceTypes, Math;

const
   // vendor and product ID constants...
   VENDOR_ID  = $1234;
   PRODUCT_ID = 0001;

{$R *.DFM}

{
****************************************************************************
* Name    : Create                                                         *
* Purpose : Create the main form                                           *
****************************************************************************
}
procedure TForm1.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(USBEvent);
   Connect(Application.Handle);
end;
{
****************************************************************************
* Name    : Destroy                                                        *
* Purpose : Free the main form                                             *
****************************************************************************
}
procedure TForm1.FormDestroy(Sender: TObject);
begin
   Application.UnHookMainWindow(USBEvent);
end;
{
****************************************************************************
* Name    : USBEvent                                                       *
* Purpose : DLL message handler hook                                       *
****************************************************************************
}
function TForm1.USBEvent(var Msg: TMessage): Boolean;
var
   i: integer;
   DevHandle:cardinal;
   TextBuffer:array[0..255] of char;
begin
  result := False;
  if Msg.Msg = WM_HID_EVENT then
  begin
     case Msg.WParam of
        // a HID device has been plugged in...
        NOTIFY_PLUGGED :
        begin
           // is it our HID device...
           DevHandle := Msg.LParam; // handle of HID device in this message
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
           begin
              // add your code here, for example...
              GetProductName(DevHandle, TextBuffer, 256);
              LabelProductName.Caption := string(TextBuffer);
              GetVendorName(DevHandle, TextBuffer, 256);
              LabelVendorName.Caption := string(TextBuffer);
              LabelUsbStat.Caption := 'Plugged';
           end;
           result := true;
        end;

        // a HID device has been device removed...
        NOTIFY_UNPLUGGED :
        begin
           // is it our HID device...
           DevHandle := Msg.LParam; // handle of HID device in this message
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
           begin
              // add you code here
              LabelUsbStat.Caption := 'Unplugged';
           end;
           result := true;
        end;

        // a HID device has been attached or removed. This event is fired after
        // either NotifyPlugged or NotifyUnplugged.
        NOTIFY_CHANGED :
        begin
           // get the handle of the device we are interested in
           // and set it's read notification flag to true...
           DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID);
           SetReadNotify(DevHandle,true);
           result := true;
        end;

        // a HID device has sent some data..
        NOTIFY_READ :
        begin
           DevHandle := Msg.LParam; // handle of HID device in this message
           if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
           begin
               // read the data - remember that first byte is report ID...
               Read(DevHandle,@FBufferIn);
               // USB aygıttan gelen datalar burada işlenecek!
           end;
           result := true;
        end;
     end;
  end;
end;

//USB'ye data gönder
function TForm1.SendData: Boolean;
var r: boolean;
begin
   r := WriteEx(VENDOR_ID, PRODUCT_ID, @FBufferOut);
   result := r;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   FBufferOut[0] := 0;
   FBufferOut[1] := 80;
   FBufferOut[2] := 70;
   FBufferOut[3] := 1;
   FBufferOut[4] := 0;
   FBufferOut[5] := 0;
   FBufferOut[6] := 0;
   FBufferOut[7] := 0;

   SendData(); //Fbuufferout'a yazılanlar gönderilir
end;
end.
-----------------------------------------Program kodu--------------------------------------------------






delphi kod örneği

Hiç yorum yok:

Yorum Gönder