我有一些数据要发送到只接受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)
包含数据。
答案 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
。