![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
medicdim |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Ситуация следующая:
Есть обработчик события DataReceived КОМ-порта. От устройства подряд идут несколько сообщений с интервалом ~0.5 сек. Если я просто записываю в буфер, всё ок, но когда я добавляю в обработчик более ресурсоёмкий код, то обрабатывается только первое сообщение т.к. все последующие приходят раньше, чем выполнилась обработка первого... такой код отрабатывает нормально:
а такой нет:
уже неделю ломаю мозг... помогите! |
||||
|
|||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
Мое предложение:
-организовать очередь (Quee) и при возникновении события запускать фоновый поток записи полученных данных в эту очередь -основной поток пусть разгребается с поступившими сообщениями читая их из очереди |
|||
|
||||
Crypton |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 9.10.2006 Где: США, Санкт-Петерб ург Репутация: нет Всего: 2 |
Вставлю свои пять сом.
Когда я разрабатывал свою библиотеку для сего девайса столкнулся с такой же проблемой. Коммуникация происходит пакетами как <№ команды><Длина данных, byte><Данные, много байтов><CRC16>. Так вот. Весь прикол в том, что ЖК монитор мог в любой момент послать пакет от напр. нажатия кнопки, и другие данные. Пытался юзать подписку на событие как ты и сказал но имхо слишком глючновато получилось. Выход такой нашел. Создать статичный в твоем классе объект SerialPort-а и иметь два потока: обычный и читающий. В обычном все происходит как и есть, но читающий зациклен через while читая приходящие данные по-байтово. При открытии порта просто-напросто запускаю читающий поток и вперед. Вот пример с библиотеки (читатель):
надеюсь поможет чисто теоритически ![]() Добавлено через 1 минуту и 28 секунд Это в конструкторе класса
--------------------
«Все, что вы знаете — ложь» Теория мироздания |
||||
|
|||||
medicdim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Вобщем, попробовал я сделать довольно примитивно: при событии DataReceived кидаю всё, что есть в буфере ГСМ шлюза в строку, а потом по таймеру эту строку читаю и, если там что-то есть произвожу необходимые операции.
Так вот, в Windows Forms приложении эта реализация отлично работает.... Но когда я этот код включил в Windows Service, в сформированной строке получается какая-то абра-кадабра (данные не полные и порезаны на произвольные куски) Должно быть: at+cmgl="ALL" +CMGL: 1,"REC READ","5400",,"09/09/09,13:07:47+0<" Vasha energichnost i zhizneradostnost pomogut zavoevat vnimanie interesuyuschego vas cheloveka. Smelo proyavlyayte initsiativu. +CMGL: 2,"REC READ","5400",,"09/09/09,15:01:46+0<" Kiev pogoda: SR Chastichno solnechno 23 /12 , CHT Solnechnyj 25 /14 , PT Chastic hno solnechno 23 /13 +CMGL: 3,"REC READ","+380933149917",,"09/09/09,16:00:53+12" Ping 172.21.1.147 +CMGL: 4,"REC UNREAD","5400",,"09/09/09,19:02:25+0<" Kiev pogoda: SR Solnechnyj 25 /13 , CHT Solnechnyj 26 /15 , PT Chastichno solnec hno 24 /13 +CMGL: 5,"REC UNREAD","5400",,"09/09/10,09:17:29+0<" Vy mozhete trebovat zhelaemogo, est veroyatnost, chto vashi trebovaniya budut pr iznany obosnovannymi i dazhe udovletvoreny. +CMGL: 6,"REC UNREAD","5400",,"09/09/10,10:10:00+0<" Kiev pogoda: CHT Solnechnyj 26 /14 , PT Silnaja oblachnost 25 /13 , SB Solnechny j 22 /11 OK а получается: +CMGL: 2,"R Kiev pogoda: SR Solnechnyj 25 /13 , CHT Soln 10,10:10:0 /13 , SB Solnechny j 22 /11 и всё... ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |