C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прерывания по COM порту в C++Builder  (Прочитано 1748 раз)
brdm
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 59


Прерывания по COM порту в C++Builder
« : 15 Август 2015, 11:44:32 »

Если кто сталкивался подскажите пожалуйста можно-ли в C++Builder (Windows XP) использовать прерывание по COM порту. Если да то как это выглядит на небольшом примере.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Прерывания по COM порту в C++Builder
« Ответ #1 : 15 Август 2015, 18:07:25 »

Попробуй этот пример посмотреть.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Прерывания по COM порту в C++Builder
« Ответ #2 : 17 Август 2015, 15:23:05 »

Не надо ломать себе голову странными словами.. всё всегда проще чем кажется.
Обработку принятого по порту надо вести в потоке. Как только получено что-то желаемое (пакет в заданном формате или же тупо байты), то вызывать событие.

Например реакция на получения какого-то количества байт в вектор array
Код
void __fastcall TCom_Thread::Execute()
{
do
{
UINT countReadByte = array.size();
if (countReadByte)
{
if (this->OnDateResieved) this->OnDateResieved(this, &array[0], countReadByte);
}
 
Sleep(1);
}
   while(!Terminated);
}

в классе потока объявляешь
Код
private:
 TDateResieved FDateResieved;
 
public:
 __property TDateResieved OnDateResieved = {read=FDateResieved, write=FDateResieved};

где TDateResieved например
Код
typedef void __fastcall (__closure *TDateResieved )(System::TObject* Sender, BYTE buf[], int NumberOfBytes);
« Последнее редактирование: 17 Август 2015, 15:33:54 от POV » Записан
brdm
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 59


Re: Прерывания по COM порту в C++Builder
« Ответ #3 : 18 Август 2015, 12:52:20 »

Спасибо. Понятно. В смысле про поток.
В программе 3 потока в одном из которых производится вызов двух системных функций подряд
Код:
      WriteFile( hSerial, &c_com, 5, &bytesWritten, NULL );
       pcap_sendpacket(adhandle, packet, 96);
Суть проблемы в том, что от COM(WriteFile) запускается одно внешнее электронное устройство, а от Ethernet (pcap_sendpacket) запускается другое внешнее электронное устройство. Так вот между последовательными вызовами данных функций происходит флуктуация иногда аж до 250 мкс, что недопустимо. Как можно избавиться от флуктуации или ее уменьшить до минимума?

Поэтому и возник вопрос с прерыванием по COM. В смысле чтобы запуститься(по прерыванию) от принятого COM пакета от первого внешнего устройства и послать pcap_sendpacket на второе устройство. Похоже это будет то же самое.

Почему возникает флуктуация в железе (в смысле на выходе компа (Windows XP, 7)) между двумя последовательными вызовами двух функций WriteFile и pcap_sendpacket?
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Прерывания по COM порту в C++Builder
« Ответ #4 : 18 Август 2015, 16:33:41 »

Цитата: brdm от 18 Август 2015, 12:52:20
Так вот между последовательными вызовами данных функций происходит флуктуация иногда аж до 250 мкс, что недопустимо. Как можно избавиться от флуктуации или ее уменьшить до минимума?

"Это интернетвинда, детка" )))
ИМХО: ХЗ как уж винда передаст драйверам устройств данные и как они отреагируют. А 250 мкс для винды мне кажется не таким уж и плохим результатом.
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Прерывания по COM порту в C++Builder
« Ответ #5 : 18 Август 2015, 16:46:31 »

Неплохим? Случайным. На повторяемость нельзя рассчитывать.
Записан
brdm
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 59


Re: Прерывания по COM порту в C++Builder
« Ответ #6 : 18 Август 2015, 16:57:05 »

Понятно. А как в этом случае Linux работает. Примерно также?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #7 : 18 Август 2015, 16:58:24 »

Также. Может и шустрее, но на это полагаться нельзя. Есть реал-тайм ядра, но это отдельная проблема.
Такие задачи могут ставиться перед RTOS, не перед десктопной виндой.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.695 секунд. Запросов: 21.