Попробовал эту библиотеку.
Уже гораздо лучше.
Спасибо огромное.
Принимаю почти то, что и хотел, правда есть еще два вопроса.
1. Почему-то проглатывается несколько последних строчек.
2. Не очень понял, как программно выбрать порт. Когда я пытаюсь набрать
Код
cPort->Port = "COM1"
мне выдается ошибка линковщика.
На всякий случай код апишной программы. Если получится лучше и быстрей - оставлю этот вариант.
Код
if (RadioButton_Com1->Checked)
{
COMString = "COM1";
}
if (RadioButton_Com2->Checked)
{
COMString = "COM2";
}
HANDLE port;
int buf_out;
char buf_in[255] = "";
AnsiString LogString;
int i = 0;
OVERLAPPED ovr;
DWORD bc;
DCB *dcb;
COMMTIMEOUTS ct;
dcb = (DCB*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB));
dcb->DCBlength = sizeof(DCB);
BuildCommDCB("baud=2400 parity=N data=8 stop=1", dcb);
dcb->fNull = TRUE;
ct.ReadIntervalTimeout = 10;
ct.ReadTotalTimeoutMultiplier = ct.ReadTotalTimeoutConstant = 100;
ct.WriteTotalTimeoutMultiplier = ct.WriteTotalTimeoutConstant = 0;
memset(&ovr, 0, sizeof(ovr));
ovr.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
port = CreateFile(COMString, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (port == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Невозможно открыть порт для записи", "Ошибка", MB_OK);
return;
}
SetCommState(port, dcb);
SetCommTimeouts(port, &ct);
buf_out = 0x5A;
WriteFile(port, &buf_out, 1, &bc, &ovr);
DWORD ReopenTime = GetTickCount();
CloseHandle(port);
port = CreateFile(COMString, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (port == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Невозможно открыть порт для чтения", "Ошибка", MB_OK);
return;
}
SetCommState(port, dcb);
HeapFree(GetProcessHeap(), 0, dcb);
SetCommTimeouts(port, &ct);
DWORD StartTime = GetTickCount();
bc = 1;
bool StartRead = false;
while ((GetTickCount() - StartTime) < 10000)
{
Application->ProcessMessages();
buf_in[i] = 0;
ReadFile(port, &buf_in[i], 1, &bc, &ovr);
PurgeComm(port, PURGE_RXCLEAR|PURGE_TXCLEAR);
Sleep(1);
i++;
if (buf_in[i] == buf_in[i - 1] == ' ')
buf_in[i] = 0;
if (buf_in[i] != 0)
LogString += Recode(buf_in[i]);
if (i == 246)
{
Log->Lines->Add(LogString);
i = 0;
LogString = "";
}
}
Здесь Log - TMemo
В 98-ой принимает более-менее нормально (Начальство довольно), а в ХР - только несколько несвязных фраз, почти все проглатывает.
Сообщение отредактировал Freeze Anti - Jun 20 2007, 11:54