Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» COM порт

Автор: Felix
Дата сообщения: 15.10.2002 16:23
Нужна помощь....
При работе используется Async, но это не столь важно.
Необходимо 1. Грамотно выставить таймауты (разбирался, но толком не понял)
2. Соль в том, чтобы обеспечить следующий алгоритм работы:
- передаем в устройство ---->$82 (чтение регистра)
- получаем из устройства <-----($82 подтверждение)
- передаем адрес регистра 0xXX
- читаем информацию.

на шаге 2 необходимо дождаться подтверждения о приёме байта (возниконовение события RxChar), но всё хорошо если бы не маячащая перспектива работы с нитями. Как можно обойти данный косяк?


условно:
procedure Read;
var s: string;
begin
ComPort.WriteStr(Chr($82));
repeat
COmPort.Read(s);
Application.ProcessMessage;
until s[1]=Chr($82) <----работает через раз
ComPort.WriteStr(Chr($0xXX));
end;

как привязаться к событию OnRxChar?!?
или может быть проверку и ожидание этого байта можно проще сделать?!?
Автор: SergejKa
Дата сообщения: 16.10.2002 04:03
Использовать управление внешним девайсом по СОМ порту это гимор ужасный... И это уже обсуждалось...
События системного по приходу байта в буффер приёмника порта НЕТ. Соответственно надо постоянно проверять InBufferCount.
На ненаВИЖУАЛ БЕЙСИКЕ написано было так (или примерно так):

While Not netnapolneniya
per1 = MSComm.InBufferCount
Delay(0.05)
per2 = MSComm.InBufferCount
If per1 = per2 and per1<>0 Then netnapolneniya = True
Wend

Если принимаешь всего один байт, то можно проще:

while MSComm.InBufferCount<1
Wend

Но тут свой прикол - если твой девайс "прохлопал" запрос, то никогда и не пришлёт ответ, соответственно зависон программы и надо придумывать какой-то счётчик типа

While MSComm.InBufferCount<1 and counter<1000
counter=counter+1
Wend

Остаётся только несколько вопросов - успеешь ли ты принять ответ девайса за эти 1000 условных единиц? А на более быстром компе? А на тормозном пентиуме 166 с крутым эМэМИКСом не будет ожидания в две минуты? А ..............? А если ..................?
Вобщем ужасно это всё...
Автор: Vad33
Дата сообщения: 21.10.2002 00:44
Как я привязывался к RxChar.
Заидывал содержимое в TMemo,
а потом разбирался, что там.


procedure TForm1.Comm1RxChar(Sender: TObject; Count: Integer);
type
CharBuf = array[0..9999] of Char;
var
Buffer: ^CharBuf; Bytes, P: Integer;
LineData:string;
begin
GetMem(Buffer, Comm1.ReadBufSize);
try
Fillchar(Buffer^, Comm1.ReadBufSize, 0);
Bytes := Comm1.Read(Buffer^, Count);
if Bytes <> -1 then
begin
for P := 0 to Bytes - 1 do begin
case Buffer^[P] of
#0, #10:; #13: begin
if DelRSpace(LineData)<>'' then Memo1.Lines.Add(LineData);
LineData := ''; end; else
begin
LineData := LineData + CharBuf(Buffer^)[P];
end; end; //case
end; //for do
end;
Application.ProcessMessages;
finally
FreeMem(Buffer);
end;
end;

Примечание
if DelRSpace(LineData)<>'' then M2.Lines.Add(LineData);
DelRSpace - очистка пробелов из RXLIB

Автор: Memo
Дата сообщения: 22.10.2002 08:37
Извлечения из MSDN (Platform SDK->Base Services->Hardware->Communications Resorces):
=============================================
Configuring a Communications Resource

The following example opens a handle to COM1 and fills in a DCB structure with the current configuration. The DCB structure is then modified and used to reconfigure the device.

/* A sample program to illustrate setting up a serial port. */

#include <windows.h>

int
main(int argc, char *argv[])
{
DCB dcb;
HANDLE hCom;
BOOL fSuccess;
char *pcCommPort = "COM2";

hCom = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);

if (hCom == INVALID_HANDLE_VALUE) {
// Handle the error.
printf ("CreateFile failed with error %d.\n", GetLastError());
return (1);
}

// We will build on the current configuration, and skip setting the size
// of the input and output buffers with SetupComm.

fSuccess = GetCommState(hCom, &dcb);

if (!fSuccess) {
// Handle the error.
printf ("GetCommState failed with error %d.\n", GetLastError());
return (2);
}

// Fill in the DCB: baud=57,600 bps, 8 data bits, no parity, and 1 stop bit.

dcb.BaudRate = CBR_57600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

fSuccess = SetCommState(hCom, &dcb);

if (!fSuccess) {
// Handle the error.
printf ("SetCommState failed with error %d.\n", GetLastError());
return (3);
}

printf ("Serial port %s successfully reconfigured.\n", pcCommPort);
return (0);
}
=============================================
Monitoring Communications Events

The following example code opens the serial port for overlapped I/O, creates an event mask to monitor CTS and DSR signals, and then waits for an event to occur. The WaitCommEvent function should be executed as an overlapped operation so the other threads of the process cannot perform I/O operations during the wait.

HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attributes
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);

if (hCom == INVALID_HANDLE_VALUE)
{
// Handle the error.
}

// Set the event mask.

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess)
{
// Handle the error.
}

// Create an event object for use in WaitCommEvent.

o.hEvent = CreateEvent(
NULL, // no security attributes
FALSE, // auto reset event
FALSE, // not signaled
NULL // no name
);

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o))
{
if (dwEvtMask & EV_DSR)
{
// To do.
}

if (dwEvtMask & EV_CTS)
{
// To do.
}
}
=============================================
Автор: Felix
Дата сообщения: 22.10.2002 14:09
Спасибки всем, но после долгих излияний и долбания с внешним аоном (дивайс), понял что надо отсылать весь пакет.... проще так

Страницы: 1

Предыдущая тема: TADODataSet (TADOQuery) немогу заставить искать по шаблону


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.