C 如何仅使用键盘将值从一个整数数组复制到另一个整数数组?
我试图存储从非阻塞UART协议接收的值。我从键盘输入字符,它们存储在一个名为buffer的数组中,该数组保存该值。然后,我想使用缓冲区数组中的值填充一个名为newbuffer的新数组,然后清除缓冲区数组中的值,以便它准备好从键盘接收另一个值 以下是我的初始化: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};
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);
}