Понедельник, 29.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нашли свой исходник?
Всего ответов: 94
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » CORBA и 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 и могут бытьь использованы в любой версии delphi

Получить ссылку на материал

Категория: CORBA и COM | Добавил: Барон (12.12.2011)
Просмотров: 1491 | Теги: биты данных, четность, Порт, com | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования