C 如何仅使用键盘将值从一个整数数组复制到另一个整数数组?

C 如何仅使用键盘将值从一个整数数组复制到另一个整数数组?,c,arrays,copy,uart,C,Arrays,Copy,Uart,我试图存储从非阻塞UART协议接收的值。我从键盘输入字符,它们存储在一个名为buffer的数组中,该数组保存该值。然后,我想使用缓冲区数组中的值填充一个名为newbuffer的新数组,然后清除缓冲区数组中的值,以便它准备好从键盘接收另一个值 以下是我的初始化: uint8_t buffer[2] = {0}; //initialize array for receiving keyboard input uint8_t newbuffer[256] = {0};

我试图存储从非阻塞UART协议接收的值。我从键盘输入字符,它们存储在一个名为buffer的数组中,该数组保存该值。然后,我想使用缓冲区数组中的值填充一个名为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);
}

提前感谢:)

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

这句话:
newbuffer[i]=buffer[0]正在复制第一个字节


如果你正在从键盘上阅读,你可能会得到扫描码。扫描代码并非都是一个字节,而是许多字节。根据键的不同,它们最多可以有三个字节:。

我解决了这个问题。问题在于将逻辑置于for循环中。由于newbuffer的大小是256,除非输入了所有字符并且newbuffer已满,否则程序不会退出for循环。通过将我的逻辑从for循环中取出,函数可以完成并返回到main,以便在输入下一个字符时在主循环中调用

我还添加了一个标志变量,以便打印用户键入回车按钮时输入的字符串

接收回调例程:

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

     newbuffer[i] = buffer[0]          //put value entered from keyboard into newbuffer array
     if (newbuffer[i] == '\r')         //if user enters a carriage return the input will be flagged and trigger the while loop to print the string
       {
        flag = 1;
       }
     else
       {
        flag = 0;
       }
     memset(buffer, 0, sizeof(buffer));                //clear buffer array to receive next keyboard value
     i++;                                              //increment newbuffer index
     HAL_UART_Receive_IT (&UartHandle, buffer, 1);     //call interrupt that handles entering keyboard values
主要内容:

int main(无效)
{
HAL_Init();
/*将系统时钟配置为180 MHz*/
SystemClock_Config();
/*初始化LED2的BSP Led*/
BSP_LED_Init(LED2);
Instance=USARTx;
UartHandle.Init.BaudRate=9600;
UartHandle.Init.WordLength=UART_WordLength_9B;
UartHandle.Init.StopBits=UART\u StopBits\u 1;
UartHandle.Init.Parity=UART\u奇偶校验;
UartHandle.Init.HwFlowCtl=UART\u HWCONTROL\u NONE;
UartHandle.Init.Mode=UART\u Mode\u TX\u RX;
UartHandle.Init.OverSampling=UART_OverSampling_16;
if(HAL_UART_Init(&UartHandle)!=HAL_OK)
{
/*初始化错误*/
错误处理程序();
}

NVIC_SetPriority(USART3_IRQn,(1u)为什么要发布HAL库函数?@P_J_u以便于参考。我想这可能有助于查看调用正在执行的操作。你知道为什么值没有存储在newbuffer中吗?我一次只想复制一个字符,所以我只需要为缓冲区数组创建一个索引。我将buffer[2]更改为buffer[1]为了节省内存。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
     //Prevent unused argument(s) compilation warning
     UNUSED(huart);

     newbuffer[i] = buffer[0]          //put value entered from keyboard into newbuffer array
     if (newbuffer[i] == '\r')         //if user enters a carriage return the input will be flagged and trigger the while loop to print the string
       {
        flag = 1;
       }
     else
       {
        flag = 0;
       }
     memset(buffer, 0, sizeof(buffer));                //clear buffer array to receive next keyboard value
     i++;                                              //increment newbuffer index
     HAL_UART_Receive_IT (&UartHandle, buffer, 1);     //call interrupt that handles entering keyboard values
int main(void)
{
  HAL_Init();

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();

  /* Initialize BSP Led for LED2 */
  BSP_LED_Init(LED2);

  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;
  if (HAL_UART_Init(&UartHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }

  NVIC_SetPriority(USART3_IRQn, (1u << __NVIC_PRIO_BITS) - 5u); //set interrupt priority
  NVIC_EnableIRQ(USART3_IRQn);

                             /*INTERRUPT METHOD*/
  HAL_UART_Receive_IT (&UartHandle, buffer, 1);  //call UART receive interrupt to get keyboard input

  //Infinite loop
  while (1)
  {

     //output a message in Hyperterminal requesting keyboard input
          printf("\n\rEnter your string: ");
         NVIC_DisableIRQ(USART3_IRQn);
          if (flag == 1)
                  {
                     printf("%s", newbuffer);                       //string is printed if user enters a carriage return
                     flag = 0;                                      //reset flag so the interrupt routine can look for another carriage return
                     memset(newbuffer, 0, sizeof(newbuffer));       //clear newbuffer so it is ready to store a new string
                     i = 0;                                         //reset index so newbuffer begins storing its new string starting at newbuffer[0]
                  }
         NVIC_EnableIRQ(USART3_IRQn);
          HAL_Delay (1000);
  }