Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прием данных с COM порта

16K
07 мая 2009 года
iRain
72 / / 12.03.2008
Написал прогу, которая открывает СОМ порт в асинхронном режиме, передает данные в порт и принимает данные. Соединил два COM порта, запустил два раза прогу, данные между прогами передаются через порты.
Все открывает нормально, передает нормально и принимает вроде бы как ничего, но есть проблема: принимающиеся данные записываются в перепенную
 
Код:
TForm1 *Form1;
HANDLE port;
TDCB portp;
TOverlapped over;
char buf[255];

и если в первый раз я записал в начало 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;
         }
   }

}
479
07 мая 2009 года
Ухух
142 / / 05.05.2006
Нужно сменить метод у Memo, а то каждый раз ему указывается что нужно добавить еще одну строку. Можно перед записью текста добавить метод Clear().Add вообще не использовать. Можно тока в самом начале в сторонке чтобы явно указать сколько строк хотим видеть в Memo. Это если надо что бы каждый прием стирал результат предыдущего. А вообще приведен код СИНХРОННОГО приема. И надо, на мой взгляд, оценить какое число байт может прийти в порт на данной скорости за интервал таймера. Функцией ReadFile считывать поболее немного (а не 1). Смотреть сколько на самом деле пришло в аргументах функции и если пришло что -то, то только тогда лезть в buf и брать оттуда столько сколько пришло.
16K
07 мая 2009 года
iRain
72 / / 12.03.2008
Мемо работает как надо.
Смысл в том, что если в первый раз из порта прочитать строку - "123" (например)
в Мемо выведит - 123
А во второй раз считать 765, то в Мемо, следующей строуой будет - 123765
14
07 мая 2009 года
Phodopus
3.3K / / 19.06.2008
Ну так добавляйте в мемо подбуфер вашего буфера
479
07 мая 2009 года
Ухух
142 / / 05.05.2006
PurgeComm(port,PURGE_RXCLEAR);

Вместо чистки buf надо вот это. Но повторюсь - в мемо вы взрастили себе лангольера - он сожрет постепенно все ОЗУ и все обвалится.
16K
08 мая 2009 года
iRain
72 / / 12.03.2008
Цитата: Ухух
PurgeComm(port,PURGE_RXCLEAR);


Не помогает, это же асинхронный режим!

Цитата: Ухух

Но повторюсь - в мемо вы взрастили себе лангольера - он сожрет постепенно все ОЗУ и все обвалится.



Мемо построчно выводит, то, что заносится в переменную buf, а во время теста много памяти оно не сожрет.
Собственно говоря, мне тут подсказали идею с динамической переменной, если что то получится - отпишусь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог