提问人:Serhii 提问时间:11/2/2023 最后编辑:Serhii 更新时间:11/2/2023 访问量:92
atoi() 函数将垃圾返回到终端 STM32,C lang
atoi() function returning garbage to terminal STM32, C lang
问:
我对 atoi() 函数有一些疑问。我正在尝试将从HAL_UART_Receive_IT函数接收的字符串数据转换为整数,然后再次发送到终端。我在出口处有什么,它看起来像垃圾
输入图像描述在这里
这是我代码的一部分
uint8_t UART_Rx_Data;
----------------------
while (1){
HAL_UART_Receive_IT(&huart2, (uint8_t*)&UART_Rx_Data, sizeof(UART_Rx_Data));
}
----------------------
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart == &huart2){
int i = atoi((char *)&UART_Rx_Data);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)i, sizeof(i));
}
}
如何从UART_Rx_Data中获取整数?
*我真的认为 atoi 函数有问题,因为我的代码的另一部分看起来像
if (huart == &huart2){
unsigned int Left_El = atoi((char*) &UART_Rx_Data);
for(unsigned int i = 0; i <= 4095; i++){
if(i == Left_El){
unsigned int ADC_Rx_Data = round((i * (100.0 / 4095.0)) + 25);
__HAL_TIM_SET_COMPARE(&htim21, TIM_CHANNEL_1, ADC_Rx_Data);
}
}
}
我只需要从 UART 接收整数数据并向 TIM 添加占空比,但它不起作用。我试图检查原因,当我发送抛出UART数据时,结果发现有垃圾。 现在我将尝试通过循环“for”重新制作,原因如下所述,atoi 等待“\0”
答:
1赞
Andrew Henle
11/2/2023
#1
您发布的代码的这一行将变量 cast 的值传递给函数的地址,而不是包含在 : 中的值的地址:i
HAL_UART_Transmit_IT()
i
HAL_UART_Transmit_IT(&huart2, (uint8_t *)i, sizeof(i));
根据我发现的 HAL_UART_Transmit_IT()
文档:
...
参数:
huart pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module. pData Pointer to data buffer Size Amount of data to be sent
文档中的第二个参数是指向要发送的数据(或地址)的指针。pData
这将与该文档匹配:
HAL_UART_Transmit_IT(&huart2, (uint8_t *) &i, sizeof(i));
请注意,在 中添加了 “address-of” 运算符。&
i
评论
0赞
0___________
11/2/2023
从地址中抽象出来,将整数的二进制表示感应到文本终端不会显示任何有意义的内容
0赞
Andrew Henle
11/2/2023
@0____好吧,OP 没有明确指定数据要发送到什么,所以我假设将整数值发送为 4 字节二进制数据的隐含意图是正确的。¯\_(ツ)_/¯
0赞
Andrew Henle
11/2/2023
@0____有趣的是,一旦你写了这样的代码,这个错误就很难被发现。当你写它时,你“知道”它是正确的代码,所以当你看到它时,它仍然“看起来”对你的大脑是正确的。我认为这就是为什么摆脱你无法解决的代码问题并将它们从你的脑海中剔除,可以让你发现你以前无法“看到”的问题。
0赞
0___________
11/2/2023
灾难的秘诀:尽可能多地添加演员表,以消除那些烦人的警告。谁发明了它们?你用“正确”的代码,这个的编译器不会停止打印垃圾
0赞
0___________
11/2/2023
#2
你的代码毫无意义。
您收到一个字节,然后调用需要 C 字符串的函数。这是未定义的行为,您不会以这种方式从终端接收号码。
然后,将整数的二进制表示形式发送到文本终端(假设已添加到变量中)。这完全没有意义。&
很难理解你想存档什么。
评论
atoi
需要以零结尾的字符串。您正在向它传递指向单个 .这不会有好结果。如果你知道它是介于 和 之间的字符,那么会给你一个与该位数字匹配的 int。uint8_t
'0'
'9'
int i = UART_Rx_Data - '0';
atoi
strtol
strtol