Hej
Jeg er igang med at lave et program til min com port men nu står jeg med et lille problem.. Er der en måde hvorpå jeg kan læse fra porten hvis der kommer noget nyt data til mit program? Det skal nok være uden timer for hvis den køre hele tiden fryser man jo programmet? Så regner med at det har noget at gøre med Thread..
Her er min kode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ConfigPort: TButton;
SendData: TButton;
GetData: TButton;
RecivedData: TEdit;
procedure ConfigPortClick(Sender: TObject);
procedure SendDataClick(Sender: TObject);
procedure GetDataClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ComFile: THandle;
Loop : Integer;
implementation
{$R *.dfm}
Function B2Hex(b:byte) :string; // byte Til Hex Fundet over nettet...
const
Digits : array[0..$f] of char='0123456789ABCDEF';
begin
result := digits[b shr 4] + digits[b and $f];
end;
procedure TForm1.ConfigPortClick(Sender: TObject);
const
RxBufferSize = 2048;
TxBufferSize = 2048;
var
DCB: TDCB;
Config : String;
CommTimeouts: TCommTimeouts;
begin
ComFile := CreateFile(PChar('COM2:'), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if ComFile = INVALID_HANDLE_VALUE then
begin
ShowMessage('Fejl! Kunne ikke komme i kontakt med port');
exit;
end;
if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
begin
ShowMessage('Fejl! Kunne ikke udføre SetupComm');
exit;
end;
if not GetCommState(ComFile, DCB) then
begin
ShowMessage('Fejl! Kunne ikke modtage CommState');
exit;
end;
Config := 'baud=9600 parity=n data=8 stop=1'; // Her sætter vi baud-rate, stopbit osv.
if not BuildCommDCB(@Config[1],dcb) then
begin
ShowMessage('Fejl! Kunne ikke opbygge CommDCB');
exit;
end;
if not SetCommState(ComFile, DCB) then
begin
ShowMessage('Fejl! Kunne ikke sætte CommState');
exit;
end;
CommTimeouts.ReadIntervalTimeout := 0;
CommTimeouts.ReadTotalTimeoutMultiplier := 0;
CommTimeouts.ReadTotalTimeoutConstant := 1000;
CommTimeouts.WriteTotalTimeoutMultiplier := 0;
CommTimeouts.WriteTotalTimeoutConstant := 1000;
if not SetCommTimeouts(ComFile, CommTimeouts) then
begin
ShowMessage('Fejl! Kunne ikke sætte CommTimouts');
exit;
end;
end;
procedure TForm1.SendDataClick(Sender: TObject);
var
BytesWritten: DWORD;
s : string;
begin
s := 'IR';
WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); // Sender IR til modtageren
end;
procedure TForm1.GetDataClick(Sender: TObject);
var
BytesRead: DWORD;
d: array[1..80] of Char;
i: integer;
data : string;
begin
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
begin // Hvis den ikke får nogen data
ShowMessage('Fejl! Kan ikke læse fra port');
exit; // så kommer der en fejl meddelse
end;
data := ''; // Sørger for at data er tom
for i := 1 to BytesRead do // Køre en loop
data := data + B2Hex(Ord(d[i]))+ ' '; // Her Converteres d (Char) til en byte
// og fra byte til HEX..
// Som Bliver smidt ind i en streng..
Delete(data, length(data),1); // Sletter ' ' som er i enden
RecivedData.Text := data; // Smider Resultatet ind i en edit
end;
end.
SkypeR - Out..