首页 > 解决方案 > 微控制器解释上的字符到 uint8 不正确?

问题描述

我正在做一个关于 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));
}

打印出来的数据不正确。只有第一个单词“嘿”被打印出来。但是,如果我这样做:

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));

转换工作正常,一切都被打印出来。在这两种情况下,我都给了它与输入相同的类型,所以在我看来,转换没有正确发生。有谁知道我在这里做错了什么?

标签: ccastingtype-conversionmicrocontroller

解决方案


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);

推荐阅读