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

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 пользователей онлайн

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

    • Это так называемая трансмиссионная линия, или иначе говоря - труба Войта, или ещё проще - рупор, в том или ином виде дудка.  
    • Получается, динамики после ремонта/восстановления? Тогда сначала нужно их обмерить.  
    • И, кстати, в завоевшем медаль на Лейпцигской ярмарке Бриге, в последствии ставшим серийным, небезызвестным АМЛ-м, А.М. Лихницким, также как и в серийных усилителях В. Щушурина-Ламма(царствие небесное обоим) ставились обычные подстроечники, да и вообще всё советское, т.е. как ты выразился - гавно; и всё работало.  
    • Я так понимаю, примененная мною схема это А30. Так вот, эту схему нашел в этой ветке, начал искать и отказалось, что ее как раз таки Вы и выкладывали 20.09.2010 Собрал ее с теми изменениями, по которым, собственно, и пришел сюда за советом. На момент публикации вами схемы А35.2 21.04.2024 цыплятам стукнула неделя от роду) По поводу работы А30 и А35. Я уверен, что разницы в работе не будет, т.к. они похожи. Но это не самое главное!! Из опыта могу сказать точно, что решающую роль играет циркуляция воздуха в самом ящике и место расположения термопары (в данном случае терморезистора). У меня он расположен прямо над вентилятором. Т.е. он обдувается забираемым воздухом, который далее уходит на нагреватели. Экспериментировал с разным расположением термистора, схема либо уходила в "дребезг", либо не хватало диапазона подстроечного резистора. Был ещё заводской инкубатор, про который я упоминал 7.04.2024, там схема похожая, и термистор тоже расположен над вентилятором. И ещё по поводу удачности конструкции. Смотровые окошки можно заглушить вырезанными вставками до начала вылупления. Это позволяет сэкономить электроэнергию в 1,5 раза! По примерным подсчётам за 20 дней с открытыми окошками инкубатор потребляет 14 кВт, а с закрытыми до 9 кВт! Для меня сейчас это очень актуально, т.к. из-за частых отключений света приходится запитывать инкубатор от самодельного пауэрбанка.  В общем, как уже говорил, столько информации, что статью можно написать))  
    • Для тебя персонально обосновываю: в серийные УНЧ в СССР ставились практически такие же подстроечник и, что и во ин заводах-производителях практически во всём остальном мире - и в США. и в Европе, и ин Japan. Ныне модные многооборотные, типа 3296, применялись далеко не во всех импортных УНЧ, хотя бы потому, что для их монтажа на пп, нужно было частично менять производственные процессы. Просто в силу своего возраста тебе многое ещё не известно. А вот кидаться дерьмом в страну, давшую тебе всё... - это, знаешь ли, не лучшим образом характеризует тебя. 
    • Очень хотелось бы знать, что настраивали, в каком узле и желательно это: "что-то дернул".
    • 500-ваттный Холтон тебя своим звучанием устраивает? Переведи его в G, или H-класс. По крайней мере тебе возможно не придётся искать-пилить новые радиаторы и делать новое шасси; зная как и на чём сыграть, т.е. что изменить и что/как  добавит, всё можно разместить в тех же габаритах что и 500-ик. БП(выпрямители) и главное трансформатор нужны будут совершенно другие.
×
×
  • Создать...