Comparación entre uint8_t y String

3

Tengo una pregunta muy fundamental con respecto a la comparación de cadenas ...

Implementé una placa USART to PC con STM32L0 Nucleo, y puedo escribir algo en el terminal y recibirlo en el micro de la siguiente manera:

#define RXBUFFERSIZE 1
uint8_t aRxBuffer[RXBUFFERSIZE];

/** Put UART peripheral in reception process */
  if(HAL_UART_Receive(&huart2, (uint8_t *)aRxBuffer, RXBUFFERSIZE, 0xFFFF) != HAL_OK)
    Error_Handler(); 

Quiero comparar los datos recibidos con una cadena, pero la comparación no funciona.

char *is_correct= "Y";
if (strcmp((char*) aRxBuffer, is_correct) == 0)
    DoSomething();
else
    DoSomethingElse();

¿Qué estoy haciendo mal? Gracias

Cómo configuro el USART:

/* USART2 init function */
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart2);

}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART2)
  {
    /* Peripheral clock enable */
    __USART2_CLK_ENABLE();

    /**USART2 GPIO Configuration    
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  }

}
    
pregunta Merelda

3 respuestas

7

Para la función strcmp y todas las demás funciones de cadena, la cadena debe estar terminada en nulo. Para su ejemplo, una forma de hacerlo sería algo como lo siguiente para asignar un byte adicional en la matriz y colocar un terminador nulo al final:

#define RXBUFFERSIZE 1
uint8_t aRxBuffer[RXBUFFERSIZE + 1];
if(HAL_UART_Receive(&huart2, (uint8_t *)aRxBuffer, RXBUFFERSIZE, 0xFFFF) != HAL_OK)
    ....
aRxBuffer[RXBUFFERSIZE] = 0;

Aunque para una comparación de un solo carácter como la que tiene en este momento no es necesario realizar una comparación de cadenas, puede utilizar una comparación de caracteres en el primer y único elemento de la matriz:

if (aRxBuffer[0] == 'Y')
    DoSomething();
else
    DoSomethingElse();
    
respondido por el PeterJ
1

El strcmp necesita un terminador nulo, pero hay otra función que puede usar para comparar cadenas que es strncmp. / a> que toma el número de caracteres que quieres comparar. Así que podrías terminar haciendo:

char *is_correct= "Y";
if (strncmp((char*) aRxBuffer, message,strlen(message) ) == 0)
    DoSomething();
else
    DoSomethingElse();

Esto también supone que la variable message es una cadena fija.

    
respondido por el Dom
-1

¿Por qué molestarse con strcmp o strncmp mientras puede hacer esto simplemente?

uint8_t aRxBuffer;
#define RXBUFFERSIZE (sizeof(aRxBuffer))

if(HAL_UART_Receive(&huart2, (uint8_t *)&aRxBuffer, RXBUFFERSIZE, 0xFFFF) != HAL_OK)
    Error_Handler();

if(aRxBuffer == message)
   DoSomething();
else
   DoSomethingElse(); 
    
respondido por el Alexxx

Lea otras preguntas en las etiquetas