Arlleex 185 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 12 минут назад, artemkad сказал: Забавно использование аппаратного таймера в виде костыля который каждую миллисекунду обновляет текущую позицию в очереди. Меня-бы жаба задавила тратить на это помимо DMA еще и таймер... Полистайте свои проекты, посмотрите, какой процент утилизации таймеров в среднем. У STM32 их за пару десятков. Неужели жалко? Хорошо, раз жалко - содержимое обработчика переименовать в функцию rxPeriodicHandle() и вызывать из любой периодической локации, либо запихнуть внутрь readRxFIFO(). В любом случае, когда длина принимаемого потока заранее не известна, а символов-маркеров нет (ни аппаратных, ни МК-зависимых средств их обнаружения тоже), Вам придется время от времени подсматривать во входной буфер "а че када там уже?". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 89 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 2 часа назад, tonyk_av сказал: А вы вообще представляете, как выполняется синтаксический разбор? Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке. 2 часа назад, tonyk_av сказал: При разборе идёт посимвольное, никакие строки не_нужны. И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 50 минут назад, artemkad сказал: И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает? Я много сообщений назад приводил конкретный код. В нём был переход по метке not_found. Но как видно - Вы его не прочитали. Или не поняли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Новый вопрос. Есть буфер, объявленный следующим образом TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>; Сразу скажу тем, кто будет предлагать альтернативу - буфер должен быть объявлен так и только так, этого требует библиотека под Андроид, работающая с Bluetooth. Заполнил буфер классически, для эксперимента buffer->set_length(6); (*buffer)[0] = 'r'; (*buffer)[1] = 'e'; (*buffer)[2] = 's'; (*buffer)[3] = 'e'; (*buffer)[4] = 't'; (*buffer)[5] = 0x0D; Работает, ура, микроконтроллер принимает строку "reset" Но, идем дальше, вот структура typedef struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; } tINFO_VAR; tINFO_VAR INFO_VAR; Как ее скопировать в buffer? Выделить из структуры каждую переменную, разобрать на байты и записать побайтово буфер я могу, но хочется поизящнее. Если пробовать в лоб - buffer=&INFO_VAR -ругается на несоответствие типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 1 hour ago, artemkad said: Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке. Не совсем поиск лексем, но можно как ориентир рассматривать. Индусский код для проверки на True (Java) String.valueOf(myBoolVar).length() == 4 Пошёл за третьим пакетом попкорна 3 minutes ago, MementoMori said: Как ее скопировать в buffer? Для начала определитесь как её будет принимать 'библиотека под Андроид'. В частности её не поплохеет если вместо текстовой строки от вашего BT приедет 'нечто' (совсем бинарное и на текст не похожее) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 89 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 52 минуты назад, jcxz сказал: Я много сообщений назад приводил конкретный код. В нём был переход по метке not_found. Помнится там было: 23 часа назад, jcxz сказал: одновременно с приёмом символов в строку посчитает их хеш (CRC32 например) а тут предлагалось: 4 часа назад, tonyk_av сказал: При разборе идёт посимвольное, никакие строки не_нужны. Не кажется, что это слегка не в ту степь? Не говоря уже о том, что в твоем варианте неясно когда заканчивать расчет хэша и начинать поиск по таблице. Предлагаешь полный поиск при приеме каждого нового символа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 35 minutes ago, xvr said: приедет 'нечто' (совсем бинарное и на текст не похожее) Как на Ваш взгляд, байт - это бинарное, на текст не похожее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 89 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 46 минут назад, MementoMori сказал: Но, идем дальше, вот структура typedef struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; } tINFO_VAR; tINFO_VAR INFO_VAR; Как ее скопировать в buffer? Как вариант; typedef union { unsigned char buffer[BUFFER_SIZE]; struct { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; } ; }tINFO_VAR; Впрочем, от копирования там особо смысла мало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба On 4/11/2023 at 1:39 PM, artemkad said: Как вариант; Тогда уж typedef union { struct data { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; }; unsigned char buffer[sizeof(struct data)]; }tINFO_VAR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 2 hours ago, artemkad said: И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает? Приплыли. Предлагаю сначала разобраться по примерам Вирта и Страуструпа, как выполняется разбор, а потом уже задавать глупые вопросы. 23 minutes ago, artemkad said: неясно когда заканчивать расчет хэша и начинать поиск по таблице Ещё одно подтверждение того, что сначала нужно изучать принципы синтаксического разбора. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 89 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 5 минут назад, tonyk_av сказал: Предлагаю сначала разобраться по примерам Вирта и Страуструпа, как выполняется разбор, а потом уже задавать глупые вопросы. Конкретнее пли-и-из. Приведи место в книгах Вирта и Страуструпа вместо тупых ничего не означающих намеков на авторитет. Если ты не понял, я телепатом не являюсь что-бы знать чего там ты имел ввиду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Just now, artemkad said: Приведи место в книгах Вирта и Страуструпа вместо тупых ничего не означающих намеков на авторитет Открываешь книжку Вирта и смотришь оглавление. У Страуструпа синтаксический разбор показан в примере калькулятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 89 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Только что, tonyk_av сказал: Открываешь книжку Вирта и смотришь оглавление. У Страуструпа синтаксический разбор показан в примере калькулятора. Тебе сюда все оглавление Вирта привести что-бы показать что в оглавлении нет примеров или таки уточнишь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 1 hour ago, xvr said: В частности её не поплохеет если вместо текстовой строки от вашего BT приедет 'нечто' (совсем бинарное и на текст не похожее) ? Вот: (*buffer)[0] = 0xAA; (*buffer)[1] = 0xBB; (*buffer)[2] = 0xCC; (*buffer)[3] = 0xDD; (*buffer)[4] = 0xEE; (*buffer)[5] = 0x0D; И программа это проглотила, и железо передало, а другое железо приняло. Может все таки на вопрос ответите? typedef union { struct data { unsigned int TimePosition; unsigned char WORK_STATE; unsigned char POWER_REGULATION_MODE; }; unsigned char buffer[sizeof(struct data)]; }tINFO_VAR; Хорошо, сделал я так, потом объявил переменную И как тогда обращаться к TimePosition? И как это копировать в buffer, который объявлен в TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 35 минут назад, artemkad сказал: Не кажется, что это слегка не в ту степь? Не говоря уже о том, что в твоем варианте неясно когда заканчивать расчет хэша и начинать поиск по таблице. Предлагаешь полный поиск при приеме каждого нового символа? Вроде как должно быть очевидно, что UART выдаёт символьный поток входящих данных. Который естественно обрабатывается посимвольно. О чём вам и писали. Обрабатывая его посимвольно, находим границы (начало и конец) ваших лексем. И, найдя их, считаем хеш от тех символов, которые находятся в границах лексем. Когда происходит переход за заднюю границу лексемы (обнаруживается её конец), то тут и производим поиск по таблице накопленного к этому моменту хеша. Всё вышеописанное должно быть априори известно любому более-менее опытному программисту, который когда-либо парсил строки, поступающие из UART. Это потоковая, посимвольная обработка. Без всяких буферов, строк и прочей ненужной шелухи. Быстрая. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться