c - 如何仅使用键盘将值从一个整数数组复制到另一个整数数组来填充它们?
问题描述
我正在尝试存储从非阻塞 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;
}
}
预先感谢 :)
解决方案
您是否意识到您正在 HAL_UART_RxCpltCallback 内的 for 循环中精确复制 1 个字节,而数组缓冲区的大小为 2 个字节?
这句话:newbuffer[i] = buffer[0];
只是复制第一个字节。
如果您从键盘读取,您可能会收到扫描码。扫描码不都是一个字节,而是很多。根据密钥,它们最多可以是三个字节:https ://en.wikipedia.org/wiki/Scancode 。
推荐阅读
- azure-devops - 如何使用 TFVC 设置权限以签入 Azure Devops 中的分支
- java - 从 Map 中过滤出多个条件的结果
- java - 无法从 SBT 中代理后面的远程存储库下载依赖项
- python - 从堆栈中获取多行函数调用字符串
- c# - 解决方法:“需要给成员添加XmlChoiceIdentifierAttribute。” 使用 XmlAttributeOverrides 时?
- go - Go method on value and method on pointers whats the difference?
- powershell - Jenkins Powershell 写入控制台
- arrays - 获取数字数组元素的前 5 个字符
- java - 使用流计算对象的多个字段
- ios - 存档失败:将 Xcode 从 9.1 更新到 10.1 后