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

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

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

    • Внутри 1220 два источника тока с регулируемым током. Хотя для данных целей 1220 это явный оверкилл имхо. Она компенсируется буферным ОУ по входу. Статью Л.И. выше кидали 2 раза. У 1220 этого вообще быть не должно... Таки да, если требуется именно точность 0,1 градус. И это интереснее всего в данной ситуации. Если разрядность - то достаточно АЦП МК.   Пока что я вижу, что все советы в пустоту. Ждём результат...
    • Колонки делал с полок совдеповских .Хотел обшить синтепоном стенки внутри но поленился и весь объем заполнен синтепоном , играют не плохо - меня устраивают низа есть , только вот они у меня питаются с ламповика 2Х30вт .Колонки собирал в замен щитам -уж много место они занимают -хотя и звучание их очень хорошее . По семейным обстоятельсвам всё стоит отдельно пока .  Так что кто ищет тот найдет для себя то-  что хочет. Ребята все мы разные и что Русскому хорошо - Немцу смерть .
    • Ну да, китайцы иногда ставят в подобные высоковольтные цепи одиночные резисторы типоразмера, аналогичного нашим МЛТ-0,125, но то ж китайцы... В некоторых схемах с SMD деталями встречал и по три, и по четыре резистора последовательно. Странно, что радиолюбителю со стажем "более 20 лет" требуется объяснять элементарные и очевидные вещи. 
    • И те же, что и m4600 вроде как. Доставаемость этого нынче только ebay (100500 переплата => идёт лесом) ?   ~годик жизни, потом на 42-45% отрубается тупо. 
    • Если вы их не встречали, то это еще не значит, что их там не было.  Пример - Lenovo Yoga (не скажу точно модель, их было несколько подобных Tab2,3 ). Стоят 2х18650 Panasonic (3400ма) и один 18500 (2000мач) все в параллель. Тестировал,их емкость соответствует номиналу. Dell  Precision M6800 - родная батарея набрана из Самсунгов по 3000мач 9шт, иногда LG той же емкости. Аналогично многие Dell ноуты из той же эпохи (Inspiron 15,17, Latitude серий).  АSUS К53 (53z и подобные) - Panasonic 2600мач 6шт (емкость реальная) HP некоторых ширпотребных серий 15-17 дюймов - стояли даже высокотоковые коричневые LG 2800мач. Как правило, их ставили в серии (т.е. всего 3-4 шт последовательно), иначе пришлось бы ставить в параллель обычные.  В бизнес моделях и сериях Elite в батареях тоже стояли аккумуляторы от 2400 до 3000мач, чаще всего Sanyo. Конечно, если кто-то поменял родную батарею на китайскую, то там за счастье, если 2200 мач получишь. Кстати на фото аккумулятор 41гр - тоже китайский 2000...2200мач, не самый плохой вариант... Причем в старых ноутах аккумуляторы большой емкости встречались даже чаще чем сейчас (сейчас ноуты не такие "жрущие", да и переходят на полимерные плоские). Все правильно, если покупать узаную батарею с рук, то шанс нарваться на полный мусор очень реальный. Особенно если она еще и не оригинальная, а "на замену" (это легко определить). В китайских батареях даже сами банки часто "текут" (вытекает электролит), тогда это точно мусор. Другое дело если покупать оригинальные батареи у специализированых фирм, но для ноутов, которые уже сняты с производства, например Gateway (неходовые родные батареи). На Ютюбе есть такие видео с конкретными примерами, как люди покупают такие для построения батарей для байков.  Вот для искателей полезная информация.  https://secondlifestorage.com/index.php?pages/cell-database/
×
×
  • Создать...