填充malloc内存并转换为char数组

时间:2017-07-28 15:02:18

标签: c arrays char printf malloc

我有一些数据要发送到只接受char数组的USART终端。

首先,我创建数据并填充内容:

uint32_t * testdata =   malloc(60 * sizeof(uint32_t)); // 240 bytes on my system
memset(testdata,3,240); // fill it

然后创建一个char数组并将测试数据复制到其中

char* valueAsString =  malloc(60 * sizeof(uint32_t) + 1);// one more for 0-terminator
snprintf( valueAsString, 240 + 1, "%d", testdata );

发送数据的功能如下所示:

static void sendRS232string(char message[], uint16_t messageLength )
{
    for (uint8_t i = 0; i < messageLength; i++)
        {
            usart_putchar(USART_SERIAL, message[i]);
        }
}

我输出的所有内容都是&#39; 88&#39; ?

BTW我使用32位ATMEL微控制器:ATXMEGA128A1U

关于如何实现这一目标的任何想法?

---------------------------------------- UPDATE ------ ------------------------------

我已经重新提出问题,试图更具体:

我正在尝试创建一个446字节长的内存块,在其中放入一些数据并一次打印一个字节的内存块。

uint16_t * WordToSend =   malloc(446); // create the memory
memset(WordToSend,0,446); //set it to zero fill
uint16_t test = 2; // on my system uint16_t is 2 bytes long
memcpy(WordToSend,test,sizeof(test)); // copy test into my new memory starting at the begining

// print out one byte at a time
int i;
for(i = 0; i < 447; i++) 
{
    unsigned char valueAsString = ((char*)WordToSend)[i] ;

    usart_putchar(USART_SERIAL, valueAsString);
}

Putchar需要:

enum status_code usart_putchar(USART_t *usart, uint8_t c)

问题是WordToSend充满了零,我希望前两个字节是02.我不知道问题出在哪里,我是否错误地复制测试或者是否是valueAsString的问题分配。如果有人能够阐明为什么会这样,或建议一个更好的方法,这将是伟大的。

仅供参考:调试时,如果我查看内存位置

WordToSend 

它包含零而

*( WordToSend) 

包含数据。

1 个答案:

答案 0 :(得分:0)

根据您的评论&#34;我希望输出为240 x&#39;&#39;&#34;,这样做的代码是

char *testdata = malloc(240);
memset(testdata, '3', 240);
sendRS232string(testdata, 240);

如果您担心sendRS232string函数似乎需要一个数组,并且您正在传递一个指针,那么这不是问题,因为这样做 - 被称为&#34; C&#34;中数组和指针的等价性。 (如果您不理解这一点,请询问,或者对其进行谷歌搜索。)

您需要了解的另一件事是3'3'之间存在巨大差异。 3是整数3. '3'字符 3,在ASCII中的值为51。

当你打电话

memset(testdata,3,240);

你用{3}填充testdata,最后(再次,用ASCII)等同于字符控件-C。

我不确定您通过snprintf电话尝试完成了什么。根据您尝试做的事情,您可能需要或不需要使用snprintf之类的内容来转换字符和整数,或整数及其十六进制表示或其他内容。

听起来你真的想要使用一堆4字节的整数。但是你需要决定如何通过串口传输这些整数:as raw,&#34; binary&#34;数字(每个4个字节),或者作为一些文本表示(十六进制,十进制或其他东西)。

根据您的评论&#34;我需要显示240个字节中的每一个,最好是十六进制和#34;,您想要的代码可能更像

int i;
for(i = 0; i < 60; i++) {
    char valueAsString[30];
    snprintf(valueAsString, sizeof(valueAsString), "%X\n", testdata[i]);
    sendRS232string(valueAsString, strlen(valueAsString));
}

请注意,我循环使用testdata中的值,使用snprintf将其一次转换为十六进制,并分别调用sendRS232string 60次。我没有创建一个包含所有60个格式化整数的文本缓冲区,或类似的东西。

如果您希望每个4字节的数字始终由8个十六进制数字表示,只需将printf格式从%X更改为%08X