TForm1 *Form1;
HANDLE port;
TDCB portp;
TOverlapped over;
char buf[255];
Прием данных с COM порта
Все открывает нормально, передает нормально и принимает вроде бы как ничего, но есть проблема: принимающиеся данные записываются в перепенную
Код:
и если в первый раз я записал в начало 4 символа, то следующие принятые данные будут не заменять уже имеющиеся, а дописываться дальше и так пока полностью не заполнят все 255 ячеек, а потом опять с нуля.
Вот код о чтении данных с порта:
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int n = 0;
if(strlen(buf) > 0)
{
Memo1->Lines->Add(buf);
clrstr(buf);
}
for(int i = 0; i < 255; i++)
{
ReadFile(port, &buf, 1, &DWORD(n), &over);
if(GetLastError() != ERROR_IO_PENDING)
{
ShowMessage("Ошибка чтения!");
Timer1->Enabled = false;
return;
}
}
}
{
int n = 0;
if(strlen(buf) > 0)
{
Memo1->Lines->Add(buf);
clrstr(buf);
}
for(int i = 0; i < 255; i++)
{
ReadFile(port, &buf, 1, &DWORD(n), &over);
if(GetLastError() != ERROR_IO_PENDING)
{
ShowMessage("Ошибка чтения!");
Timer1->Enabled = false;
return;
}
}
}
Нужно сменить метод у Memo, а то каждый раз ему указывается что нужно добавить еще одну строку. Можно перед записью текста добавить метод Clear().Add вообще не использовать. Можно тока в самом начале в сторонке чтобы явно указать сколько строк хотим видеть в Memo. Это если надо что бы каждый прием стирал результат предыдущего. А вообще приведен код СИНХРОННОГО приема. И надо, на мой взгляд, оценить какое число байт может прийти в порт на данной скорости за интервал таймера. Функцией ReadFile считывать поболее немного (а не 1). Смотреть сколько на самом деле пришло в аргументах функции и если пришло что -то, то только тогда лезть в buf и брать оттуда столько сколько пришло.
Смысл в том, что если в первый раз из порта прочитать строку - "123" (например)
в Мемо выведит - 123
А во второй раз считать 765, то в Мемо, следующей строуой будет - 123765
Ну так добавляйте в мемо подбуфер вашего буфера
Вместо чистки buf надо вот это. Но повторюсь - в мемо вы взрастили себе лангольера - он сожрет постепенно все ОЗУ и все обвалится.
Цитата: Ухух
PurgeComm(port,PURGE_RXCLEAR);
Не помогает, это же асинхронный режим!
Цитата: Ухух
Но повторюсь - в мемо вы взрастили себе лангольера - он сожрет постепенно все ОЗУ и все обвалится.
Мемо построчно выводит, то, что заносится в переменную buf, а во время теста много памяти оно не сожрет.
Собственно говоря, мне тут подсказали идею с динамической переменной, если что то получится - отпишусь.