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

Как сделать прием пакета неизвестной длины по UART


xrou

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

Здравствуйте, пытаюсь обрабатывать пакеты приходящие от ESP8266 (01), но проблема в том, что пакеты всегда разной длины ведь мы не знаем, что напишет пользователь (хотя даже ответы на AT команды всегда разной длины). Знаю, что в плате F0 есть прерывание по символу, но у меня F103C8T6. Как быть? Создать массив большого размера нельзя, т.к. HAL_Recieve_IT ждет пока не наберется нужное кол-во символов.

Приму любую идею и советы

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

а зачем тебе знать длину пакета? Процесс приема по уарт довольно медленный, если на скоростях до 115200. Я при работе с 8266 использовал двухсимвольный буфер с приемом по дма и прерыванием по полубуферу.

Дальше просто производится парсинг посимвольный и инкрементное формирование строки программой. Окончание строки - маркер символ. Как правило \n

Если вообще обмен медленный (ну скажем 9600 бод) можно вообще односимвольный буфер юзать. Скопировать в прерывании ты успеешь. Но с ДМА приятнее и можно использовать скорости порядка 3,5 мегабит. Это конечно не стандарт, но 8266 вывозит. Вопрос только надо ли оно такое быстрое? Я при использовании уарта всегда стараюсь подобрать или рассчитать минимально возможную скорость обмена для комфортного выполнения задачи. Так все становится намного проще и стабильнее

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

Скрытый текст


/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include "lib_7219.h"
#include "string.h"
#include <stdio.h>
#include "stdlib.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define MAXSTRING 20
#define UART_PACKET_OK 0
#define UART_PACKET_TOO_LONG 1
#define UART_PACKET_CORRUPT 2
#define UART_BUSY 1
#define UART_CPLT 0

volatile uint8_t UART_TX_Busy = 0;
uint8_t UART_NewMessage = 0;
uint8_t UART1_rxBuffer = '\000';
char rxString[MAXSTRING];

uint8_t TimerData[8] = {0,0,0,0,0,0,0,0};
uint8_t OldTimerData[8] = {0,0,0,0,0,0,0,0};
uint8_t TimerDataNew = 0;
uint8_t ScreenTime[24] = {0,1,0,1, 0,2,0,2, 0,3,0,3, 0,4,0,4, 0,5,0,5, 0,6,0,6};
char SendingTime[14];

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);

/* Private function prototypes -----------------------------------------------*/
void UART_Send (const char message[]);
void UART_CommandProcessor (void);
void Timer_read(void);
void TimerWrite(uint8_t, uint8_t);
void DisplayTime(void);
void SendTime(void);
void TimeCorrection(void);
void DayNight (void);

int main(void)
{

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();

	HAL_UART_Receive_DMA(&huart1, &UART1_rxBuffer, 1);
		
	StartDisplayTest(TEST_ON);
	HAL_Delay(1000);
	StartDisplayTest(TEST_OFF);
	HAL_Delay(1000);
	
	SetScanStart(NORMAL_OPERATION);
	SetScanLimit(0x05);
	SetDecodeMode(0xFF);
	
	// restore intensity level
	uint8_t intense_addr = 0x03;
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, &intense_addr, 1, 0xFFFF);
	HAL_I2C_Master_Receive(&hi2c1, 0xD0, &TimerData[3], 1, 0xFFFF);
	SetIntensity((TimerData[3]&0xF0)>>4);
	
	UART_Send("Timekeeper. V1. 09.2016. Uart started\n");

  while (1)
  {
		if(UART_NewMessage)	
		{
			UART_CommandProcessor();
			UART_NewMessage = 0;
		}
		Timer_read();
		DisplayTime();
		SendTime();
		TimeCorrection();
  }
}

