DmitryV.
Гость
|
|
« : 13-05-2004 11:49 » |
|
Такой форум классный. Набрел на обсужение вопроса получения данных с сом порта, точнее отслеживание изменения определенной линии. Это как раз то, что мне нужно. Дело в том, что у меня устройство посылает нестандартный сигнал. И мне как раз надо отслеживать лишь изменение состояния на линии, причем желательно контакта DCD - 1 пин 9 пинового разъема. Как это сделать на Delphi средствами API? И какую максимальную скорость я могу получить? Надо 38400. Заранее благодарен.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 13-05-2004 12:11 » |
|
Переместил в Delphi и удалил повтор.
DmitryV., немного непонятно - ты хочешь эту скорость на DCD получить?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
DmitryV.
Гость
|
|
« Ответ #2 : 14-05-2004 04:28 » |
|
Ну да. Отследить изменение сигнала на линии DCD. Вроде это возможно с помощью функции GetCommModemStatus. А вот какой именно параметр отвечает за эту линию - непонятно. В справке эта линия видимо по другому называется. А как?
|
|
|
Записан
|
|
|
|
x77
Модератор
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
Модератор
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;
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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;.- Может еще что подскажите.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 22-02-2010 14:18 » |
|
Джон, ему диплом не нужен, это предыдущий хотел диплом )
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #11 : 22-02-2010 15:15 » |
|
а чем ты смотришь данные с порта? Я так понимаю, что внешнее устройство что-то пихает в собственном формате, и ты пытаешься это формат "раздербанить" И описания на внешнее устройство тоже нет.
Поэтому. 1. Управляющее устройство (мастер) посылает запрос и ждет ответа от твоего девайса 2. Твой девайс (слейв) что-то присылает в неизвестном тебе формате.
Команды которые посылает мастер известны?
Второй вариант, будет потяжелее. слейв все время что-то пуляет в порт, видимо межде посылками существует какой-то временной промежуток (ведь надо как-то отделять даннные)
Как это все работает?
Что это за девайс?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Kivals
|
|
« Ответ #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
|
|
« Ответ #14 : 24-02-2010 07:20 » |
|
alex003, не жадничай, покажи возможные запросы от мастера и ответы от слейва (соответственно) Ибо по одной выборке сложно что сказать. И не надо показывать символьного представления - хочу видеть вот такое Запрос | Ответ | 2F 30 31 30 30 35 35 30 30 3A 3A 2E 0D | FF 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
|
|
« Ответ #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
|
|
« Ответ #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)));
}
Если где-то ошибся - все может быть Пробуй! У тебя все получится. Советую сначала подогнать свои запросы под эталон, потом разбираться с ответами.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|
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
|
|
« Ответ #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
Участник
Offline
|
|
« Ответ #22 : 26-11-2010 16:57 » |
|
Подскажите как можно узнать, что ожидание ответа при выполнении ReadFile() завершилось по таймауту? Например если вызвать эту функцию с нулевым таймаутом в дополнительном потоке и ждать один символ, то пока он не придет, то этот поток дальше не пойдет. Я правильно понимаю? Я хочу организовать ожидание ответа девайса по ком порту. При отправке ему команды, от него приходит ответ. Поток при получении первого байта продолжает работу, я меняю таймаут на 50мс, например и складываю пришедшие данные во временный буфер. После прочтения всех данных, поток ожидает и так как больше данных нет, завершается по таймауту и я отправляю временный буфер на обработку, а таймаут перевожу опять на вечное ожидание. Так вот как узнать, что этот таймаут произошел? И вообще, правильна ли моя теория? И нужно ли как-то оповещать порт, что один символ прочитан или запускать какую-нить процедуру\функцию после чтения? Спасибо.
|
|
« Последнее редактирование: 26-11-2010 19:16 от Karrakurt »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Участник
Offline
|
|
« Ответ #24 : 26-11-2010 19:23 » |
|
Алексей1153++, но тогда ведь придется запускать цикл и все время проверять нет ли чего в буфере? или использовать что-то типа WaitCommEvent? Или по пришествии первого байта(по предложенному мною способу выше) проверять dwdCount? В принципе, без посылки какой-либо команды девайс общаться не должен, можно запускать прием данных только после отсылки команды, стоит ли тогда усложнять код?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 27-11-2010 10:56 » |
|
Karrakurt, опрос порта у тебя же всё равно в отдельном потоке будет ? А там цикл есть
|
|
|
Записан
|
|
|
|
Karrakurt
Участник
Offline
|
|
« Ответ #26 : 27-11-2010 14:33 » |
|
Алексей1153++, Ну это да. Я просто про процессорное время подумал. Сколько раз в секунду будет происходить опрос. В общем вот еще вопросики: Если в дополнительном потоке я ставлю ожидание события, то какое событие ждать? Мне нужно знать пришли ли данные, это что EV_RXCHAR? Т.е. я выставляю маску с помощью SetCommMask, вызываю ожидание посредством WaitCommEvent и поток замирает пока это событие не произойдет, правильно? Далее вызываю ClearCommError для получения размера пришедших данных и потом уже ReadFile, так? Ничего не пропустил? И еще, если дополнительный поток находится в ожидании событий, из первого потока я могу послать данные? А то когда я пробовал в дополнительном потоке ждать один символ с помощью РидФайла, а из основного писать данные, то прога повисала. Подумал что из-за этой причины... Пока все, буду ждать ответа.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 27-11-2010 15:04 » |
|
Karrakurt, если без ожидания событий, то опрос в цикле посредством функции ClearCommError можно делать так: в цикле - делается опрос, если ничего нет, ждём 50 мс (Sleep(50) ) - зачем новая итерация. Про события ничего не подскажу - не доводилось пользоваться Как-то не пригодилось ни разу ждать событие, обычно мне нужен именно опрос в цикле
|
|
|
Записан
|
|
|
|
|