Com-порт
От: RomanBoot  
Дата: 02.03.04 15:58
Оценка:
Мне необходимо отправить в Com-порт несколько байт информации, я просмотрел рекомендуемые компоненты и примеры и создал код где используются функции CreateFile, WriteFile, GetCommState, SetCommState и запись DCB. Но при попытке записи информации в порт выдаётся ошибка, которая при расшифровке функцией FormatMessage коментируется так: "Невозможно создать файл, так как он уже создан." Причём при создании файла (функция CreateFile) и работе с атрибутами (функции GetCommState и SetCommState) никаких исключений не происходит...

Ниже расположен участок кода программы:

var
  Form1: TForm1;
  DCB: TDCB;
  Over: OVERLAPPED;
  CommHandle: HFILE;
  arRData: array [0..4] of Byte;
  lpMsgBuf: PChar;
  Success: boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Success:=true;
CommHandle:=CreateFile('COM1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
GetCommState(CommHandle, DCB);
DCB.BaudRate:=CBR_4800;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=ONESTOPBIT;
DCB.EvtChar:=Char($80);
SetCommState(CommHandle, DCB);
end;

{procedure TForm1.btInitClick(Sender: TObject);
begin
if not (SetCommMask(CommHandle, EV_BREAK)) then
  ShowMessage('Неудача загрузки маски!');
if not (SetCommState(CommHandle, DCB)) then
  ShowMessage('Неудача загрузки состояния!');
end;}

procedure TForm1.btQueryClick(Sender: TObject);
var
qbytes: Cardinal;
//qbytes: Integer;
WString: PChar;
//pqBytes: ^Integer;
begin
qbytes:=3;
// WString:='T'+MaskEdit1.text+'N';
WString:='T1N';
Success:=WriteFile(CommHandle, WString, qBytes, qBytes, nil {@Over});
if not (Success) then
  begin
  ShowMessage('Неудача записи в Com-порт!'+'Ошибка:'+IntToStr(GetLastError));
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,
  nil, GetLastError, LANG_SYSTEM_DEFAULT, @lpMsgBuf, 100, nil);
  ShowMessage(lpMsgBuf);
  end;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.