void UART_Send (const char message[])
{
	while(UART_TX_Busy){};
	UART_TX_Busy = 1;
	HAL_UART_Transmit_DMA(&huart1, (uint8_t*)message, strlen(message));
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart1)
{
	UART_TX_Busy = 0;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart1)
{
	static short int UART1_rxindex = 0;	
	static uint8_t UART1_ErrorFlag = UART_PACKET_OK;

	if (UART1_rxBuffer == 8 || UART1_rxBuffer == 127) // If Backspace or del
	{
		UART1_rxindex--; 
		if (UART1_rxindex < 0) UART1_rxindex = 0;
	}

	else if (UART1_rxBuffer == '\n') // If Enter
	{
		if (UART1_ErrorFlag == UART_PACKET_OK && UART1_rxindex)
		{
			rxString[UART1_rxindex] = 0;
			UART1_rxindex = 0;
			UART_NewMessage = 1;
		}
		else
		{
			UART_Send ("ERROR > UART1 packet too long\n");
			UART1_ErrorFlag = UART_PACKET_OK; // reset error state
		}
	}

	else
	{
		if (UART1_rxBuffer != '\r' && UART1_ErrorFlag == UART_PACKET_OK) // Ignore return
		{
			rxString[UART1_rxindex] = UART1_rxBuffer; // Add that character to the string
			UART1_rxindex++;
			if (UART1_rxindex >= MAXSTRING) // User typing too much, we can't have commands that big
			{
				UART1_ErrorFlag = UART_PACKET_TOO_LONG;
				UART1_rxindex = 0;
				rxString[UART1_rxindex] = '\000';
			}
		}
	}
}

// UART Commands decoder
// sett [HH.MM.SS] - set time
// setd [DD.MM.YY] - set date
// vctl - view control register
// sctl [OUT(1bit).FT(1bit).S(1bit).CAL(5bit)] - set control register
// sbrt [VAL] - set screen brightness
// any uknown string - HELP

void UART_CommandProcessor (void)
{
	char cmd_str_buf[4];
	static uint8_t command_recieved = 0;
		
	// copy command to buffer
	static char cmd_buf[MAXSTRING];
	strcpy(cmd_buf, rxString);
	
	// decode command
	if (strncmp("sett", cmd_buf, 4) == 0)  // if sett--------------------------------------
	{
		command_recieved = 1;
		
		uint8_t reg_buf = 0;
		
		reg_buf |= ((uint8_t)cmd_buf[6]-'0')|(((uint8_t)cmd_buf[5]-'0')<<4); // convert hours to BCD
		TimerWrite(0x02, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[9]-'0')|(((uint8_t)cmd_buf[8]-'0')<<4); // convert minutes to BCD
		TimerWrite(0x01, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[12]-'0')|(((uint8_t)cmd_buf[11]-'0')<<4); // convert seconds to BCD
		TimerWrite(0x00, reg_buf);
		
		UART_Send("Time is set\n");
	}
	
	if (strncmp("setd", cmd_buf, 4) == 0)  // if setd--------------------------------------
	{
		command_recieved = 1;
		
		uint8_t reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[6]-'0')|(((uint8_t)cmd_buf[5]-'0')<<4); // convert day to BCD
		TimerWrite(0x04, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[9]-'0')|(((uint8_t)cmd_buf[8]-'0')<<4); // convert month to BCD
		TimerWrite(0x05, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[12]-'0')|(((uint8_t)cmd_buf[11]-'0')<<4); // convert year to BCD
		TimerWrite(0x06, reg_buf);
		
		UART_Send("Date is set\n");
	}
	
	if (strncmp("vctl", cmd_buf, 4) == 0)  // if vctl--------------------------------------
	{
		command_recieved = 1;
		
		#define REGISTER_STRING 8
		static char EchoBuffer[REGISTER_STRING * 5 + 1];
	
		for (uint8_t i=0; i<REGISTER_STRING; i++)
		{
			sprintf(&EchoBuffer[i*5], "0x%02X", TimerData[i]);
			if (i>0) EchoBuffer[i*5-1] = ' ';
		}
		EchoBuffer[REGISTER_STRING * 5-1] = '\n';
		EchoBuffer[REGISTER_STRING * 5] = '\000';
		UART_Send("TimerData readed\n");
		UART_Send(EchoBuffer);
	}
	if (strncmp("sctl", cmd_buf, 4) == 0)  // if sctl--------------------------------------
	{
		command_recieved = 1;
		uint8_t reg_buf = atoi(&cmd_buf[5]);  	//convert param to int value
		TimerWrite(0x07, reg_buf);							//write value to ctrl reg
		UART_Send("Control register saved\n");	//echo message
	}
	
	if (strncmp("sbrt", cmd_buf, 4) == 0)  // if sbrt--------------------------------------
	{
		command_recieved = 1;
		
		strncpy(cmd_str_buf, &cmd_buf[5], 2);	// convert parameter to int
		uint8_t brightness = atoi(cmd_str_buf);
		
		if (brightness <= 0x0F) 								// check value
		{
			SetIntensity(brightness);

			uint8_t tmp;												// save brigtness in timer memory
			tmp = TimerData[3]&0x0F;
			tmp |= brightness<<4;
			TimerWrite(0x03,tmp);
			
			UART_Send("Intencity is set. Brightness saved in EEPROM\n");
		}
		else UART_Send("Incorrect param [00..15]\n");
	}
	
	if (!command_recieved)
	{
		UART_Send("Hello. This is timekeeper help\nsett HH.MM.SS - set time\nsetd DD.MM.YY - set date\nvctl - view control register\nsctl [OUT(1bit).FT(1bit).S(1bit).CAL(5bit)] - set control register\nsbrt [VAL] - set screen brightness\n"); 
	}
	command_recieved = 0;
}

