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

STM32F103 USB VCP не работает парсер АТ команд


artos5

Рекомендуемые сообщения

Добрый день всем. Не корректно работает парсер строк. Кто сталкивался с подобной задачей - подскажите пожалуйста.
Здесь я принимаю данные:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
	strncpy(data, (char*)Buf, *Len);
	USBD_CDC_ReceivePacket(&hUsbDeviceFS);
flags=1;
  return (USBD_OK);
  /* USER CODE END 6 */
}

А здесь их уже пытаюсь парсить:

while(1)
{
if(flags)
{
						LED_ON;		
			if(strstr(data,"ON_WRK"))
			{
				CDC_Transmit_FS((uint8_t*)at_okk, strlen((char*)at_okk));
			  Usart1_Send_Data((char*)at_okk, strlen((char*)at_okk));
			}
			else if(strstr(data,"OFF_WRK"))
			{
				CDC_Transmit_FS((uint8_t*)at_okk, strlen((char*)at_okk));
			  Usart1_Send_Data((char*)at_okk, strlen((char*)at_okk));
			}
}
}

Так вот проблема в том что данные из колбека как-то странно копируются в массив. При парсинге , всегда не находится совпадение в строке.
Пробовал всевозможные варианты strcmp(), strstr(), и самописные - ничего не работает...

Как правильно использовать колбек?
 

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

3 часа назад, korsaj сказал:

строки если они не объявлены глобально.

Строки объявлены глобально.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, korsaj сказал:

data данные есть?

Если передавать то что принято, то передается все ок . То есть происходит эхо. А вот если эти данные пытаться парсить, то данных как бы нету.

В этом и заключается странность.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Если вставить любую задержку в блоке if(flags==1) то не работает даже эхо. Оно как-то непонятно копирует данные. То ли вообще по байтам передает, то-ли хз.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

0-байт в конце строки, он есть?

Я 0 байт даже принудительно дописывал, ничего не дает.

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

в строке раньше чем надо?

Если написать так - то все четко работает. 
 

if(flags) CDC_Transmit_FS((uint8_t*)data, strlen((char*)data));

А если данные парсить - то не работает.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Я пробовал даже из одной строки копировать в другую строку, и уже с ней работать - поведение точно такое же.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

1 минуту назад, korsaj сказал:

А точно функция strncpy создаёт копию?

Если передавать эхом строку, то она возвращается точно такая же.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

1 минуту назад, korsaj сказал:

объявлены глобально в одном файле?

Объявлены глобально в одном файле. В другом файле показано:
 

extern char data[];

 

Можно я Вам проект отправлю, а Вы посмотрите? Тут похоже какой-то косяк с компилятором...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Щас прошью и попробую )

Ничего не дало...

10 минут назад, korsaj сказал:

объявить ее volatile

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Возвращает ERR

            if(string_cmp((char*)data,"AT"))
			{
				CDC_Transmit_FS((uint8_t*)at_type, strlen((char*)at_type));
			  Usart1_Send_Data((char*)at_type, strlen((char*)at_type));
				//data[0]=0;
			}
			else{
				CDC_Transmit_FS((uint8_t*)"ERR_COMMAND!\r\n", strlen((char*)"ERR_COMMAND!\r\n"));
				CDC_Transmit_FS((uint8_t*)data, strlen((char*)data));
				Usart1_Send_Data((char*)data, strlen((char*)data));
			}

Вот:
 

Цитата

ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!
ERR_COMMAND!

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Не получается отладить именно USB CDC. Постоянно виснет терминал.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

image.png.437557b043e7a24ea75a0f7725825dcf.png

Вызов парсера
image.png.f8687d3adeef5f0786cf826f323a0389.png

парсер
image.png.45a4427cac4d4c355b9d73245e8a4b1b.png

uint8_t aRxBuffer[RXBUFFERSIZE];
char *commandBuff;

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

А что у вас с оптимизацией?

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

Все получилось)

В том колбеке копируется один символ, а не строка. Но по колбеку кажется будто копируется вся строка ))

Вот так, все четко работает:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
if(pos_receive<DATA_LEN)
{
	data[pos_receive]=Buf[0];
	pos_receive++;
}
else 
{
	pos_receive=0;
}
	USBD_CDC_ReceivePacket(&hUsbDeviceFS);
flags=1;
timer=0; 

	

  return (USBD_OK);
  /* USER CODE END 6 */
}

 

А в цикле уже работает парсер:

timer++;	
		HAL_Delay(50);
		if(flags && timer>10)
		{
						LED_ON;		
			if(string_cmp((char*)data,"ON_WRK"))
			{
				CDC_Transmit_FS((uint8_t*)at_okk, strlen((char*)at_okk));
			  Usart1_Send_Data((char*)at_okk, strlen((char*)at_okk));

			}
			else if(string_cmp((char*)data,"OFF_WRK"))
			{
........
}

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

  • 2 недели спустя...
В 04.05.2024 в 21:28, korsaj сказал:

Оказывается нужно было собрать все в кучу )

Привет! Не все так просто! Не со всеми программами адекватно работает плата.... В некоторых программах плата видит только первый символ, либо несколько символов... Как с этим бороться?

2024-05-14 095823.png

2024-05-14 095923.png

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...