我怎样才能使第二个代码工作? (C 代码、sprintf 和指针)
How can I make the second code works? (C code, sprintf and pointers)
我正在使用 stm32f429 UART 向模块发送命令。我更喜欢第二个功能代码,但我不知道如何让它工作。
第一个功能代码,完整运行。
void v_cmd(unsigned short cmd)
{
uint8_t cmd_packet[8];
sprintf((char *)cmd_packet, "%02hu", cmd);
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}
Seconde 函数代码,它不像我预期的那样作为第一个代码工作。
void v_cmd(unsigned short cmd)
{
uint8_t *cmd_packet;
sprintf((char *)cmd_packet, "%02hu", cmd);
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}
它在第一段代码中起作用,因为您正在为 with
分配内存
uint8_t cmd_packet[8];
您必须知道,这是分配 8 个字节的内存。
在您分享的第二段代码中,uint8_t *cmd_packet;
是一个指针。但是,您还没有在该点指向的位置分配任何内存。
当前状态下的代码不起作用,因为指针 cmd_packet
未初始化。
下一条语句,
sprintf((char *)cmd_packet, "%02hu", cmd);
尝试用数据 cmd
填充 cmd_packet
指向的内存。但是,就像我之前解释的那样,它没有指向可以放置此数据的有效地址位置。这最终导致分段错误。
使用malloc
分配内存。您可以参考 malloc.
的手册页
uint8_t *p_cmd_packet = malloc(8);
您的代码接下来应该做的是检查对 malloc
的调用是否已成功分配内存,如果未分配内存则进行一些错误处理。
if(NULL == p_cmd_packet)
{
//! handle memory allocation error here
}
您还需要在使用完毕后释放此内存。
free(p_cmd_packet);
我看到您正在开发的代码是针对嵌入式微控制器 stm32f429 的。您还需要检查启动程序集文件,了解有多少堆 reserved/configured 供应用程序使用。因此,您可以处理内存分配。
我在这里看到另一个潜在问题:
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
理想情况下,如果我是你,并使用 sprintf()
填充数据,我会读取 sprintf()
函数的 return 值,并使用该值作为要传输的字节数。
截至目前,除非我知道传递给 HAL_UART_Transmit()
.
的确切参数,否则我无法对此发表更多评论
来自 sprintf 上的公开组页面:
int sprintf(char *s, const char *format, ...);
The sprintf() function places output followed by the null byte, '[=14=]',
in consecutive bytes starting at *s; it is the user's responsibility
to ensure that enough space is available.
为cmd_packet
(此处)分配足够的内存是用户的责任。但是你没有分配任何内存给 cmd_packet
.
使用malloc
分配足够的内存cmd_packet
我正在使用 stm32f429 UART 向模块发送命令。我更喜欢第二个功能代码,但我不知道如何让它工作。 第一个功能代码,完整运行。
void v_cmd(unsigned short cmd)
{
uint8_t cmd_packet[8];
sprintf((char *)cmd_packet, "%02hu", cmd);
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}
Seconde 函数代码,它不像我预期的那样作为第一个代码工作。
void v_cmd(unsigned short cmd)
{
uint8_t *cmd_packet;
sprintf((char *)cmd_packet, "%02hu", cmd);
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}
它在第一段代码中起作用,因为您正在为 with
分配内存uint8_t cmd_packet[8];
您必须知道,这是分配 8 个字节的内存。
在您分享的第二段代码中,uint8_t *cmd_packet;
是一个指针。但是,您还没有在该点指向的位置分配任何内存。
当前状态下的代码不起作用,因为指针 cmd_packet
未初始化。
下一条语句,
sprintf((char *)cmd_packet, "%02hu", cmd);
尝试用数据 cmd
填充 cmd_packet
指向的内存。但是,就像我之前解释的那样,它没有指向可以放置此数据的有效地址位置。这最终导致分段错误。
使用malloc
分配内存。您可以参考 malloc.
uint8_t *p_cmd_packet = malloc(8);
您的代码接下来应该做的是检查对 malloc
的调用是否已成功分配内存,如果未分配内存则进行一些错误处理。
if(NULL == p_cmd_packet)
{
//! handle memory allocation error here
}
您还需要在使用完毕后释放此内存。
free(p_cmd_packet);
我看到您正在开发的代码是针对嵌入式微控制器 stm32f429 的。您还需要检查启动程序集文件,了解有多少堆 reserved/configured 供应用程序使用。因此,您可以处理内存分配。
我在这里看到另一个潜在问题:
HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
理想情况下,如果我是你,并使用 sprintf()
填充数据,我会读取 sprintf()
函数的 return 值,并使用该值作为要传输的字节数。
截至目前,除非我知道传递给 HAL_UART_Transmit()
.
来自 sprintf 上的公开组页面:
int sprintf(char *s, const char *format, ...);
The sprintf() function places output followed by the null byte, '[=14=]', in consecutive bytes starting at *s; it is the user's responsibility to ensure that enough space is available.
为cmd_packet
(此处)分配足够的内存是用户的责任。但是你没有分配任何内存给 cmd_packet
.
使用malloc
分配足够的内存cmd_packet