Char to uint8 微控制器解释不正确?
Char to uint8 incorrect on microcontroller explanation?
我正在做一个关于 SAME70 微控制器的项目。我需要将 char 转换为 uint8_t。我正在验证它是否正确执行此操作。
我注意到当我 运行 这段代码打印出最终产品时:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
USART1_Write((uint8_t*)test, sizeof((uint8_t*)test));
}
打印出来的数据不正确。只打印第一个单词“hey”。但是,如果我这样做:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
uint8_t test2[79];
int sizedata = 0;
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
USART1_Write(test2, sizeof(test2));
转换工作正常,所有内容都打印出来了。在这两种情况下,我都给了它与输入相同的类型,所以在我看来转换没有正确发生。有谁知道我在这里做错了什么?
sizeof((uint8_t*)test)
是错误的。这是一个指针的大小uint8_t*
。您应该改为传递数组的大小 sizeof(test)
。
还有
uint8_t test2[79];
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
错了。数组 test
中的字符串长度为 79 个字符,因此数组有 80 个元素,包括终止空字符,因此 sizeof(test)
为 80。另一方面,目标 test2
只有 79 个字节。因此,此 memcpy
执行危险的超出范围的访问。
你应该使用
uint8_t test2[sizeof(test)];
相反。或者如果你更喜欢使用幻数(我不推荐这个),你应该写
sizedata = 79;
而不是
sizedata = sizeof(test);
我正在做一个关于 SAME70 微控制器的项目。我需要将 char 转换为 uint8_t。我正在验证它是否正确执行此操作。
我注意到当我 运行 这段代码打印出最终产品时:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
USART1_Write((uint8_t*)test, sizeof((uint8_t*)test));
}
打印出来的数据不正确。只打印第一个单词“hey”。但是,如果我这样做:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
uint8_t test2[79];
int sizedata = 0;
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
USART1_Write(test2, sizeof(test2));
转换工作正常,所有内容都打印出来了。在这两种情况下,我都给了它与输入相同的类型,所以在我看来转换没有正确发生。有谁知道我在这里做错了什么?
sizeof((uint8_t*)test)
是错误的。这是一个指针的大小uint8_t*
。您应该改为传递数组的大小 sizeof(test)
。
还有
uint8_t test2[79];
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
错了。数组 test
中的字符串长度为 79 个字符,因此数组有 80 个元素,包括终止空字符,因此 sizeof(test)
为 80。另一方面,目标 test2
只有 79 个字节。因此,此 memcpy
执行危险的超出范围的访问。
你应该使用
uint8_t test2[sizeof(test)];
相反。或者如果你更喜欢使用幻数(我不推荐这个),你应该写
sizedata = 79;
而不是
sizedata = sizeof(test);