在USART上发送c char *的问题

时间:2015-06-26 17:08:46

标签: c avr uart

我正在将十六进制字节转换为字符串并通过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发送。所以它现在看起来有点时髦。这只是一个测试片段,以确保它在我动态运行之前正确运行。

2 个答案:

答案 0 :(得分:1)

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

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

使用malloc:

char *c = malloc(sizeof( *c )*10);
c[0] = '\0';  //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;

答案 1 :(得分:-1)

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

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