|
0 / 0 / 3
Регистрация: 16.11.2009
Сообщений: 45
|
|
Перебор содержимого COM порта26.01.2010, 17:13. Показов 2678. Ответов 10
Метки нет (Все метки)
Ситуация такая.
Каждые пару миллисекунд на COM порт приходят команды вида "@03...\r","#01...\r","!01...\r". команд много и они разные. Периодически, раз в 10 миллисекунд обращаюсь в COM порт за данными. одной командой забираю содержимое порта. с этим проблем нет. для проверки закидываю содержимое ком порта в поле мемо. Все отлично, приходит без ошибок, буфер ком порта не переполняется. Почти всегда читаю с ком порта неполные команды, где начало в одной посылке (символы !03 или другие), а конец (\r) в следующей. когда команды сливаются в мемо, видно, что они правильные. Логика такова - команда начинается после \r и заканчивается им же. (теряю самую первую посылку ну и хрен с ней) Теперь вопрос. Какой придумать алгоритм, чтобы обрабатывая посылку с ком порта, при нахождении \r начинать запись в какую то переменную, а при следующем нахождении \r в следующей посылке или в нынешней передавать полученную команду далее(например разбирать команду побитово-это прога телемеханики), и одновременно начинать запись в эту же переменную новой команды. Для тех, кто заинтересуется, пользуюсь ComPort Library version 3.10 для Билдера Я не прошу код, прошу подсказать идею, всем отделом сегодня мучались, так и не придумали. Вот чувствую, что тут просто, но додуматься уже не могу.
0
|
|
| 26.01.2010, 17:13 | |
|
Ответы с готовыми решениями:
10
Перебор на совпадение содержимого для части массива Перебор содержимого LIST<>: попарно сравнить все элементы листа исключая возможность повторения
|
|
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
|
|||||||||||
| 26.01.2010, 17:49 | |||||||||||
|
Ну.. можно сделать так:
В потоке, где вы читаете данные с ком порта: Предположим, что ваша функция, которая читает данные с порта называется int ReceiveData(char * InputBuffer) Она заполняет InputBuffer данными из COm порта и возвращает число считанных эллементов. тогда:
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 7
|
||
| 26.01.2010, 18:07 | ||
|
Доброго времени суток!!!
Считывайте по одному биту из буфера КОМ порта. До первого приема "/r" все выкидываем (
0
|
||
|
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
|
||
| 26.01.2010, 18:40 | ||
|
Это сколько обращений к порту необходимо будет сделать, чтобы считать несколько килобайт? И вообще не понятно, зачем. разве нельзя считать пару сотен байт, а потом их проанализировать, пробежав по массиву?
0
|
||
|
0 / 0 / 3
Регистрация: 16.11.2009
Сообщений: 45
|
||
| 27.01.2010, 15:39 [ТС] | ||
|
Зоти Сергей, на попытку засунуть код в прогу, компилятор ругается с ошибками:
typedef vector<char> CCharVector; - [C++ Error] Unit1.cpp(14): E2257 , expected CCharVector VectorOfChar; - [C++ Error] Unit1.cpp(15): E2141 Declaration syntax error а за идею спасибки!!
0
|
||
|
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
|
|||||||||||
| 27.01.2010, 15:56 | |||||||||||
|
добавьте #include<vector.h>
Добавлено через 1 минуту и сразу за этим напишите: typedef vector<char> CCharVector; а уже остальное в вашей функции чтения с ком порта... типа
А не счет typedef vector<char> CCharVector; Мы ведь не знаем, сколько комманд получим с ком порта, по этому создавать фиксированный массив для хранения данных типа BYTE было бы не удобно. С помощью vector<char> вы содаете "список" переменных типа char (по сути это тоже самое. просто работать удобней) Чтобы добавить новый символ используется ф-ция push_back. Чтобы получить актуальный размер списка, просто опрашиваете функцией size(). Например:
0
|
|||||||||||
|
0 / 0 / 3
Регистрация: 16.11.2009
Сообщений: 45
|
|
| 27.01.2010, 16:07 [ТС] | |
|
Тогда следующий вопрос. как мне извлечь из вектора команд сами команды типа char?
Заранее простите за глупые вопросы, не изучал эту тему, а решение нужно найти быстро.
0
|
|
|
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
|
|
| 27.01.2010, 16:49 | |
|
например так:
Edit1->Text=(char*)&VectorOfChar[0]; или Memo1->Lines->Add((char*)&VectorOfChar[0]); Тоесть, где я написал "ProcessCommand(VectorOfChar);", в этом месте VectorOfChar состоит из готовой команды. и если вы там напишите Memo1->Lines->Add((char*)&VectorOfChar[0]); то пришедшие команды будут добавляться в Memo1
0
|
|
|
0 / 0 / 3
Регистрация: 16.11.2009
Сообщений: 45
|
|
| 27.01.2010, 19:28 [ТС] | |
|
Очистил вектор командой .Clear();
посмотрел на ситуацию... Зоти Сергей, вы молодец, очень интересный способ, он почти работает, только есть одно но. по работе программы я понял, что получается не совсем то. В вашем методе при обработке КАЖДОЙ посылки с ком порта теряется самая первая команда. а я задумывал, что самая первая команда в самой первой посылке от ком порта теряется, а остальные, если не влезли в буфер команды запроса данных, обработаются в остальных посылках... Например. прислалось @0432234\r@0432234\r@0432234\r@0432234\r @0432234\r@043 - тут не влез в буфер, остался в ком порте... 2234\r@0432234\r@0432234\r@0432234\r- следующая посылка с ком порта,и тут остаток предыдущей команды. В идеале, я теряю самый первый @0432234\r в первой посылке. остальные я должен обрабатывать. согласно алгоритма, из первой посылки я извлекаю 4 команды (самая первая теряется), а во второй посылке извлекается 4 команды (остаток "2234\r" я не должен потерять) а в вашем алгоритме, к сожалению, такого нет.
0
|
|
|
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
|
||||||
| 27.01.2010, 23:28 | ||||||
|
А ёё... да. согласен. Просто писать вслепую.. По этому не учел.
В данном случае тогда вообще просто:
0
|
||||||
|
0 / 0 / 3
Регистрация: 16.11.2009
Сообщений: 45
|
|||||||||||
| 01.02.2010, 10:06 [ТС] | |||||||||||
|
Большое спасибо за ответы. Метод действует великолепно. Приведу окончательный код, т.к. в предыдущих были мелкие ошибки.
написал 2 метода, один помельче, другой покрупнее.
второй способ
0
|
|||||||||||
| 01.02.2010, 10:06 | |
|
Помогаю со студенческими работами здесь
11
Чтение из COM порта, При чтении из порта зависает read() Перемещение содержимого ячейки Б в ячейку А при удалении содержимого в ячейке А Вывод содержимого папки(такой то) и содержимого дисков Отправка содержимого поля в файл при нажатии кнопки без потери этого содержимого с поля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|