Форум: "Система";
Текущий архив: 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]Уау!!
Простейший пример, и работает! Сам убедился.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c