PDA

View Full Version : ارتباط با پورت USB



smt1383
چهارشنبه 29 خرداد 1387, 10:11 صبح
با سلام خدمت دوستان

من می خواهم که توسط دلفی با پورت USB ارتباط برقرار کنم. آیا می توانید مرا راهنمایی کنید. البته کامپوننت
nrcomm_lib را دانلود کرده ام اما چون نسخه آزمایش است کار نمی کند.
آیا دوستان کامپوننت یا نمونه برنامه ای برای ارسال و دریافت اطلاعات به پورت USB سراغ دارند؟

خیلی ممنون

smt1383
شنبه 01 تیر 1387, 10:55 صبح
واقعاً تا حالا کسی از دوستان با USB کار نکرده ؟

Mah6447
شنبه 01 تیر 1387, 13:09 عصر
http://barnamenevis.org/forum/showthread.php?t=59112

برای اطلاع از وضعیت ارتبات یواس بی ( Detect Usb ) :


// Component to detect when usb devices are connected or disconnected
// using RegisterDeviceNotification

unit U_Usb;

interface

uses
Windows, Messages, SysUtils, Classes, Forms;

type

PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;

PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
DEV_BROADCAST_DEVICEINTERFACE = record
dbcc_size: DWORD;
dbcc_devicetype: DWORD;
dbcc_reserved: DWORD;
dbcc_classguid: TGUID;
dbcc_name: short;
end;

const
GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

type

TComponentUSB = class(TComponent)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
procedure WndProc(var Msg: TMessage);
function USBRegister: Boolean;
protected
procedure WMDeviceChange(var Msg: TMessage); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
end;

implementation

constructor TComponentUSB.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then
begin
try
WMDeviceChange(Msg);
except
Application.HandleException(Self);
end;
end
else
Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var
devType: Integer;
Datos: PDevBroadcastHdr;
begin
if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
begin
Datos := PDevBroadcastHdr(Msg.lParam);
devType := Datos^.dbch_devicetype;
if devType = DBT_DEVTYP_DEVICEINTERFACE then
begin // USB Device
if Msg.wParam = DBT_DEVICEARRIVAL then
begin
if Assigned(FOnUSBArrival) then
FOnUSBArrival(Self);
end
else
begin
if Assigned(FOnUSBRemove) then
FOnUSBRemove(Self);
end;
end;
end;
end;

function TComponentUSB.USBRegister: Boolean;
var
dbi: DEV_BROADCAST_DEVICEINTERFACE;
Size: Integer;
r: Pointer;
begin
Result := False;
Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
ZeroMemory(@dbi, Size);
dbi.dbcc_size := Size;
dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
dbi.dbcc_reserved := 0;
dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
dbi.dbcc_name := 0;

r := RegisterDeviceNotification(FWindowHandle, @dbi,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if Assigned(r) then Result := True;
end;

end.

saleh_fartash
شنبه 01 تیر 1387, 20:45 عصر
برای این کار این کامپوننت رو می ذارم.
موفق باشی.

smt1383
یک شنبه 02 تیر 1387, 08:28 صبح
ممنون از راهنمکایی دوستان
می روم که آزمایش نمایم

smt1383
یک شنبه 02 تیر 1387, 14:13 عصر
آقا صالح. ممنون از کامپوننتی که گذاشته بودبد.
نمی دانم آیا شما خودتان با آن کار کرده اید یا نه ؟
چون من کامپوننت را نصب کردم و برنامه نمونه انرا اجرا کردم اما حتی دستگاه متصل به پورت یو اس بی را هم نمی شناسد چه برسد به ارسال و دریافت دیتا.
آیا می توانید کمی راهنمایی کنید.
بسیار ممنون.

HAMIDyekta
سه شنبه 20 خرداد 1393, 10:34 صبح
شما با این کامپوننت می تونید شناسایی کنید ببیند که یو اس بی متصل شد یا نه؟
جهت ارسال و دریافت اطلاعات پس از شناسایی درایو یو اس بی متصل شده می بایست ارسال و دریافت را خودتان با دلفی طراحی کنید بر اساس آنچه که نیاز دارید
با این تابع می توانید لیست یو اس بی های فعال را لیست کنید.
Function RemovableDrive: string;
var
Drive: Char;
d:String;
begin
d:='';
for Drive := 'A' to 'Z' do
if (Windows.GetDriveType(PChar(Drive + ':\')) = Windows.Drive_Removable) then
d:=d+Drive;
Result:=d;
end;