首页 > 解决方案 > 如何仅使用键盘将值从一个整数数组复制到另一个整数数组来填充它们?

问题描述

我正在尝试存储从非阻塞 UART 协议接收到的值。我从键盘输入字符并将它们存储在一个名为缓冲区的数组中,该数组包含该值。然后我想使用缓冲区数组中的值填充一个名为 newbuffer 的新数组,然后清除缓冲区数组中的值,以便它准备好从键盘接收另一个值。

这是我的初始化:

uint8_t buffer[2] = {0};            //initialize array for receiving keyboard input
uint8_t newbuffer[256] = {0};       //initialize array to store keyboard input from buffer array
int i = 0;                          //array index variable

  UartHandle.Instance        = USARTx;

  UartHandle.Init.BaudRate   = 9600;
  UartHandle.Init.WordLength = UART_WORDLENGTH_9B;
  UartHandle.Init.StopBits   = UART_STOPBITS_1;
  UartHandle.Init.Parity     = UART_PARITY_EVEN;
  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode       = UART_MODE_TX_RX;
  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;

这是我输入第一个字符后的回调例程。我真的可以在这部分使用一些帮助!

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   //Prevent unused argument(s) compilation warning
  UNUSED(huart);

 for (i = 0; i < sizeof(newbuffer); i++)
 {
     newbuffer[i] = buffer[0];                     //put value entered from keyboard into newbuffer array
     memset(buffer, 0, sizeof(buffer));            //clear buffer array for next value
     HAL_UART_Receive_IT (&UartHandle, buffer, 1); //call interrupt that handles entering keyboard values
 }
 printf("%d", newbuffer);
}

这是获取键盘值的中断函数,以防您需要查看。

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
  uint16_t *tmp;

  /* Check that a Rx process is ongoing */
  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  {
    if (huart->Init.WordLength == UART_WORDLENGTH_9B)
    {
      tmp = (uint16_t *) huart->pRxBuffPtr;
      if (huart->Init.Parity == UART_PARITY_NONE)
      {
        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);
        huart->pRxBuffPtr += 2U;
      }
      else
      {
        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF);
        huart->pRxBuffPtr += 1U;
      }
    }
    else
    {
      if (huart->Init.Parity == UART_PARITY_NONE)
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
      }
      else
      {
        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
      }
    }

    if (--huart->RxXferCount == 0U)
    {
      /* Disable the UART Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

      /* Disable the UART Parity Error Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
      __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

      /* Rx process is completed, restore huart->RxState to Ready */
      huart->RxState = HAL_UART_STATE_READY;

#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
      /*Call registered Rx complete callback*/
      huart->RxCpltCallback(huart);

#else
      /*Call legacy weak Rx complete callback*/
      HAL_UART_RxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

      return HAL_OK;
    }

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

预先感谢 :)

标签: carrayscopyuart

解决方案


您是否意识到您正在 HAL_UART_RxCpltCallback 内的 for 循环中精确复制 1 个字节,而数组缓冲区的大小为 2 个字节?

这句话:newbuffer[i] = buffer[0];只是复制第一个字节。

如果您从键盘读取,您可能会收到扫描码。扫描码不都是一个字节,而是很多。根据密钥,它们最多可以是三个字节:https ://en.wikipedia.org/wiki/Scancode 。


推荐阅读