通过 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;
}
我正在将十六进制字节转换为字符串并通过 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;
}