[C/C++] Port COM

0

Jak zapisac odczytac z portu COM przy urzyciu funkcji API.
Potrzebuję tylko funkcji ale taksame dobrze moze byc cały kod z jego obsluga.
Kod nie musi być w C++ moze byc też w Dlphi.

0

Ja bym radził popróbowac z biblioteką porttalk - nie miałbys wtedy kłopotów pod windami nt-podobnymi ;-)

0

Mogę dać Ci kilka procedur wykorzystujących port szeregowy po API. Sam API'owy core można łatwo wykorzystać w C++.

Mój przykład opiera się na transmisji nieASCII. W celu zapisu/odczytu danych do coma dane należy umieścić w tablicy Cbuffer, a jako parametry Com_Read podać długość danych wysyłanych i długość danych odbieranych. Bufor Cbuffer jest wspólny dla zapisu/odczytu.

Sposób wykorzystania:

Cbuffer[0]:='H';
Cbuffer[1]:='e';
Cbuffer[2]:='l';
Cbuffer[3]:='l';
Cbuffer[4]:='o';
Open_Serial ('COM1');
Com_Read (4, 10);

//****** Zmienne portu szeregowego RS-232
hCOM:THandle;
nrWrit:DWORD;
nrRead:DWORD;
Errors:DWORD;
Dcb:TDCB;
ComStat:TComStat;
Cbuffer: array[0..256] of byte;
Que: integer;

//************************* Otwarcie portu szeregowego
function Open_Serial(com: PChar): integer;
// Open_Serial=0 - OK, Open_Serial=1 - błąd otwarcia portu
begin
Open_Serial:=0;
hCOM:=CreateFile(com,GENERIC_WRITE OR GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
if hCOMINVALID_HANDLE_VALUE then
begin
GetCommState(hCOM,Dcb);
with Dcb
do begin
BaudRate:=28800; // szybkość
Flags:= Flags and not ($2); // wył. sprawdzania parz
Parity:= NOPARITY; // brak bitu parzystości
StopBits:=ONESTOPBIT;
ByteSize:=8;
end;
SetCommState(hCOM,Dcb);
end
else Open_Serial:=1;
end;

//******************************* Comport Read
// Com_Read=0-OK, Com_Read=1-błąd zapis, Com_Read=2-błąd odcz.
function Com_Read (write_len: integer; read_len: integer): integer;
var i, licznik: integer;
begin
Que:=0;
licznik:=0;
if not WriteFile(hCOM, Cbuffer, write_len, nrwrit,nil) then
begin
ShowMessage('Błąd zapisu do portu COM');
Com_Read:=1;
exit;
end;
ClearCommError(hCOM, Errors, @ComStat);
while ComStat.cbInQueread_len do
begin
Delay (15);
ClearCommError(hCOM, Errors, @ComStat);
if (ComStat.cbInQue=Que) and (licznik>150) then // czas>1.5s
begin
ClearCommError(hCOM, Errors, @ComStat);
ReadFile(hCOM, Cbuffer, ComStat.cbInQue, nrRead,nil);
ShowMessage('Błąd odczytu z portu COM');
Com_Read:=2;
exit;
end;
Application.ProcessMessages;
Que:=ComStat.cbInQue;
inc (licznik);
end;
ClearCommError(hCOM, Errors, @ComStat);
ReadFile(hCOM, Cbuffer, ComStat.cbInQue, nrRead,nil);
Com_Read:=0;
end;

Pozdrowienia JmP

0

Dzięki za podpowiedź o to włąśnie mi chodziło!!!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1