“имякоманды?р1=число;р2=число;.../”
while(1)
{
ждем пока не примем из UART один символ;
записываем очередной символ из UART последовательно во входной буфер;
if (текущий принятый символ равен признаку конца передачи команды)
ищем во входном буфере имя нашей команды (“comm1”);
if (нашли имя команды и место (индекс), где она находится)
{
разбираем символы, которые идут после имени команды, определяем параметры р1 и р2 и их значения;
if (распознали все параметры и получили их значения)
{
готовим ответную строку в компьютер;
посылаем ответ на компьютер;
}
else
//не распознали все параметры
{
посылаем ответ на компьютер - ошибка;
}
else
//не нашли команду
{
посылаем ответ на компьютер - ошибка;
}
сброс приема во входной буфер после обнаружения признака конца команды;
стираем входной буфер от старых значений;
устанавливаем, что начнем писать принятые символы с начала входного буфера;
}
}
uint8_t pData[10]; //буфер для приема данных модулем UART
uint16_t Size=1; //размер принимаемых данных за один вызов функции UART
uint16_t Size_out=0;//размер отправляемых данных за один вызов функции UART
//максимальный размер входного буфера
#define SIZE_INPUT 100
char str_in[SIZE_INPUT]; //входной буфер
char str_out[100]; //выходной буфер
uint8_t idx=0; //индекс текущей позиции символа во входном буфере
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
while (1)
{
if ( HAL_UART_Receive(&huart2, pData, Size, 10) == HAL_OK) // ждем пока не примем из UART Size-количество символов (один) блокирующий режим !!!!!
{// приняли байт
str_in[idx++]=pData[0]; //копируем вновь принятый символ в новое место входного буфера
if(idx==SIZE_INPUT-1) //если превысили размер входного буфера - то начнем с его начала
idx=0;
if(pData[0]=='/')
{ //найден признак конца передачи команды
str_in[idx]=0; //терминируем строку после признака конца передачи команды - для функций поиска
char *str_comm1; //указатель на начало команды
if( (str_comm1=strstr(str_in, "comm1")) != NULL) //ищем символы команды во входном буфере
{//команда "comm1" найдена и нашли ее начало
//разбор параметров команды
int param1, param2; //где будут хранится параметры команды
int res = sscanf(str_comm1,"comm1?p1=%d;p2=%d;", ¶m1, ¶m2); //пытаемся разобрать команду с параметрами
// формате имякоманды?parameter=значение;parameter=значение;.
if(res ==2)
{// распознали все параметры
//готовим ответную строку в компьютер
sprintf(str_out, "param1=%d; param2=%d;\r\n", param1, param2);
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
else
{ //не распознали все параметры команды - ошибка
sprintf(str_out, "error: not recognized\r\n"); //строка ответа - ошибка
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
}
else
{ //не нашли команду во входном буфере - ошибка
sprintf(str_out, "error: command not found\r\n"); //строка ответа - ошибка
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
HAL_UART_AbortReceive(&huart2);//сброс приема во входной буфер после обнаружения признака конца команды
memset(str_in, 0, SIZE_INPUT); //стираем входной буфер от старых значений - для правильности поиска
idx=0; //начнем писать символы с начала входного буфера
}
Стартуем! |
Дальше |
Проверить |
Узнать результат |
Дальше |
Проверить |
Узнать результат |
Дальше |
Проверить |
Узнать результат |
Дальше |
Проверить |
Узнать результат |
Пройти еще раз |
Пройти еще раз |
Пройти еще раз |