Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93

Оптимизация чтения с COM - порта

24.11.2013, 18:22. Показов 2738. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И снова здравствуйте, у меня возникла проблема, от которой уже мозги кипят.
Разобраться с ней вроде бы не сложно, но у меня уже не хватает ни терпения, ни сил, поэтому и прошу помощи у вас.

Имеется у меня rfid-сканер (считывалка данных с магнитных карт) подключенный к com-порту. Все отлично работает, данные считываются. Но реализовал я это все достаточно криво и пытаюсь теперь оптимизировать.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private void karta(string id_karty)
        {
            Core.AutCode cod = new Core.AutCode();      // создаем экземпляр класса, в котором шифруется id карты
 
            String str = "";      // сюда мы запишем id карты
            String str_coded = "";      // сюда зашифрованный id карты
            int key;      // ключ с помощью, которого будем шифровать
 
            rfid.Open();      // открываем порт
            rfid.ReadTimeout = 10000;      // даем 10 сек на считывание с порта
            while (str_coded != id_karty)      // id_karty - правильное значение из базы
            {
                str = rfid.ReadLine();      // считываем id карты
                key = cod.key_create(str);      // создаем ключ для шифрования
                str_coded = cod.in_code(str, key);      // шифруем id с помощью ключа
            }
            rfid.Close();    // закрываем порт
        }
Как это все выглядит на деле?! Пользователь нажимает кнопку "войти" высвечивается сообщение "приложите карту" и тут все зависает (до тех пор пока пользователь не приложит нужную карту или же не истечет 10 сек). На это две причины, использование цикла while и вот эта вот строчка :
C#
1
str = rfid.ReadLine();      // считываем id карты
Меня не совсем устраивает то что все зависает. Решить это можно, на мой взгляд, с помощью многопоточности. Это не лучший вариант решения, но я думаю оставить все так же, просто добавив на форму таймер и label. И сделать, допустим, при нажатии на вход label с текстом "приложите карту... " + t, где t = 10, 9, 8 ... 0 в зависимости от таймера.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2013, 18:22
Ответы с готовыми решениями:

Остановка чтения из COM-порта
Здравствуйте, уважаемые. Возник вопрос: как принудительно остановить чтение из COM-порта. у меня получается, что пока идет чтение,...

Ошибка чтения порта
Нужно считать байт с порта, я использую операцию in, и записываю в регистр AL (восьмиразрядный), при указании порта <0FFh (255)...

Метод чтения байтов из порта
Добрый день! Почему ругается компилятор ? Как исправить ? Спасибо! private: System::Void serialPort2_DataReceived(System::Object^ ...

8
64 / 63 / 7
Регистрация: 19.03.2013
Сообщений: 207
24.11.2013, 19:39
rfid это объект SerialPort?
0
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93
24.11.2013, 21:03  [ТС]
Цитата Сообщение от Rust511 Посмотреть сообщение
rfid это объект SerialPort?
Да

C#
1
SerialPort rfid = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
Я так думаю нужно воспользоваться BackgroundWorker, что бы пока мы ждем правильной карты, на форме менялся текст label в зависимости от таймера, что то вроде "фонового потока" как я это понимаю. В теме про BackgroundWorker все очень хорошо расписано. Но, я уже не соображаю что делаю честно говоря, нужно со свежей головой туда глянуть и все получится я думаю.
0
64 / 63 / 7
Регистрация: 19.03.2013
Сообщений: 207
24.11.2013, 21:11
у класса SerialPort есть событие DataReceived. может в этой стороне поискать. Приложили карту, идет сигнал на ком порт, происходит DataReceived
0
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93
25.11.2013, 00:38  [ТС]
Да, были такие мысли. Просто хотелось бы разобраться BackgroundWorker. На сколько я понимаю им обеспечивается многопоточность, а это что то интересное для меня. Завтра еще попробую на свежую голову, если не получится то пойду по следу DataRecevied.
0
64 / 63 / 7
Регистрация: 19.03.2013
Сообщений: 207
25.11.2013, 09:08
я могу конечно ошибаться, но для объекта SerialPort всегда выделяется отдельный поток.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.11.2013, 15:12
Цитата Сообщение от Rust511 Посмотреть сообщение
я могу конечно ошибаться, но для объекта SerialPort всегда выделяется отдельный поток.
Вы абсолютно правы.
Надо только добавить, что выделяется не просто отдельный поток, а отдельный поток из специального резерва, который среда держит исключительно для обработки IO.
То есть "обычные" потоки из пула не будут заняты обработкой этих данных, а значит будут доступны для других компонентов приложения.
0
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93
25.11.2013, 16:29  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Вы абсолютно правы.
Надо только добавить, что выделяется не просто отдельный поток, а отдельный поток из специального резерва, который среда держит исключительно для обработки IO.
То есть "обычные" потоки из пула не будут заняты обработкой этих данных, а значит будут доступны для других компонентов приложения.
Возможно и так, НО посмотрите еще раз на код, там в цикле есть строчка

C#
1
str = rfid.ReadLine();
Возможно я могу ошибаться, но как я понимаю, когда компилятор доходит до нее, он останавливается и ждет когда считается строчка, а пока он встал вся GUI тоже встает.
0
64 / 63 / 7
Регистрация: 19.03.2013
Сообщений: 207
25.11.2013, 17:51
я поэтому DataReceived и предложил. думаю это самый оптимальный вариант
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.11.2013, 17:51
Помогаю со студенческими работами здесь

Функция чтения ком порта
Господа помогите новичку. Необходимо написать функцию чтения строк с ком порта длина которых больше 19. DLL_API DWORD COM_Read( DWORD...

Не работает поток чтения из COM порта
Программа открывает COM порт и шлет в него 8-ми битное значение. Поток передачи работает: на TX повесил светодиод - вспыхивает, а вот поток...

Sleep во время чтения Serial порта
Доброго дня форумчане! Вопрос по работе с последовательным портом. Есть устройство, которое передаёт подряд данные. Вот я читаю 5...

Помогите с макросом чтения-записи порта
Всем здрасти! Прошу помощи. Сам не могу разобраться :( Нужно организовать программу чтения и записи в порт, где в качестве...

Драйвер чтения данных из СОМ-порта(Ассемблер)
Доброго времени суток,может завалялся у кого драйвер DOS на ассемблере под COM-порт(без разницы на какой,очень нужна простейшая основа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru