реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> RS232 под win, частота опроса СОМ порта под WinXP
paskal
сообщение Jul 21 2011, 12:22
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Нужно соединить компутер с устройством через RS232. Обмен такой. Устройство непрерывно шлет пакеты по 16 байт и принимает ответные пакеты. Скорость обмена 115200, частота отправки пакетов 50 Гц.
Под WinXP пользуюсь стандартными API. В билдере я открываю ком порт через CreateFile, дальше вешаю на таймер функцию которая проверяет сколько байт в приемном буфере, если не 0, то считывает буфер.
Проблема в том что считывается не 16 байт, а от 80 до 96. Т.е. получается что виндосовский таймер может работать с частотой 18 Гц и никак не чаще. Подскажите способ чтоб мне уложится в частоту 50 Гц.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 21 2011, 12:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(paskal @ Jul 21 2011, 15:22) *
Обмен такой.

Обмен бездарный. Сами придумали?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
PhX
сообщение Jul 21 2011, 12:42
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Цитата(Dog Pawlowa @ Jul 21 2011, 16:39) *
Обмен бездарный. Сами придумали?

Предложите, пожалуйста, или ткните ссылкой в правильный. Тоже очень нужно.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 21 2011, 12:45
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Опрашивайте порт в отдельном потоке. Никаких проблем не будет.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 21 2011, 12:47
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (paskal @ Jul 21 2011, 15:22) *
Подскажите способ чтоб мне уложится в частоту 50 Гц.
Работайте по таймауту, не используя таймер вообще. Посмотрите на SetCommTimeouts.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 21 2011, 12:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(paskal @ Jul 21 2011, 16:22) *
получается что виндосовский таймер может работать с частотой 18 Гц и никак не чаще.
Вас не устраивает точность работы таймера? В Win несколько таймеров. Самый точный из них - мультимедийный (см. Multimedia Timer Functions: timeBeginPeriod, timeSetEvent, и др.). Однако при работе с ним нужно проявлять хотя бы элементарную осторожность: запуск из под этого таймера - в режиме "Real time".
Go to the top of the page
 
+Quote Post
ibiza11
сообщение Jul 21 2011, 12:59
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304



Решалась подобная задача, писал на PureBasic. Открывал в приложении параллельный поток. В нем выполнялась функция приема из COM порта. Пользовался тупым сравнением прошедшего времени в мс. т.е. что то типо того :
Код
DateTime dt= DateTime.Now
                    while (true)
                    {
                        if (dt<=DateTime.Now)
                        {
                            //твоя операция
                             dt=DateTime.Now.AddMilliseconds(20);
                        }
                    }

на PureBasic это выглядит несколько иначе:
Код
dT.f=MeasureHiResIntervalStop()
MeasureHiResIntervalStart()
T.f=T+Abs(dT)
If T>=0.020
    T=0
;действие
EndIF


Сообщение отредактировал ibiza11 - Jul 21 2011, 13:01
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 21 2011, 13:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(PhX @ Jul 21 2011, 15:42) *
Предложите, пожалуйста, или ткните ссылкой в правильный. Тоже очень нужно.

Передавайте данные текстом, а поле текста обрамляйте STX/ETX, или просто после данных код перевода строки

Можно будет смотреть данные обычным гипертерминалом.
Тайм-аут не нужен вообще.



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
paskal
сообщение Jul 21 2011, 13:51
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Палыч @ Jul 21 2011, 16:48) *
Вас не устраивает точность работы таймера? В Win несколько таймеров. Самый точный из них - мультимедийный (см. Multimedia Timer Functions: timeBeginPeriod, timeSetEvent, и др.).

А есть в С++ билдере компоненты с этим таймером?
Цитата(Сергей Борщ @ Jul 21 2011, 16:47) *
Работайте по таймауту, не используя таймер вообще. Посмотрите на SetCommTimeouts.

Не совсем понял как это не использовать таймер. Если я без таймера буду непрерывно опрашивать приемник, то программа просто повиснет.
Если только добавлю таймаут, то это даст то что вместо 96 байт я приму 16. А остальные 80 потеряются. Т.е. проблема не решится

PS
изменить протокол нельзя, нам его дали сверху
гипертерминал вообще не катит, т.к. надо чтоб обмен был в обе стороны: принял пакет - ответил
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 21 2011, 14:00
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(paskal @ Jul 21 2011, 16:51) *
изменить протокол нельзя, нам его дали сверху
гипертерминал вообще не катит, т.к. надо чтоб обмен был в обе стороны: принял пакет - ответил

Такой протокол может дать только препод sm.gif
Никакой логики - если принял-ответил, тогда почему устройство передает опять, не дожидаясь ответа?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 21 2011, 14:03
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (paskal @ Jul 21 2011, 16:51) *
Не совсем понял как это не использовать таймер. Если я без таймера буду непрерывно опрашивать приемник, то программа просто повиснет.
Не надо его опрашивать. Функция read() сама веренет управления после приема N байт или истечения таймаута. Можете использовать асинхронные события (используя структуру OVERLAPPED), тогда вообще ничего ждать не надо будет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 21 2011, 15:07
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(paskal @ Jul 21 2011, 17:51) *
А есть в С++ билдере компоненты с этим таймером?
Не знаю. Но, похоже, таймер Вам и не нужен... Я думал, что Вам нужно передавать строго через 20 мс... Для приёма использовать таймер - моветон. Рациональнее - вынести приём в отдельный поток.
Go to the top of the page
 
+Quote Post
paskal
сообщение Jul 21 2011, 16:14
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Палыч @ Jul 21 2011, 19:07) *
Для приёма использовать таймер - моветон. Рациональнее - вынести приём в отдельный поток.

Но ведь переключение между потоками по таймеру. В чем тогда выигрыш?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 21 2011, 16:45
Сообщение #14


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (paskal @ Jul 21 2011, 21:22) *
Нужно соединить компутер с устройством через RS232. Обмен такой. Устройство непрерывно шлет пакеты по 16 байт и принимает ответные пакеты. Скорость обмена 115200, частота отправки пакетов 50 Гц.

Необходимо ждать наступления события - приема нескольких байт. Это можно сделать по прерываниям в МК, в Win - не знаю. Нужно смотреть, можно ли ждать события для последовательного порта.
Либо, действительно, настроить таймауты, чтобы система не повисла. С таймером бы не стал связываться. Как-то интуитивно не вяжется...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 21 2011, 17:58
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(paskal @ Jul 21 2011, 20:14) *
Но ведь переключение между потоками по таймеру. В чем тогда выигрыш?
По истечению выделенного кванта времени переключаются чисто вычислительные потоки, которых, обычно, раз-два и обчёлся... Любое ожидание события (а, ввод-вывод без ожидания, обычно, не обходится) приводит к переключению потоков.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016