void Timer_read(void)
{
	static uint8_t addr = 0;
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, &addr, 1, 0xFFFF);
	HAL_I2C_Master_Receive(&hi2c1, 0xD0, TimerData, 8, 0xFFFF);
}

void TimerWrite(uint8_t addr, uint8_t data)
{
	uint8_t tbuf[2] = {addr, data};
	// check I2C bus status?
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, tbuf, 2, 0xFFFF);
}

void DisplayTime(void)
{
	// time string format ScreenTime
	// [0] - date 10
	// [1] - date 10 position (0)
	// [2] - hours 10
	// [3] - hours 10 position (0)
	
	// [4] - date
	// [5] - date position (1)
	// [6] - hours
	// [7] - hours position (1)
	
	// [8] - month 10
	// [9] - month 10 position (2)
	// [10] - minutes 10
	// [11] - minutes 10 position (2)
	
	// [12] - month
	// [13] - month position (3)
	// [14] - minutes
	// [15] - minutes position (3)
	
	// [16] - year 10
	// [17] - year 10 position (4)
	// [18] - seconds 10
	// [19] - seconds 10 position (4)
	
	// [20] - year
	// [21] - year position (5)
	// [22] - seconds
	// [23] - seconds position (5)
	static uint8_t OldTimerData;
	
	if (TimerData[0]!=OldTimerData)
	{
		ScreenTime[0]  =  (TimerData[4]&0x30)>>4;			// date 10
		ScreenTime[2]  = ((TimerData[2]&0x30)>>4);		// hours 10
		ScreenTime[4]  =   TimerData[4]&0x0F;					// date
		ScreenTime[6]  =   TimerData[2]&0x0F;					// hours
		ScreenTime[8]  =  (TimerData[5]&0x10)>>4;			// month 10
		ScreenTime[10] =  (TimerData[1]&0x70)>>4;		// minutes 10
		ScreenTime[12] =   TimerData[5]&0x0F;					// month
		ScreenTime[14] =   TimerData[1]&0x0F;					// minutes
		ScreenTime[16] =  (TimerData[6]&0xF0)>>4;		// year 10
		ScreenTime[18] =  (TimerData[0]&0x70)>>4;		// seconds 10
		ScreenTime[20] =   TimerData[6]&0x0F;					// year
		ScreenTime[22] =   TimerData[0]&0x0F;					// seconds
			
		
		SetScanStart(NORMAL_OPERATION);
		SetScanLimit(0x05);
		SetDecodeMode(0xFF);
		SetIntensity((TimerData[3]&0xF0)>>4);
		
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[0],  2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[4],  2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[8],  2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[12], 2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[16], 2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[20], 2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		OldTimerData = TimerData[0];
	}
	
}

void SendTime (void)
{
	static uint8_t OldSeconds;
	
	if (ScreenTime[22]!=OldSeconds)
	{
		SendingTime[0] = ScreenTime[2]+'0';
		SendingTime[1] = ScreenTime[6]+'0';
		
		SendingTime[2] = ScreenTime[10]+'0';
		SendingTime[3] = ScreenTime[14]+'0';
		
		SendingTime[4] = ScreenTime[18]+'0';
		SendingTime[5] = ScreenTime[22]+'0';
		
		SendingTime[6] = ScreenTime[0]+'0';
		SendingTime[7] = ScreenTime[4]+'0';
		
		SendingTime[8] = ScreenTime[8]+'0';
		SendingTime[9] = ScreenTime[12]+'0';
		
		SendingTime[10] = ScreenTime[16]+'0';
		SendingTime[11] = ScreenTime[20]+'0';
		
		SendingTime[12] = '\n';	
		SendingTime[12] = '\n'; // zero terminate string
		
		OldSeconds = ScreenTime[22];
		
		UART_Send(SendingTime);
	}
}

void TimeCorrection(void)
{
	
}

