如何使用UART将int从HC-06发送到stm32f103



我已经使用蓝牙将我的HC-06连接到pc,所以我可以向HC-06发送数据。我的工作是将我在PC中键入的任何int发送到bluepill(然后它会在另一个屏幕上显示值(。我是用工会的概念来做这件事的。

typedef union int_buffer
{
int i;
struct
{
uint8_t bytes[4];
};
}int_buff;
int_buff int_Tx; // Transmit to bluepill
uint8_t receive;
uint8_t send[50], buffer[5];
int counter = 0;

上面是我声明的变量。以下是我的代码:

/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_UART_Receive(&huart1, &receive, 1, HAL_MAX_DELAY) == HAL_OK) // Sending one by one
{
buffer[counter++] = receive;
}
if(buffer[counter - 1] == 'r')
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);
memcpy(int_Tx.bytes, buffer, sizeof(int));
sprintf((char* )send, "The integer received is %#X", int_Tx.i);
HAL_UART_Transmit(&huart2, send, sizeof(send), HAL_MAX_DELAY);
}

我已经知道UART是逐字节发送的。首先,我收集用户发送的所有字节,并将它们存储到缓冲区中。当按下'\r'时,int被传输到bluepill,bluepill可以在serial studio上查看值。我的问题是,显示了一些值,但它们都是随机数和未知符号。

我不太确定我的概念是否正确。我认为它只是将每个字节存储到并集中,然后打印出并集的int。谢谢你的帮助!

除非您发送int的二进制表示,否则您不能将字节复制到并集并获得有意义的整数。

在ARM上,数字123将以字节为单位表示为{0x7b, 0x00, 0x00, 0x00}

您可能想要做的是使用类似atoi()的函数。

我会重新安排你的代码如下:

while (1) {
if(HAL_UART_Receive(&huart1, &receive, 1, HAL_MAX_DELAY) != HAL_OK) {
continue;
}
// Only buffer digits
if (receive >= '0' && receive <= '9') {
buffer[counter++] = receive;
}
if (receive == 'r' || counter == 4) {
// Null-terminate the buffer - required by atoi()
buffer[counter] = '';
counter = 0;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);
sprintf((char*)send, "The integer received is %#X", atoi((char*)buffer));
HAL_UART_Transmit(&huart2, send, sizeof(send), HAL_MAX_DELAY);
}
}

更改

  • 如果无法接收到数据,请提前退出循环
  • 检查接收到的值是否为数字
  • 检查计数器值以防止缓冲区溢出
  • 接收完成后重置计数器
  • 使用atoi()将字符串转换为int

最新更新