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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Получение битов с сом порта  (Прочитано 36363 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
DmitryV.
Гость
« : 13-05-2004 11:49 » 

Такой форум классный. Набрел на обсужение вопроса получения данных с сом порта, точнее отслеживание изменения определенной линии. Это как раз то, что мне нужно. Дело в том, что у меня устройство посылает нестандартный сигнал. И мне как раз надо отслеживать лишь изменение состояния на линии, причем желательно контакта DCD - 1 пин 9 пинового разъема.
Как это сделать на Delphi средствами API? И какую максимальную скорость я могу получить? Надо 38400.
Заранее благодарен.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 13-05-2004 12:11 » 

Переместил в Delphi и удалил повтор.

DmitryV., немного непонятно - ты хочешь эту скорость на DCD получить?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DmitryV.
Гость
« Ответ #2 : 14-05-2004 04:28 » 

Ну да. Отследить изменение сигнала на линии DCD. Вроде это возможно с помощью функции GetCommModemStatus. А вот какой именно параметр отвечает за эту линию - непонятно. В справке эта линия видимо по другому называется. А как?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 14-05-2004 06:57 » 

DmitryV., по-моему, я тебе уже отвечал на винградовском форуме по ком-порту из дельфи... ладно, повторим, вдруг не читал...

Код:

var
   hCom{ THandle;
   rByte{ char;
   Packet{ array [0..MAXLENGTHPACKET-1( of char;
   Buf{ array [0..LENGTHMEMORY-1( of char;
   WRITEOVERLAPPED{ TOVERLAPPED;
   READOVERLAPPED{ TOVERLAPPED;

   procedure OpenCom;
   procedure CloseCom;
   procedure SetupCom)BaudRate{ DWORD:;
   procedure ClearCom;
   function WriteCom)Packet{ array of char; NumberOfBytesToWrite{ DWORD:{ integer;
   function ReadCom)var rByte; NumberOfBytesToRead{ DWORD:{ integer;

implementation

procedure OpenCom;
begin
 if hCom=INVALID_HANDLE_VALUE then
   begin
     hCom{=CreateFile)curCom, GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0:;
     if hCom=INVALID_HANDLE_VALUE then
       raise Exception.Create)'Невозможно открыть порт!':;
   end;
end;

procedure CloseCom;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if CloseHandle)hCom: then
   hCom{=INVALID_HANDLE_VALUE
 else
   raise Exception.Create)'Невозможно закрыть порт!':;
end;

procedure SetupCom)BaudRate{ DWORD:;
var DCB{ TDCB;
   COMMTIMEOUTS{ TCOMMTIMEOUTS;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if GetCommState)hCom, DCB: then
   begin
     DCB.BaudRate{=BaudRate;
     DCB.ByteSize{=8;
     DCB.Parity{=NOPARITY;
     DCB.StopBits{=ONESTOPBIT;
     if SetCommState)hCom, DCB: then
       begin
         if GetCommTimeouts)hCom, COMMTIMEOUTS: then
           begin
             COMMTIMEOUTS.ReadIntervalTimeout{=0;
             COMMTIMEOUTS.ReadTotalTimeoutMultiplier{=RWPORTTIMEOUT;
             COMMTIMEOUTS.ReadTotalTimeoutConstant{=0;
             COMMTIMEOUTS.WriteTotalTimeoutMultiplier{=RWPORTTIMEOUT*LENGTHSD3;
             COMMTIMEOUTS.WriteTotalTimeoutConstant{=0;
             if SetCommTimeouts)hCom, COMMTIMEOUTS:and
                SetupComm)hCom, INQUEUE, OUTQUEUE:|and
                EscapeCommFunction)hCom, SETDTR:and
                EscapeCommFunction)hCom, SETRTS:" then exit;
           end;
       end;
   end;
 CloseCom;
 raise Exception.Create)'Невозможно настроить порт!':;
end;

procedure ClearCom;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if not PurgeComm)hCom, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR: then
   begin
     CloseCom;
     raise Exception.Create)'Невозможно очистить порт!':;
   end;
end;

function WriteCom)Packet{ array of char; NumberOfBytesToWrite{ DWORD:{ integer;
var NumberOfBytesWritten{ DWORD;
begin
 Result{=-1;
 if hCom=INVALID_HANDLE_VALUE then exit;
 if WriteFile)hCom, Packet, NumberOfBytesToWrite, NumberOfBytesWritten, @WRITEOVERLAPPED:and)NumberOfBytesWritten=NumberOfBytesToWrite: then
   Result{=NumberOfBytesWritten
 else
   raise Exception.Create)'Ошибка записи в порт!':;
end;

function ReadCom)var rByte; NumberOfBytesToRead{ DWORD:{ integer;
var NumberOfBytesRead{ DWORD;
begin
 Result{=-1;
 if hCom=INVALID_HANDLE_VALUE then exit;
 if ReadFile)hCom, rByte, NumberOfBytesToRead, NumberOfBytesRead, @READOVERLAPPED: then
   Result{=NumberOfBytesRead
 else
   raise Exception.Create)'Ошибка чтения из порта!':;
end;


это отрывок из реального проекта. у меня тоже нестандартное устройство, а именно - контроллер, к которому прицеплены считыватели для магнитных карт. по-моему, всё понятно.

скорость ты можешь настроить после открытия порта, а именно - SetupCom. у меня юзается ещё несколько функции, для установки и проверки чётности, но, насколько я понимаю, тебе они не нужны.

слушай, DmitryV., а ты на всех форумах вопросы задаёшь и не регистрируешься? Ага
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 14-05-2004 07:00 » 

как из прочитанного байта выцепить биты, я думаю, объяснять не надо?
Записан

DmitryV.
Гость
« Ответ #5 : 14-05-2004 07:21 » 

x77, возможно твой ответ я и читал - во всяком случае форумы просматриваю, коли вопросы задавал. :?
Пробовал я читать данные с устройства (благодарю за код), только какие то они странные. Я так понял проблема в том, что сом порт, наивный Ага , полагает, что читает символы - байты. А у меня данные неизвестного для него формата. Да и всякие старт-стоп биты под этот формат прописаны. В общем часть инфы теряться будет определено, да и исказится до неузнаваемости Жаль
Поэтому использовать надо WaitCommEvent и GetCommModemStatus - они отслеживают изменение состояния линии (любой), что мне и надо.
Теперь незадача такая - ну буду я опрашивать GetCommModemStatus, а какие промежутки времени будут? Как связать со скоростью порта? Непонятки...
На microchip я зарегистрировался Ага , а вообще спешу очень - диплом горит Молчу
Записан
alex003
Гость
« Ответ #6 : 21-02-2010 18:51 » 

Очень прошу помочь.
Получаю данные с СОМ порта  моей  терминальной программой (делфи, компонент соmm32) вот в таком виде:

яяя/00016661<0
>6==;83<<49;:8
3><0;1>?4388><
2:000000003;

Что нужно мне сделать, может нужна функция или процедура, чтобы конвертировать в
читабельный формат.

После обработки должно быть

Temp=-7.21, PD=0.024, Davl=0.376, Rasx=273.845;
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 22-02-2010 08:16 » 

а в каком формате производится отсылка данных ? Судя по всему - это 4 float или double подряд. Попробовать преобразовать каждые 4 (или 8) байтов в соответствующий тип данных
Записан

alex003
Гость
« Ответ #8 : 22-02-2010 11:43 » 

 В каком формате я не знаю.
Вот еще приведу несколько примеров в более расширенном виде, как приводится в log файлах проги котору я хочу переделать.

       с СОМ порта                                                        здесь программа приняла и декодировала         

13.02.2010 9:40:53: ---/0001660009                   13.02.2010 9:40:54: Reseive: 6600095942130210=0     
13.02.2010 9:40:54: 5942130210=0.-                  13.02.2010 9:40:54: Decode: дата и время вычислителя 13/02/10 09:59:42

здесь  еще можно понять это время и дата (вторая и третья группа)   ---/00016600   095942    130210    =0.
 
в следующем примере ничего понять не возможно

           с СОМ порта                                                            здесь программа приняла и декодировала                         

 13.02.2010 9:40:54: ---/00016661<0                   13.02.2010 9:40:54: Reseive: 6661<0>6==;83<<49;:83><0;1>?4388><2:000000003;
13.02.2010 9:40:54: >6==;83<<49;:8                  13.02.2010 9:40:54: Decode: Temp=-7.21, PD=0.024, Davl=0.376, Rasx=273.845;
13.02.2010 9:40:54: 3><0;1>?4388><
13.02.2010 9:40:54: 2:000000003;.-
 
 Может еще что подскажите.
 
Записан
Джон
просто
Администратор

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

« Ответ #9 : 22-02-2010 12:31 » 

Гадание на кофейной гуще. Гораздо проще и грамотней всё решается простым требованием (поиском, выколачиванием и тд) описания формата передаваемых данных. Кстати для диплома нужно. Иначе как ты ответишь на вопрос об интерпретации этих данных?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #10 : 22-02-2010 14:18 » 

Джон, ему диплом не нужен, это предыдущий хотел диплом )
Записан

Sla
Команда клуба

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

WWW
« Ответ #11 : 22-02-2010 15:15 » 

а чем ты смотришь данные с порта?
Я так понимаю, что внешнее устройство что-то пихает в собственном формате, и ты пытаешься это формат "раздербанить"
И описания на внешнее устройство тоже нет.

Поэтому.
1. Управляющее устройство (мастер) посылает запрос и ждет ответа от твоего девайса
2. Твой девайс (слейв) что-то присылает в неизвестном тебе формате.

Команды которые посылает мастер известны?

Второй вариант, будет потяжелее.
слейв все время что-то пуляет в порт, видимо межде посылками существует какой-то временной промежуток (ведь надо как-то отделять даннные)

Как это все работает?

Что это за девайс?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kivals
Команда клуба

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

WWW
« Ответ #12 : 23-02-2010 11:46 » 

Дествительно гадание Улыбаюсь
Пока заметно следующее:
Начало блока данных: ---/
Дальше похоже номер блока: 0001
Потом 2 байта всегда (?) 66 - код устройства?
Следующие 2 байта возможно код (формат) данных: 00 или 61
ну и в конце - завершение блока: .-
Перед завершением блока вполне возможно некая контрольная сумма (2 байта)

внутренности блока цифр нужно пробовать как предлагал Алексей1153++ декодировать из float, double а может и просто integer (часто в подобных устройствах данные передают в формате с фиксированной точкой) всякими возможными способами пока не получишь нужное число.

Удачи! Она тебе понадобится Улыбаюсь
Записан
alex003
Гость
« Ответ #13 : 23-02-2010 15:57 » 

а чем ты смотришь данные с порта?
Я так понимаю, что внешнее устройство что-то пихает в собственном формате, и ты пытаешься это формат "раздербанить"
И описания на внешнее устройство тоже нет.

Поэтому.
1. Управляющее устройство (мастер) посылает запрос и ждет ответа от твоего девайса
2. Твой девайс (слейв) что-то присылает в неизвестном тебе формате.

Команды которые посылает мастер известны?

Второй вариант, будет потяжелее.
слейв все время что-то пуляет в порт, видимо межде посылками существует какой-то временной промежуток (ведь надо как-то отделять даннные)

Как это все работает?

Что это за девайс?

Это вычислитель, учет воздуха.
Данные с порта смотрел HyperTerminal, portmon.exe и своей прогой,   при написании проги использовался компонент comm32. К сожалению описания на внешн. устройство нет.
 

Мастер посылает типа такого типа команды:  /01005560004:.  , еще пример /01005531000079.

Слейв без команды ничего не передает, т е принял команду от терминальной программы
Например /01005560004:.  и передал мастеру блок данных и ждет следующей команды
Запрос, ответ.

Установил сегодня Free Serial Port Monitor вот что получил

Запрос
 2F  30  31  30  30  35  35  30  30  3A  3A  2E 0D                         /01005500::...
Ответ
 FF  FF  FF  2F  30  30  30  31  36  36  30  30  31  38  30  39       ---/000166001809
 34  34  32  33  30  32  31  30  3F  3F  2E  FF                              44230210??.-
Записан
Sla
Команда клуба

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

WWW
« Ответ #14 : 24-02-2010 07:20 » 

alex003, не жадничай, покажи возможные запросы от мастера и ответы от слейва (соответственно)
Ибо по одной выборке сложно что сказать.

И не надо показывать символьного представления -
хочу видеть вот такое

ЗапросОтвет
2F  30  31  30  30  35  35  30  30  3A  3A  2E 0DFF  FF  FF  2F  30  30  30  31  36  36  30  30  31  38  30  39 34  34  32  33  30  32  31  30  3F  3F  2E  FF

А название прибора сказать, слабо? может в инете есть на него описание. Или хотя бы сказать кто производитель.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
alex003
Гость
« Ответ #15 : 24-02-2010 19:44 » 

Sla, прибор называется, "Карат" малосерийка и вдобавок не новый и в инете о нем ни чего нет. Вот еще фрагмент диалога.



Порт открыт (PID: 1776)

Запрос:24.02.2010 20:48:45                                                  Ответ

 2F 30 31 30 30 35 35 30 30 3A 3A 2E 0D 0A                           FF FF FF 2F 30 30 30 31 36 36 30 30 32 31 34 34
                                                                                                 35 38 32 34 30 32 31 30 3A 36 2E FF   
                                                                               
Запрос:                                                                                     Ответ:                                                                             
       
 2F 30 31 30 30 35 35 33 31 30 32 37 37 2E 0D 0A             FF FF FF 2F 30 30 30 31 36 36 33 31 30 32 37 37     
                                                                                             32 30 32 35 31 36 30 32 31 30 30 30 36 34 31 3E
                                                                                             2E FF 

Запрос:                                                                                    Ответ
2F 30 31 30 30 35 35 36 33 34 37 2E 0D 0A                       FF FF FF 2F 30 30 30 31 36 36 36 33 3C 33 34 38
                                                                                            30 30 30 30 3C 33 34 38 30 30 30 30 3C 33 34 38
                                                                                            30 30 30 30 3C 33 34 38 30 30 30 30 34 36 36 3B     
                                                       

Правда здесь не все данные архива, завтра буду на  объекте сниму весь архив, если надо то вышлю еще фрагмент.
 Я думаю, может мне надо было в моей проге вместо cо :confused:mm32 применять MODBUS компонент   Не понял
 

Записан
Sla
Команда клуба

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

WWW
« Ответ #16 : 24-02-2010 19:57 » 

опа!!!
0D 0A

Это напоминает модбасовский протокол
точно!
FF FF FF 2F
2F - это адрес устройства

чтобы проверить
сделай сделай запрос

2D 30 31 30 30 35 35 30 30 3A 3A 2E 0D 0A 

Ничего в ответ не получишь

Кроме того
2F 30 31 30 30 35 35 30 30 3A 3A 2F 0D 0A
то же ничего не должен получить, потому как Посылка закрывается контрольной суммой crc16

ждемс...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
alex003
Гость
« Ответ #17 : 25-02-2010 18:58 » 

Здравствуй, Sla,  да действительно, ни в первом, ни во втором случае не получил ответ.
 
Записан
Sla
Команда клуба

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

WWW
« Ответ #18 : 25-02-2010 19:33 » 

alex003, ты нашел описание модбаса?
это подветвь modbus ascii
Суть следующая
Мастер посылает запрос
 2F 30 31 30 30 35 35 30 30 3A 3A 2E 0D 0A
Сетевой_адрес, Номер_функции, опрашиваемые регистры, контрольная сумма, конец (0D 0A)

Слейв отвечает

Сетевой_адрес, Номер_функции, ГДЕ-ТО ДОЛЖНО БЫТЬ КОЛИЧЕСТВО ПЕРЕДАВАЕМЫХ БАЙТ, состояние регистров (значения), Контрольная сумма

Т.к. электронной корпии нет, то конспективно
Запрос
стратадресф-цияданныеLRCконец
1симв ':'2симв2симвn симв2симв0D 0A
Уже не попадаем, потому как у тебя в начале адрес, следовательно делаем вывод, что обрезали и написали свой протокол
АдресФункцияСчетчик байтДанныеLRC

Это вот приблизительно так выглядит

LRC считаем след образом
Код:
unsigned char *auchMsg; //буфер данных
unsigned short usDataLen; // Количество байт в буфере
static unsigned char LRC (auchMsg, usDataLen)
{
unsigned char uchLRC=0;
while (usDataLen)
   uchLRC+=*auchMsg++;

return ((unsigned char)(-((char uchLRC)));

}

Если где-то ошибся - все может быть

Пробуй! У тебя все получится.
Советую сначала подогнать свои запросы под эталон, потом разбираться с ответами.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

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

WWW
« Ответ #19 : 25-02-2010 19:51 » 

вот здесь фирменная документация http://www.modbus.org/specs.php
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
alex003
Гость
« Ответ #20 : 26-02-2010 12:32 » 

не совсем понял, как мне дальше поступать.
С modbus, немного знаком, это определенные правила транспорта данных и доступа к ячейкам памяти, т.е. начало приема данных начинается с (Улыбаюсь, два режима бинарный и текстовый, 8 бит + старт, стоп биты т.д.
 В данном случае мне надо знать, как преобразовать полученные символы (текст) в нормальный читабельный формат.
  Я понял, что мы на запрс получили данные, в 16-ричном виде

Ответ:25.02.2010 14:27:28.22964 (+1.4521 seconds)


 FF FF FF 2F 30 30 30 31 36 36 37 31 32 32 30 32   
 31 30 3B 3F 3C 37 3C 39 31 3C 33 3E 3A 39 37 37 
 38 3B 33 3E 3C 3D 39 35 3D 3F 34 34 3B 35 33 34   
 30 35 30 30 30 30 30 30 30 30 3E 3F 2E FF
затем после преобразования получили данные в текстовом виде
25.02.2010 14:27:28:
яяя/00016671220210;?<7<91<3>:9778;3><=95=?44;5340500000000>?.я
 
затем  нужно вырезать системную часть и оставить только данные
 6671220210;?<7<91<3>:9778;3><=95=?44;5340500000000>?
а как их перекодировать? чтобы получилось как в проге, которая шла вместе с прибором?

пример
25.02.2010 14:27:28: Reseive: 6671220210;?<7<91<3>:9778;3><=95=?44;5340500000000>?
25.02.2010 14:27:28: Decode: #02/22/10 00:00:15#, Temp=-1.561, PD=0.3310, Davl=0.4015, Rasx=1449.6256;

Поверил выше указанное HEX редактором все совпадает, т.е. введенный  в редактор 16-тиричный код с набором символов

Код растолкуй пожалуйста по подробнее.
Записан
Sla
Команда клуба

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

WWW
« Ответ #21 : 26-02-2010 12:52 » 

alex003, єто совсем не модбас, а какой-то свой протокол
ты смешиваешь транспортный уровень (modbus ascii) с канальным (старт/стоп и т.д.)

А что там код растолковывать, извини, но там все ясно написано Жаль (зы я в С не силен, но мне все понятно Улыбаюсь )

Твои действия.

Написать процедуру  запроса
Посылать ОДИН запрос тебе известный и анализировать что отдает твой прибор

Прибору, если есть возможность, на вход подать эталонный сигнал, я думая что прибор на вход поступает  токовый сигнал, 0..5 мА,  0..20 мА или 4..20 мА
И анализировать изменение полученных данных для того чтобы понять их  формат


LRC (Longitudinal Redundancy Check)  вычисляется сложением последовательности байтов сообщения, отбрасывая все переносы, и затем двойным дополнением результата. LRC - это 8-ми битовое поле, где каждое новое прибавление символа, приводящее к результату более чем 255, приводит к простому перескакиванию через 0. Так как это поле не является 9-ти битовым, перенос отбрасывается автоматически.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Karrakurt
Участник

ru
Offline Offline

« Ответ #22 : 26-11-2010 16:57 » 

Подскажите как можно узнать, что ожидание ответа при выполнении ReadFile() завершилось по таймауту? Например если вызвать эту функцию с нулевым таймаутом в дополнительном потоке и ждать один символ, то пока он не придет, то этот поток дальше не пойдет. Я правильно понимаю?
Я хочу организовать ожидание ответа девайса по ком порту. При отправке ему команды, от него приходит ответ. Поток при получении первого байта продолжает работу, я меняю таймаут на 50мс, например и складываю пришедшие данные во временный буфер. После прочтения всех данных, поток ожидает и так как больше данных нет, завершается по таймауту и я отправляю временный буфер на обработку, а таймаут перевожу опять на вечное ожидание. Так вот как узнать, что этот таймаут произошел? И вообще, правильна ли моя теория? И нужно ли как-то оповещать порт, что один символ прочитан или запускать какую-нить процедуру\функцию после чтения?
Спасибо.
« Последнее редактирование: 26-11-2010 19:16 от Karrakurt » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #23 : 26-11-2010 19:15 » 

если таймаут вышел, то ReadFile вернёт меньшее значение, чем было запрошено

лучше не нарываться на таймаут - будет тормозить поток. Можно определить, сколько байтов сейчас можно прочитать сразу
Код:
	DWORD dwdCount=0;

COMSTAT comstat;
DWORD err=0;

if(::ClearCommError(m_portH,&err,&comstat))
{
dwdCount=comstat.cbInQue;
}

//dwdCount - количество данных в буфере
Записан

Karrakurt
Участник

ru
Offline Offline

« Ответ #24 : 26-11-2010 19:23 » 

Алексей1153++, но тогда ведь придется запускать цикл и все время проверять нет ли чего в буфере? или использовать что-то типа WaitCommEvent? Или по пришествии первого байта(по предложенному мною способу выше) проверять dwdCount?
В принципе, без посылки какой-либо команды девайс общаться не должен, можно запускать прием данных только после отсылки команды, стоит ли тогда усложнять код?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #25 : 27-11-2010 10:56 » 

Karrakurt, опрос порта у тебя же всё равно в отдельном потоке будет ? А там цикл есть
Записан

Karrakurt
Участник

ru
Offline Offline

« Ответ #26 : 27-11-2010 14:33 » new

Алексей1153++, Ну это да. Я просто про процессорное время подумал. Сколько раз в секунду будет происходить опрос.
В общем вот еще вопросики:
Если в дополнительном потоке я ставлю ожидание события, то какое событие ждать? Мне нужно знать пришли ли данные, это что EV_RXCHAR? Т.е. я выставляю маску с помощью SetCommMask, вызываю ожидание посредством WaitCommEvent и поток замирает пока это событие не произойдет, правильно? Далее вызываю ClearCommError для получения размера пришедших данных и потом уже ReadFile, так? Ничего не пропустил?
И еще, если дополнительный поток находится в ожидании событий, из первого потока я могу послать данные? А то когда я пробовал в дополнительном потоке ждать один символ с помощью РидФайла, а из основного писать данные, то прога повисала. Подумал что из-за этой причины...
Пока все, буду ждать ответа.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #27 : 27-11-2010 15:04 » 

Karrakurt, если без ожидания событий, то опрос в цикле посредством функции ClearCommError можно  делать так:

в цикле - делается опрос, если ничего нет, ждём 50 мс (Sleep(50) ) - зачем новая итерация.

Про события ничего не подскажу - не доводилось пользоваться Улыбаюсь Как-то не пригодилось ни разу ждать событие, обычно мне нужен именно опрос в цикле
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines