Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Цикл передачи данных  (Прочитано 10656 раз)
0 Пользователей и 1 Гость смотрят эту тему.
locator
Постоялец

ru
Offline Offline

« : 08-01-2007 20:15 » new

Что-то я совсем запутался. Надо передать в COM1 ряд пакетов (не более 10) и каждый пакет должен
выдаваться со своей частотой. Бился в одном цикле это закрутить  - что-то не выходит. В принципе, как такую передачу организовать грамотно? Спасибо за ответ!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 08-01-2007 20:27 » 

locator, а покажи код , в котором ты бился? )
Записан

locator
Постоялец

ru
Offline Offline

« Ответ #2 : 09-01-2007 09:50 » 

locator, а покажи код , в котором ты бился? )
ну примерно так:
Код:
Timer1->Interval = 10;

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

  static long L = 1;

  if((L%11) == 0) send_pack1();
 
  if((L%51) == 0) send_pack3();

  if((L%101) == 0) send_pack4();

  L++;
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 09-01-2007 17:58 » 

а вот "что-то не выходит" - а расскажи, что именно выходит

и ещё покажи код функций
send_pack1();
send_pack3();
send_pack4();
Записан

locator
Постоялец

ru
Offline Offline

« Ответ #4 : 10-01-2007 19:07 » 

вот код функции send_pack1(), остальные выглядят аналогично, просто пакеты разные:
Код:
double x[3]; //  - то, что надо выпихнуть в порт
Packet1 p1;  //структура пакета №1
void send_pack1()
{
  p1.n[0] = (x[0]/5000.)*MAXSHORT;;
  p1.n[1] = (x[1]/5000.)*MAXSHORT;
  p1.n[2] = (x[2]/5000.)*MAXSHORT;;
 
  p1.mode = 0x0A;

  BYTE bt[8];
  bt[0] = p1.n[0] >> 8;  bt[1] = p1.n[0];
  bt[2] = p1.n[1] >> 8;  bt[3] = p1.n[1];
  bt[4] = p1.n[2] >> 8;  bt[5] = p1.n[2];
  bt[6] = p1.mode >> 8;  bt[7] = p1.mode;

  BYTE s = 0;

  outputByte(DLE);
  //номер пакета
  outputByte(2);

  for(int i = 0; i < 8; i++)
   {
     outputByte(bt[i]);
     s+=bt[i];

     if(bt[i]==DLE) outputByte(DLE);
   }

   //s- контрольная сумма
   outputByte(1 + ~s);
   outputByte(DLE);
   outputByte(ETX);
}

в программе-приемнике пролетают два и более одинаковых пакетов подряд,
и в результате не выходит заданная частота передачи - вот это мне и не нравится Не понял
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 10-01-2007 19:38 » 

Кто ж так посылает данные в порт побайтно? Надо формировать буфер и целиком посылать его...

по ходу дела функция просто не успевает посылать пакеты быстро, к этому времени уже приходят новые сообщения от таймера и получается, что отсылка идёт постоянно. При чём, статическая переменная ещё не успела увеличится, а новые вызовы процедур уже совершаются (тут сомнение, если я не прав - поправьте , кто знает Улыбаюсь ) , потому что прилетели новые сообщения от таймера. Это объясняет повторы


попробуй ради эксперимента поставить дискретность таймера 100 - всё должно заработать , только медленнее
« Последнее редактирование: 10-01-2007 19:40 от Алексей1153 » Записан

locator
Постоялец

ru
Offline Offline

« Ответ #6 : 10-01-2007 22:20 » 

попробуй ради эксперимента поставить дискретность таймера 100 - всё должно заработать , только медленнее
Поставил 1000 - заработало вроде. Потом заменил таймер потоком  - заработало на интервале 100.
А посылать каждый пакет в отдельном потоке  - это есть смысл делать?
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 11-01-2007 05:17 » 

А посылать каждый пакет в отдельном потоке  - это есть смысл делать?
В этом случае пакеты могут накладываться друг на друга, т.к. Ты посылаеш пакет по одному байту. А такие глюки очень тежело отлавливать, да и проявлять себя они могут в самых неожиданных моментах.

Если уж ты отправляешь пакеты по байтно и используешь для этого не разделяемый рессурс, то заведи для разграничения доступа потоков к этому рессурсу семафор, который будет сигнализировать об освобождении порта.

А еще лучше (как говорилось выше) передовать порту весь пакет целеком, для отправки.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines