Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Вниз

Чтение из COM - порта и установка таймаутов. 


Самый главный Ламер   (2001-12-30 18:12) [0]

Хочу поздравить Всех с наступающими праздинками.
И поделиться своей проблемой - не могу прочитать из COM-порта.
Функия ReadFile(HComm, Buffer, 1, Readed_Bytes, nil) возвращает True, но значение Readed_Bytes равно нулю.
Насколько я понимаю, данная ситуация может возникать из-за
неправильно установленных таймаутов. Подскажите, какие таймауты мне надо установить, а то уже нет сил перебирать различные варианты.

Вот как выглядит моя процедура
инициализации порта (переписанная из FAQ):

HComm := CreateFile(
PChar("COM2"), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if HComm = INVALID_HANDLE_VALUE then
raise Exception.Create("Invalid handle value");
if not Windows.GetCommState(hComm, Mode) or
not Windows.GetCommTimeouts(hComm,TimeOuts)
then begin
ShowMessage("Error");
Exit;
end;
with Mode do begin
BaudRate := 600;
ByteSize := 8;
Parity := NOPARITY;
StopBits := ONESTOPBIT;
Flags := EV_RXCHAR + EV_EVENT2;
end;
with TimeOuts do begin
ReadIntervalTimeout := MAXDWORD;
ReadTotalTimeoutMultiplier := 0;
ReadTotalTimeoutConstant := 0;
end;
if not SetCommState (HComm, Mode) or
not SetCommTimeOuts(HComm,TimeOuts)
then
ShowMessage("Error");


Чтение осуществляю следующим образом:

repeat
if ReadFile(HComm, Buffer, 1, Readed_Bytes, nil) then
Sinhronization := (Readed_Bytes > 0);
Application.ProcessMessages;
until (Sinhronization or Terminate);



Max   (2002-01-01 12:10) [1]

У меня под WINNT и 95-98 установлены следующие параметры:

PortBufferSize = 32768;
FSettings := "38400,n,8,1";
...
ReadIntervalTimeout := 10;
ReadTotalTimeoutMultiplier := 0;
ReadTotalTimeoutConstant := 0;
WriteTotalTimeoutMultiplier := 0;
WriteTotalTimeoutConstant := 1000;



Какой размер буфера ?



limon   (2002-01-03 12:18) [2]

Кроме таймаутов причина может быть в длине буфера, в параметрах устройства, подключенного к порту, в необходимости включать специфические сигналы, типа RTS, DTR...
Кстати, таймаут ожидания символа (и пакета) зависит ОТ УСТРОЙСТВА, а не от порта.
Если чтение должно происходить по RTS, то лучше всего ловить IRQ порта SetCommMask(...) ... CreateEvent(...) ... WaitCommMask(...)



Самый главный Ламер   (2002-01-03 20:03) [3]

Размер буфера не знаю.
А устройство - весы "Петровес".
После чтения Help я исправила процедуру отурытия порта на

HComm := CreateFile(
PChar("COM2"), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);

Но это не исправило мою ситуацию, иногда(!!!) байт считывается, а иногда нет.



pasha676   (2002-01-04 11:55) [4]

Достали этим (и подобными) вопросами. Ламер, напиши мне мыло. Я тебе пример вышлю. Статью что ли на сайт написать. На примерчике все рассмотреть.



Стас   (2002-01-05 00:27) [5]

Я пробовал на двух компьютерах (P-1 и P-3)одно и тоже. Хотел поменять мышь ps/2 на мышь COM. В обоих случаях компютеры не увидели мышь COM. Я так понимаю здесь две общие причины. Одна кроется во мне. А вот на счет второй причины я и хочу спросить у вас. Заранее блогодарен за время которое вы может быть потратите на меня.



Red Alert   (2002-01-05 12:49) [6]

Не помню кто-то из форума слал!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
dcb : TDcb; // структура ( виндусовская ) с установками СОМ портов
hCom : THandle; // handler СОМ2
fSuccess : boolean;
dwRead : DWORD;
CharArray : array[0..10] of char; // временный массив данных в оперативной памяти
fileOut : file of char; // файл в который будут писаться данные из СОМ2
i : integer;
begin
hCom := CreateFile(PChar("COM2"),GENERIC_READ,0,nil,OPEN_EXISTING,0,0); //получение указателя на СОМ2

try


fSuccess:= GetCommState(hCom, dcb); // Получение данных о текущих установках СОМ2 и заполнение
// структуры dcb

dcb.BaudRate := CBR_38400; // Установка новых параметров
dcb.ByteSize := 8; // для СОМ2, скорость 38400, 8-ми битный обмен,
dcb.Parity := NOPARITY; // нет контроля четности,
dcb.StopBits := ONESTOPBIT; // один стоповый бит

fSuccess := SetCommState(hCom, dcb); // Установка новых параметров для СОМ2

except
ShowMessage("Error");
end;

if fSuccess then ShowMessage("Success!")
else ShowMessage("Error of initiate ComPort...");

for i:=0 to 10 do // цикл чтения из СОМ2 ( к примеру ) одиннадцати байт
begin
ReadFile(hCom, CharArray[i], 1, dwRead, nil); // чтение одного байта из порта
end;

AssignFile(FileOut,"c:\out.txt");
Rewrite(FileOut);
for i:=0 to 10 do // цикл записи полученной информации в файл на диске
begin
Application.ProcessMessages;
Write(FileOut,CharArray[i]);
end;

CloseFile(FileOut);
CloseHandle(hCom);
end;

end.



Jorh   (2002-01-10 09:02) [7]

попробуй так: перед чтением (readFile) из порта вызывай функцию ClearCommError и в a у тебя будет число байт которое реально находится в порту.

//переменные
var stat: TCOMSTAT;
err:dword;
hport:Thandle;
a:integer;

//код
ClearCommError( hPort, err, @stat );
a:= stat.cbInQue;



Донской   (2002-01-10 10:56) [8]

Уау!!
Простейший пример, и работает! Сам убедился.




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.039 c
1-9475            Dimedrol              2002-03-21 10:38  2002.04.04  
Настраиваемый интерфейс


3-9358            a_k_v                 2002-03-11 06:14  2002.04.04  
какчество отчетов в QReport


1-9521            wal                   2002-03-22 14:40  2002.04.04  
---|Ветка была без названия|---


3-9389            kserg@ukr.net         2002-03-12 12:39  2002.04.04  
ActiveControl - не срабатывает фокусировка в форме


14-9605           Alex12                2002-02-21 15:49  2002.04.04  
Струйный и лазерный. Характеристики и выгоды.