Как посылать и считывать данные с COM порта, менять параметры (биты данных, четность...)

Я использую для этого следующие команды:


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
Теги:
COM порт
Добавлено: 26 Июля 2018 20:43:51 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...