【发布时间】:2018-01-04 17:10:18
【问题描述】:
我有一些数据想发送到只接受字符数组的 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]);
}
}
我得到的输出是'88'?
顺便说一句,我使用的是 32 位 ATMEL 微控制器:ATXMEGA128A1U
关于如何实现这一点的任何想法?
--------------------------更新------ ------------------------------
我已经重新措辞了这个问题以尝试更具体:
我正在尝试创建一个 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 充满了零,我希望前 2 个字节为 02。我也不确定问题出在哪里,是我错误地复制测试还是 valueAsString 的问题任务。如果有人能阐明为什么会发生这种情况或提出更好的方法,那就太好了。
仅供参考:调试时,如果我查看内存位置
WordToSend
它包含零而
*( WordToSend)
包含数据。
【问题讨论】:
-
你为什么从一开始就和
uint32_t合作? -
预期输出是什么?
-
格式说明符 "%d" 需要
int参数,但您传递了一个指针值。你的编译器应该给你一个警告。 -
snprintf( valueAsString, 240 + 1, "%s", testdata );? -
您要发送二进制数据还是字符串(很可能是 ASCII)数据?
标签: c arrays char printf malloc