Я использую для этого следующие команды:
var dcb : tdcb;
com : thandle;
com:=createfile('com2',generic_read+generic_write,0,nil,open_existing,file_attribute_normal,0);
для открытия,
getcommstate(com,dcb);
dcb.baudrate := cbr_9600;
dcb.bytesize := 8;
dcb.parity := 2;
setcommstate(com,dcb);
для инициализации,
writefile(com,buffer,count,respond,nil);
readfile(com,buffer,count,respond,nil);
для работы.
Ответ 3:
Ниже представлен класс для работы
с com-портом. Протестирован в windows 95.
Класс выдернут из контекста, так что не ручаюсь
в компиляции с первого раза, однако все функции
работы с com очевидны.
unit unit1;
interface
uses
windows;
type
tcomport = class
private
hfile: thandle;
public
constructor create;
destructor destroy; override;
function initcom(baudrate, portno: integer; parity: char;
commtimeouts: tcommtimeouts): boolean;
procedure closecom;
function receivecom(var buffer; size: dword): integer;
function sendcom(var buffer; size: dword): integer;
function clearinputcom: boolean;
end;
implementation
uses
sysutils;
constructor tcomport.create;
begin
inherited;
closecom;
end;
destructor tcomport.destroy;
begin
closecom;
inherited;
end;
commtimeouts: tcommtimeouts): boolean;
var
filename: string;
dcb: tdcb;
portparam: string;
begin
result := false;
filename:='com'+inttostr(portno); {имя файла}
hfile := createfile(pchar(filename),
generic_read or generic_write,0,nil,
open_existing,file_attribute_normal,0 );
if hfile = invalid_handle_value then exit;
//установка требуемых параметров
getcommstate(hfile,dcb );//чтение текущих параметров порта
portparam:='baud='+inttostr(baudrate)+' parity='+parity+' data=8 stop=1 '+
'octs=off';
if buildcommdcb(pchar(portparam),dcb) then begin
result:=setcommstate(hfile,dcb) and
setcommtimeouts(hfile,commtimeouts);
end;
if not result then closecom;
end;
procedure tcomport.closecom;
begin
if hfile <> invalid_handle_value then
closehandle(hfile);
hfile:=invalid_handle_value;
end;
function tcomport.receivecom(var buffer; size: dword): integer;
var
received: dword;
begin
if hfile=invalid_handle_value then
raise exception.create('Не открыта запись в com порт');
if readfile(hfile,buffer,size,received,nil) then begin
result:=received;
end
else raise exception.create('Ошибка приема данных: '+inttostr(getlasterror));
end;
function tcomport.sendcom(var buffer; size: dword): integer;
var
sended: dword;
begin
if hfile=invalid_handle_value then
raise exception.create('Не открыта запись в com порт');
if writefile(hfile,buffer,size,sended,nil) then begin
result:=sended;
end
else raise exception.create('Ошибка передачи данных: '+inttostr(getlasterror));
end;
function tcomport.clearinputcom: boolean;
begin
if hfile=invalid_handle_value then
raise exception.create('Не открыта запись в com порт');
result:=purgecomm(hfile,purge_rxclear);
end;
end.
Ответ 4:
1) Открываем порт используя функию
hcom := createfile('com2',generic_write or
generic_read,0,nil,open_existing,0,0);
2) Для получения/установки параметров порта используем
getcommstate(hcom, dcb);
setcommstate(hcom, dcb);
4) Для установки всяких таймаутов используются функци
setcommmask(hcom,ev_rxchar or ev_err);
getcommtimeouts(hcom,defaultcommtouts);
setcommtimeouts(hcom,defaultcommtouts);
5) Для посылки/чтения, например байта, используйте
writefile(hcom,value,1,dw,nil);
readfile(hcom,x,1,dw,nil);
Ответ 5:
Прежде всего опишите в private или public (как Вам удобнее)
hcom : thandle;
Теперь в formcreate Вы можете указать (для порта com1)
hcom := createfile('com1',generic_read+generic_write, 0, nil, open_existing, 0, 0);
if hcom = invalid_handle_value then begin
dwerror := getlasterror(); // Только опишите предварительно dwerror : dword;
showmessage('com port error ' + inttostr(dwerror));
end;
Теперь Вы можете читать из порта
bool readfile(
handle hfile, // handle of file to read
lpvoid lpbuffer, // address of buffer that receives data
dword nnumberofbytestoread, // number of bytes to read
lpdword lpnumberofbytesread, // address of number of bytes read
lpoverlapped lpoverlapped // address of structure for data);
и записывать в порт
bool writefile(
handle hfile, // handle to file to write to
lpcvoid lpbuffer, // pointer to data to write to file
dword nnumberofbytestowrite, // number of bytes to write
lpdword lpnumberofbyteswritten, // pointer to number of bytes written
lpoverlapped lpoverlapped // pointer to structure needed for overlapped i/o
);
Описания readfile и writefile взяты из help delphi 5. Там же Вы можете найти
орисания функций
getcommstate
setcommstate
escapecommfunction
getcommtimeouts
setcommtimeouts
и некоторых других, которые тоже могут понадобиться при работе с портами.
Кстати, с тем же успехом Вы можете
использовать и порты lpt. Читайте help !!!!!!!
Все приведенные Выше функции относятся к winapi и могут бытьь использованы в
любой версии delphi
|