Перейти к содержанию
    

Как правильно объявить extern для typedef?

12 минут назад, artemkad сказал:

Забавно использование аппаратного таймера в виде костыля который каждую миллисекунду обновляет текущую  позицию в очереди. Меня-бы жаба задавила тратить на это помимо DMA еще и таймер...

Полистайте свои проекты, посмотрите, какой процент утилизации таймеров в среднем. У STM32 их за пару десятков. Неужели жалко?

Хорошо, раз жалко - содержимое обработчика переименовать в функцию rxPeriodicHandle() и вызывать из любой периодической локации, либо запихнуть внутрь readRxFIFO().

В любом случае, когда длина принимаемого потока заранее не известна, а символов-маркеров нет (ни аппаратных, ни МК-зависимых средств их обнаружения тоже), Вам придется время от времени подсматривать во входной буфер "а че када там уже?".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, tonyk_av сказал:

А вы вообще представляете, как выполняется синтаксический разбор?

Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке.

2 часа назад, tonyk_av сказал:

При разборе идёт посимвольное, никакие строки не_нужны.

И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, artemkad сказал:

И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает?

Я много сообщений назад приводил конкретный код. В нём был переход по метке not_found. Но как видно - Вы его не прочитали. Или не поняли.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Новый вопрос.

Есть буфер, объявленный следующим образом

	  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  -ругается на несоответствие типов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, artemkad said:

Мы тут до полноценного синтаксического разбора еще не дошли - ограничились только этапом поиска лексем во входном потоке.

Не совсем поиск лексем, но можно как ориентир рассматривать. Индусский код для проверки на True (Java)

String.valueOf(myBoolVar).length() == 4

Пошёл за третьим пакетом попкорна :popcorm2:

3 minutes ago, MementoMori said:

Как ее скопировать в buffer?

Для начала определитесь как её будет принимать 'библиотека под Андроид'. В частности её не поплохеет если вместо текстовой строки от вашего BT приедет 'нечто' (совсем бинарное и на текст не похожее) ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 минуты назад, jcxz сказал:

Я много сообщений назад приводил конкретный код. В нём был переход по метке not_found.

Помнится там было:

23 часа назад, jcxz сказал:

одновременно с приёмом символов в строку посчитает их хеш (CRC32 например)

а тут предлагалось:

4 часа назад, tonyk_av сказал:

При разборе идёт посимвольное, никакие строки не_нужны.

Не кажется, что это слегка не в ту степь? Не говоря уже о том, что в твоем варианте неясно когда заканчивать расчет хэша и начинать поиск по таблице. Предлагаешь полный поиск при приеме каждого нового символа? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, xvr said:

приедет 'нечто' (совсем бинарное и на текст не похожее)

Как на Ваш взгляд, байт - это бинарное, на текст не похожее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Впрочем, от копирования там особо смысла мало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, artemkad said:

И что произойдет если во входном потоке встретится набор символов о котором твоя программа ничего не знает?

Приплыли. Предлагаю сначала разобраться по примерам Вирта и Страуструпа, как выполняется разбор, а потом уже задавать глупые вопросы.

 

23 minutes ago, artemkad said:

неясно когда заканчивать расчет хэша и начинать поиск по таблице

Ещё одно подтверждение того, что сначала нужно изучать принципы синтаксического разбора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, tonyk_av сказал:

Предлагаю сначала разобраться по примерам Вирта и Страуструпа, как выполняется разбор, а потом уже задавать глупые вопросы.

 

Конкретнее пли-и-из. Приведи место в книгах Вирта и Страуструпа вместо тупых ничего не означающих намеков на авторитет. Если ты не понял, я телепатом не являюсь  что-бы знать чего там ты имел ввиду. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, artemkad said:

Приведи место в книгах Вирта и Страуструпа вместо тупых ничего не означающих намеков на авторитет

Открываешь книжку Вирта и смотришь оглавление. У Страуструпа синтаксический разбор показан в примере калькулятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, tonyk_av сказал:

Открываешь книжку Вирта и смотришь оглавление. У Страуструпа синтаксический разбор показан в примере калькулятора.

Тебе сюда все оглавление Вирта привести что-бы показать что в оглавлении нет примеров или таки уточнишь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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>; ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, artemkad сказал:

Не кажется, что это слегка не в ту степь? Не говоря уже о том, что в твоем варианте неясно когда заканчивать расчет хэша и начинать поиск по таблице. Предлагаешь полный поиск при приеме каждого нового символа?

Вроде как должно быть очевидно, что UART выдаёт символьный поток входящих данных. Который естественно обрабатывается посимвольно. О чём вам и писали. Обрабатывая его посимвольно, находим границы (начало и конец) ваших лексем. И, найдя их, считаем хеш от тех символов, которые находятся в границах лексем. Когда происходит переход за заднюю границу лексемы (обнаруживается её конец), то тут и производим поиск по таблице накопленного к этому моменту хеша.

Всё вышеописанное должно быть априори известно любому более-менее опытному программисту, который когда-либо парсил строки, поступающие из UART.

Это потоковая, посимвольная обработка. Без всяких буферов, строк и прочей ненужной шелухи. Быстрая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...