Как посылать и считывать данные с COM порта, менять параметры (биты данных, четность…)
Как посылать и считывать данные с COM порта, менять параметры (биты данных, четность…)
Как посылать и считывать данные с 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 и могут бытьь использованы в любой версии delph