〔 BASICインタプリタのためのUSBポート制御プログラム[ USBcnct.dll / CallHspUSB.dll ] 〕 |
"USBcnct.dll"は、テクノキット社のUSB−IOを、【(仮称)十進BASIC】からの制御を可能にするドライバです。 使用法は同梱のBASICファイルを見てください。 "CallHspUSB.dll"は、同USB−IOを、HSP用として公開されている"hspusbio.dll"を汎用に利用できるドライバです。 一般的な高級言語から利用できます。 |
(仮称)十進BASICについて ⇒ |
USBcnct.dllについて ⇒ |
USBcnct.dllソースリストについて ⇒ |
hspusbio.dllについて ⇒ |
callhspusb.dllについて ⇒ |
callhspusb.dllソースリストについて ⇒ |
(仮称)十進BASICについて |
↑先頭へ戻る |
USBcnct.dll |
↑先頭へ戻る |
hspusbio.dll |
↑先頭へ戻る |
callhspusb.dll |
↑先頭へ戻る |
ソースリスト |
USBcnct.dllのソースリスト(一部) | |
unit HIDCall; { Copyright(c) Kato Yasuhisa 2011 } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, JvHidControllerClass, ExtCtrls; type TReport=record ReportID:Byte; data:array [0..7] of Byte; end; TMainForm = class(TForm) HidCtl: TJvHidDeviceController; Edit1: TEdit; Timer1: TTimer; Edit2: TEdit; Label1: TLabel; Label4: TLabel; Label5: TLabel; Edit3: TEdit; Label2: TLabel; Label3: TLabel; procedure FormActivate(Sender: TObject); procedure HidCtlDeviceChange(Sender: TObject); procedure Timer1Timer(Sender: TObject); public Activated: Boolean; end; const myvid=$12ED ; //テクノキット VID=$12ED mypid=$1003 ; //テクノキット PID=$1003 var MainForm: TMainForm; HidData:TReport; MyDev:TJvHidDevice ; rddata:integer ; implementation {$R *.dfm} procedure TMainForm.FormActivate(Sender: TObject); begin if not Activated then Activated := True ; end; procedure TMainForm.HidCtlDeviceChange(Sender: TObject); begin MyDev.Free ; Edit3.Text:=' 切断' ; Edit1.Text:='' ; while HidCtl.CheckOut(mydev) do begin if (MyDev.Attributes.VendorID=myvid)and(MyDev.Attributes.ProductID=mypid) then begin MyDev.NumInputBuffers := 128; MyDev.NumOverlappedBuffers := 128; Edit3.Text:=' 接続' ; exit ; end; end; end; function bytefromstr(s:string):byte ; var l,ll:string[4] ; cc:array[0..4] of char absolute l ; i:byte ; begin l:=s ; ll:='' ; if l='' then begin bytefromstr:=0 ; exit end ; for i:=1 to length(l) do if cc[i] in ['0'..'9'] then ll:=ll+cc[i] ; if ll='' then begin bytefromstr:=0 ; exit end ; bytefromstr:=strtoint(ll) ; end ; procedure USBOpen ; stdcall ; export ; begin MainForm:=tMainForm.Create(Application); MainForm.Show; end ; procedure USBWrite(d:integer) ; stdcall ; export ; var written:dword ; b,i:integer ; s:string ; begin if mydev=nil then exit ; if d in [0..255] then b:=d else b:=255 ; case b of 0..9:s:=' '+inttostr(b)+'D' ; 10..99:s:=' '+inttostr(b)+'D' ; 100..255:s:=' '+inttostr(b)+'D' ; end ; MainForm.Edit1.Text:=s ; with Hiddata do begin ReportID:=0 ; data[0]:= 1 ; data[1]:= b ; for i:=2 to 7 do data[i]:= 0 ; end ; if mydev.OpenFile then begin myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written); mydev.CloseFile ; end ; with Hiddata do begin ReportID:=0 ; data[0]:= 2 ; data[1]:= 15 ; for i:=2 to 7 do data[i]:= 0 ; end ; if mydev.OpenFile then begin myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written); mydev.CloseFile ; end ; end ; function ReadUSBPort:integer ; var written:dword ; rslt:boolean ; i:integer ; begin if mydev=nil then begin ReadUSBPort:=-1 ; exit ; end ; if mydev.OpenFile then begin with Hiddata do begin ReportID:=0 ; data[0]:=4 ; // Port-Bを指定 data[1]:=15 ; // Port-BをHに for i:=2 to 7 do data[i]:= 0 ; end ; myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written); with Hiddata do begin ReportID:=0 ; data[0]:= 4 ; // Port-Bを指定 data[1]:=15 ; // Port-BをHに for i:=2 to 7 do data[i]:= 0 ; end ; rslt:=myDev.ReadFile(HidData, mydev.Caps.OutputReportByteLength,Written); rslt:=myDev.ReadFile(HidData, mydev.Caps.OutputReportByteLength,Written); if rslt then ReadUSBPort:=HIDdata.data[1] else ReadUSBPort:=-1 ; mydev.CloseFile ; end ; end; function USBRead(d:integer):integer ; begin USBRead:=ReadUSBPort ; end ; procedure USBClose ; begin mydev.Free ; end ; procedure TMainForm.Timer1Timer(Sender:TObject); var s:string ; r:integer ; begin r:=ReadUSBPort ; s:='' ; if r in [0..255] then begin case r of 0..9: s:=' '+inttostr(r)+'D' ; 10..99: s:=' '+inttostr(r)+'D' ; 100..255: s:=' '+inttostr(r)+'D' ; end ; Edit2.Text:=s ; end ; end; exports USBOpen , USBWrite , USBRead , USBClose ; end. |
↑先頭へ戻る |
ソースリスト | 十進BASICによるUSB-IO制御法はこちらへ |
callhspusb.dllのソースリスト | |
unit CallHspdll; interface uses Dialogs ; function Usbfind:integer ; stdcall; function UsbOut(p,d:integer) : integer ; stdcall; function UsbInp(p:integer):integer ; stdcall; function UsbClose : integer ; stdcall; implementation function FUsbFind(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_find@16'; function FUsbOut(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_out@16'; function FUsbInp(var p1:integer; p2,p3,p4:integer):shortint; stdcall; external 'hspusbio.dll' name '_uio_inp@16'; function FUsbClose(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_free@16'; function Usbfind:integer ; var r:integer ; begin r:=FUsbFind(0,0,0,0) ; case r of {0:showmessage('正常に起動') ;} -1:showmessage('必要なドライバ(HSPUSBIO.DLL)が見つかりません'); -2:showmessage('USB-IOが接続されていません'); end; Usbfind:=r ; end ; function UsbOut(p,d:integer) :integer ; var r:integer ; begin if not(p in [0..1]) then begin showmessage('出力ポートは0または1です') ; UsbOut:=-1 ; exit ; end ; if not(d in [0..255]) then begin showmessage('出力データは0〜255の間です') ; UsbOut:=-1 ; exit ; end ; r:=Usbfind ; if r<0 then begin UsbOut:=-1 ; exit ; end ; r:=FUsbOut(p,d,0,0) ; if r =-1 then showmessage('異常終了しました'); UsbOut:=r ; end ; function UsbInp(p:integer):integer ; var r,d:integer ; begin if not(p in [0..1]) then begin showmessage('入力ポートは0または1です') ; UsbInp:=-1 ; exit ; end ; r:=Usbfind ; if r<0 then begin UsbInp:=-1 ; exit ; end ; r:=FUsbInp(d,p,0,0) ; {FUsbInp関数パラメータ:値を返す変数(ポインタ型),ポート番号,0,0} case r of -1:begin showmessage('命令を実行できませんでした') ; UsbInp:=0 ; exit ; end ; -2:begin showmessage('データの取得に失敗しました') ; UsbInp:=0 ; exit ; end ; end ; UsbInp:=d and 255 ; end ; function UsbClose : integer ; begin FUsbClose(0,0,0,0) ; UsbClose:=0 ; end ; exports Usbfind name 'Usbfind', UsbOut name 'UsbOut', UsbInp name 'UsbInp', UsbClose name 'UsbClose' ; end. |
↑先頭へ戻る |