void DayNight(void)
{
	
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

void Error_Handler(void)
{
  while(1) 
  {
  }
}

 

все что тебе надо в этом коде есть. Индийский говнокод конечно, это я давно писал, но смысл понятен

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

17.10.2020 в 23:09, mail_robot сказал:

Дальше просто производится парсинг посимвольный и инкрементное формирование строки программой

Вот, это я и пытаюсь сделать, но куда формировать эту строку? Пытался копировать ее в char буфер, в принципе работало, но если передавать строку размером больше указанной в ...Recieve_IT то он просто обрубает не влезший кусок, хотя я сразу после от отправки строки обратно запускаю прерывание.

Подсмотрел как я реализовывал это дело в ардуино, там все проще, намного. Используется string в который можно добавлять символы пока память не треснет, а вот в STM я так и не смог подключить ни стринг, ни вектор - жалуется на дебри библиотеки iostream. Как это можно решить? Или есть какие-то ограничения не позволяющие использовать их? 

 

17.10.2020 в 23:09, mail_robot сказал:

но ограничен определенной максимальной, длиннее которой быть не может

Я пытаюсь вытащить все доступные точки WiFi из esp, но их может быть очень много, а всего для одной сети он дает полную характеристику, что занимает кучу места в буфере.

Да и данные от esp текут постоянно.

 

18.10.2020 в 18:03, MasterElectric сказал:

Или гугли что такое в UART IDLE. 

Полезная штука для передачи единичных команд.  

 

17.10.2020 в 23:09, mail_robot сказал:

Но с ДМА приятнее и можно использовать скорости порядка 3,5 мегабит

Куда нужна такая скорость? Все вот говорят, что для быстрых операций, но каких толком не говорят 

 

UPD: а где про все такое можно почитать? Просто куда не посмотри все все сами пишут и рассказывают, откуда они информацию берут? Есть что нибудь (видео, книга и тд и тп) где про вот это все расписано по полочкам, что куда и как?

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

1 час назад, xrou сказал:

Полезная штука для передачи единичных команд

Это флаг, по которому можно понять что передача пакета окончена. В хале даже функция такая есть если мне не изменяет склероз. 

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

11 часов назад, xrou сказал:

Просто куда не посмотри все все сами пишут

так и есть. Никто не принесет и не подаст. Ставишь задачу, читаешь референц и еррату и пришешь

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Я правильно из обсуждения понял, что ардуинского string у stm32 не существует точно так же, как и delay?

В действительности всё выглядит иначе, чем на самом деле. ©

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

а это чо? Ктонить вообще читал мой код?

#include "string.h"

вектор ты не сделаешь, динамика в библиотеках STM отсутствует. Ну и как бы похоже дело не в бобине

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

14 минут назад, mail_robot сказал:

а это чо? Ктонить вообще читал мой код?

Если вопрос ко мне, то конечно нет. :D

Потому как мне сейчас не нужен этот код, вполне достаточно только понимания.

"string.h" - это Ваше личное творение?

 

Изменено пользователем smart_ed

В действительности всё выглядит иначе, чем на самом деле. ©

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

7 часов назад, mail_robot сказал:

так и есть. Никто не принесет и не подаст

Не, я имею ввиду статьи про то как они все сами сделали исходя только из знания как работает uart.

 

5 часов назад, smart_ed сказал:

Я правильно из обсуждения понял, что ардуинского string у stm32 не существует точно так же, как и delay?

Ну стринг это вроде библиотечный класс и его можно подключить инклудом, а delay заменяется HAL_Delay

 

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

вектор ты не сделаешь, динамика в библиотеках STM отсутствует.

Это особенность платформы? Жаль конечно, жизнь они облегчают сильно.

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

20.10.2020 в 20:10, xrou сказал:

Это особенность платформы?

компилятора и его библиотек. Нив Keil ни в кокосе добиться динамического выделения памяти я так и не смог. Думаю это ограничение связано с оглядкой на надежность. Везде где есть динамика это большая потенциальная дыра в надежности системы. Все ресурсы контроллера должны быть спланированы и зарезервированы жестко еще на этапе проектирования системы

string входит в состав библиотек компилятора (ну опять же как минимум в кайле и кокосе). Я не знаю почему у вас там не работает. Единственное надо конечно перед применением любой его функции ознакомиться с ее реализацией. Потому как там местами весьма и весьма отличается от типовых. Ну и памяти она конечно отжирает сразу прилично...

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

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

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

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

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

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

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

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