![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| UniBomb |
|
||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
Пробежался по поиску, но ответов на следующие вопросы не нашёл, если баян - простите...
Итак, накачав кучу литературы по работе ком-портом в синхронном режиме - сдеал - всё работает, но в глаза бросаются откровенные минусы синхронной работы, скачал кучу литературы по работе в асинхронном режие - есть вопросы. Во-первых - у меня реализована инициализационная часть, части приёма/передачи данных, но не могу понять, куда мне надо впихнуть ожидающую часть.
По идее, этот кусок кода в фоновом режиме ожидает наступление одного из событий, после чего становится ясно, что произошло. Так вот, я не могу понять, куда его впихнуть, что бы вместе с ожиданием делать что либо ещё. Если вставить в тело программы в цикл с бесконечным числом иттераций (циклов), то программа попросту виснет (на самом деле просто ждёт события), чего по идее в асинхронном режиме не должно быть. Пока остановился на варианте выполнения этого куска по таймеру, установленному на 2 мс (во вотором параметре функции вейтворсинглобжект стоит значение 1 мс). Так как же всё таки должно быть??? Второй вопрос - какой функцией можно воздействовать на состояние таких выводов как RTS, CTS, DTR, DSR, RI, ERROR? Вопрос третий - может проще работать с какой-либо компонентой? Если у кого есть пожелания - прошу высказать. Ниже приведён полный код тестового проекта:
Если есть какие-то замечания, то прошу их высказать. И наконец - есть ли у кого литература по кольцам защиты? Если есть, киньте линк, пожалуйста. ЗЫ:. любителей посылать в гугл, яндекс и в прочие нечистивые места просьба не беспокоится - уже были, ничего толкового не найдено... |
||||
|
|||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
прошло три дня, ответов нет...
|
|||
|
||||
| witex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
Скажи что у тебя за прибор?? Это раз!
Во вторых, обычно приборы любят делать так! Вначале принимают какой то контрольный сигнал обычно или '\r' или '\n'. Так что попробуй чтонить ему вначале послать чтобы потом принять! --------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
| serge_mok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.12.2006 Репутация: нет Всего: нет |
попробуй например так, у меня работает, правда не озадачивался насколько программа "подвисает"...
memset(&ovr,0,sizeof(ovr)); ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); ... ReadFile(port,buf_in,strlen(buf_in),&bc,&ovr); if(WaitForSingleObject(ovr.hEvent,100)==WAIT_OBJECT_0) { GetOverlappedResult(port,&ovr,&bc,FALSE); } else { // Обработка ошибки MessageBox("Устройство не отвечает!","Error",MB_OK); ExitProcess(1); } кстати общий таймаут по передаче неплохо бы сделать например 150. А просто в режиме оверлэпид не пробовал(при открытии порта), вроде тогда передача/приём должны быть в фоновом режиме? Если я чего то недопонял, то это не со зла Добавлено @ 09:08 кстати вот ещё: EscapeCommFunction(port,SETDTR); //установка DTR,... RTS е установить dcb->fDtrControl=RTS_CONTROL_TOGGLE; то RTS будет автоматически уст-ся при предаче соот-но: CTS, DSR, RI, - входа, на них воздействуй внешним устр-ом либо своими же DTR, RTS а зачем тебе они нужны, делаешь RS485? |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
witex,
По сути дела не важно что за прибор - главное что он есть и полоностью функционален, да и вопрос не в этом. Прибор все данные принимает и отправляет как надо (даже написана тестовая программа для прибора, который выаёт в ответ нужное количество байт). Вопрос в том, где разместить блок ожидания
и почему программа всё равно подвисает. Кстати прибор нашего производства, прошивка для него была написана мной, общается он по RS-485, но там всё намного проще - писал на асме и имел прямой доступ ко всем регистрам, вот если бы прочитать где-нить про нулевое кольцо, что бы из него можно было иметь прямой доступ к регистрам.... serge_mok, а почему ты сначала читаеш из файла, а потом ждёш каких либо событий? А по сигналам всё просто - хочется побаловаться.... |
|||
|
||||
| serge_mok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.12.2006 Репутация: нет Всего: нет |
По твоему коду... не знаю, скажу только одно пробовал также через
WaitCommEvent(port, &EventMask, &OL); толку никакого, не пошло. Сначала читаю , а потом жду?...ну это,я как бы пытаюсь отловить ошибку приёма. поскольку я считаю что задал асинхр режим , то насчёт подвисаний не озадачиваюсь(хотя я озадачился в корректности что твой вариант для синхр работы порта. не пробовал в своём случае задавать синхр режим ? А в чём подвисание выражается?, при приёме? Есть ещё такой примерчик: port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); PurgeComm(port,PURGE_RXCLEAR); . . . SetCommMask(port,EV_RXCHAR); WaitCommEvent(port,&mask,NULL); //ожидаем первый символ в буфере, а потом читаем в синхр реж ReadFile(port,buf,100,&bc,NULL); . . . Про нулевое кольцо?, по моему где то попадалось, мне эта тема тоже интересна По сигналам ещё, там хрень такая...задержки на вкл/выкл неопределённые, от 5 до 20 мс ,так что... Да вот ещё , по поводу иниц порта: dwShareMode - Задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать разделяемыми, поэтому данный параметр должен быть равен 0. а у тебя там чего то задано...глянь ещё раз... кстати , не в тему, перешёл с асма на СИ...это просто сказка, прогр пишется с пол пинка... |
|||
|
||||
| UniBomb |
|
||||||||||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
[quote]
serge_mok, Насчёт синхронной/асинхронной работы - если шестой параметр функции CreateFile равен значению FILE_FLAG_OVERLAPPED, то он открывается в асинхронном режиме, если 0, то в синхронном. Поэтому перечитай то, что ты читал до этого... Насчёт "читаю а потом жду" - вообщето есть другой механизм (он есть у меня в коде) - ты когда вызвал функцию чтения, но она ничего не прочитала, то смотри значение GetLastError(), если оно равно кажися значению ERROR_IO_PENDING, то это значит в данный момент асинхронная операция выполняется и следует обождать ещё немного времени.
в данном примере ты открываеш порт только на чтение, причём в синхронном режиме. Второй строчкой ты просто очищаеш буфер приёма порта (тот самый файл). Тут нет ничего необычного.
Если бы всё было так просто... Как раз такой кусок кода и будет подвисать, так как фнкция ReadFile прочтёт только тогда, когда все байты будут приняты или не истечёт время на чтение. А так как в синхронном режиме чтение происходит в том же потоке где и работает твоя программа, то соответсвенно она просто на какое-то время зависнет (т.е. просто не будет возврата из функции чтения)
У меня там вообщето стоит FILE_SHARE_READ | FILE_SHARE_WRITE, но если чесно, то не помню откуда я это взял... Просто ctrl+c, ctrl+v и больше CreateFile не трогал...
Чего и следовало ожидать, ты ещё попробуй Си++ - это вообще пипец!!!
|
||||||||||||
|
|||||||||||||
| serge_mok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.12.2006 Репутация: нет Всего: нет |
Я про ATMeg'у и имел ввиду, ты думал я для персоналки на асме пишу?...
про разницу между синх и асинх реж , а также что у меня в моём коде задано я в курсе... Если так критично, тогда выделяй работу с портом в отдельный поток... |
|||
|
||||
| UniBomb |
|
||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
serge_mok,
А-А-А-А-А-А, вот оно что...
Вообще кретично, но с асинхрроным режимом выпендриваться со вторым потоком не нужно... Надо только да конца с ним раобраться... Обращение к модерации: Раз уж тема не является источником ответов на мои вопросы, то воизбежании дальнейшего флудоблудия прошу тему дизасемблировать и аннигилировать в анналы истории... |
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
UniBomb, пля! Сразу бы сказал, что протокол у тебя 485. Там ведь надо реально регистры подергать. Я не нашел в свое время. Но у меня было все проще - делали переходник 232 - 422 и все было нормально. Тебе надо делать железяку переходник, который будет дергать(взводить) регистры или чего там а соответствии с 485. Походу в виндовс 2000 и выше нельзя без нулевого кольца, но потом новая версия - новый драйвер. Нафига это надо? Работай по 232 и через переходник его...
Добавлено @ 14:55 И ещё, в асинхронном не работай, поищи по форуму, я там долго тему подымал. В итоге сейчас сосу постоянно и синхронно в отдельном потоке по 1 байту, ничего особенно не тормозит. Ты только свой асинхронный/синхронный не путай с виндосовским -------------------- я не гольфист - я хоккеист |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
takedo,
Во-первых - не надо путать протокол с интерфейсом! Протокола rs485 не существует, есть только интерфейс. Во-вторых - реально регистры дёргать не надо! Их вообще дёргать не надо! В-третьих - есть прибор, который общается по интерфейсу RS-485, протокол самопальный, но это не суть. До этого времени приборы отлично между собой общались, общаются и будут общаться, но возникла необходимость всё это дело мониторить на компьютере. Конвертер RS-232 - RS-485 есть, он полнофункционален и, что самое главное, рабочий. В-четвёртых - в интерфейсе RS-485 используются только информационные линии (две синфазные в полудуплексном режиме и четыре в полнодуплексном), никаких линий состояния и в помине нет! В-пятых - мне нужна программа, которая могла это дело мониторить и, в случае необходимости, запрашивать какие-либо данные. В-шестых - основной вопрос изложен в первом посте топика... Это сообщение отредактировал(а) UniBomb - 11.12.2006, 17:48 |
|||
|
||||
| serge_mok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.12.2006 Репутация: нет Всего: нет |
вчера попробовал работать со скоростью 38400, как у тебя, устойчивой связи не получил...точнее вообще никакой, начались сработки таймаутов, начались тормоза...правда у меня атмега с внутр рц-осциллятором, калибровочный байт не помог. Ты не задумывался что проблема не в программной части, а в аппаратной...е уже долго персоналку трахаешь ,а толку нет, может дело не в ней?, чюдес ведь не бывает...
|
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Делай синхронно в отдельном потоке - меньше запарки. Ну а вообщето я сначала не врубился, что у тебя проблема с асинхронным режимом -------------------- я не гольфист - я хоккеист |
|||
|
||||
| UniBomb |
|
||||||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
serge_mok,
ну это зависит только от внутренего рц-осцилятора. Выходная скорость расчитывается по формуле BAUD = f(ck)/16(UBRR+1), где BAUD - это полученная скорость, f(ck) - частота камня, а UBRR - регистр "скорости". Эта формула справедлива для асинхронного режима (в смысле без стробирующей линии, не путать с асинхронным режимом работы с файлом) без удвоения скорости. Внутренний осцилятор естетсвенно никогда не выдаст то значение, которое указано в даташите и в связи с этим и так неточный баудрейт может гулять ещё больше... А может ты просто не так его сконфигурировал. Кинь лучше инициализационную часть....
Задумывался и неоднократно. Но есть рабочий конвертер и рабочие программы-мониторы ком-порта. Вся аппаратная часть работает. takedo,
На моё нежелание создавать второй поток есть несколько причин: 1 - проще всё таки работать в асинхронном режиме 2 - фамильная упёртость, непозволяющая мне бросить незаконченное 3 - я не умею работать с потоками.... я ничего о них не знаю...
основного кода всего 15 строк, остальное я втавил для того, что бы показать, в каком метсе моего проекта находятся те 15 строк... ЗЫ:. А вообще прости меня за мой последний пост... |
||||||||
|
|||||||||
| serge_mok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.12.2006 Репутация: нет Всего: нет |
UniBomb,
да это не проблема, моё устройство(е его можно так назвать) вообще не для этого предназначено было, это макет для работы с граф ЖКИ а по поводу иниц , я ж говорю, на СИ перешёл, там встроенный билдер периферии - иниц автоматич делается, только нужно крыжиком не ошибиться а ты наверно немецкий учил, или мне показалось? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |