通过 USART 发送 c char* 问题

Issue sending c char* over USART

我正在将十六进制字节转换为字符串并通过 uart 将它们发送到我计算机上的终端。我收到奇怪的(几乎正确的)输出,但我不明白为什么。这一切都在 AVR 中完成。以下是相关代码片段:

while(true)
{
    wan_usart_transmit_string(generateString());
}

生成字符串:

char *generateString()
{
    char *c = "";
    char d[5];
    sprintf(d, "%02X", 0x61);
    c = strcat(c, d);
    return c;
}

wan_usart_transmit_string:

void wan_usart_transmit_string(char * data)
{
    unsigned char c = *data;

    while (c)
    {
        while (!(UCSR0A & (1 << UDRE0)));
        UDR0 = c;
        c = *(++data);
    }
}

输出:61611611116111111116161161111611111111...等...

generateString 方法最终会将如此多的位置提前到一个循环缓冲区中,并将直到该位置的所有 ASCII 值连接成一个字符串,随后将通过 USART 发送。所以它现在看起来有点时髦。这只是一个测试片段,以确保它在我使其动态运行之前能够正常运行。

您需要为要从 generateString() 中 return 的字符串分配一些内存。

目前您将 c char* c = "" 指向一个字符串文字,然后您尝试写入它导致未定义的行为。

使用 malloc:

char *c = malloc(sizeof( *c )*10);
c[0] = '[=10=]';  //nul terminate so you get an empty string
char d[5];
sprintf(d, "%02X", 0x61);   //you can sprintf directly into c
c = strcat(c, d);
return c;

通过在 generateString 方法中使用以下代码,我能够获得我正在寻找的输出:

char *generateString(){
    char *c;
    char d[5];
    sprintf(d, "%02X", 0x61);
    return c;
}