【问题标题】:Sending Hex through UART通过 UART 发送十六进制
【发布时间】:2016-11-08 03:37:48
【问题描述】:

我正在尝试通过 UART 向我的 AVR 发送十六进制数据。问题是,我不能发送超过两对十六进制。我需要发送两个以上,比如 9-10。

例如:

我只能发送0x2f 和0x3f。 如果我发送更多,它总是减去。

我需要发送0xff234f3a3f。

我的代码:

sendString("wish me luck\n");

while(1)
{               
    char str[35];
    int i;

    printf("enter the code :\n");
    scanf("%x", &i);
    printf("%#x (%d)\n",i,i);
}

我做错了什么?

【问题讨论】:

  • 对不起,我发错了。但即使使用此代码,它仍然只能发送两对十六进制。仅此而已,该怎么办?
  • 很好奇。第一个代码使用了 30 个 char 数组,现在代码使用了 int。为什么使用类型int 和"%x"?您的文档对 "%x" 应该使用什么类型有什么看法?
  • nah.. 它只是以前代码的剩余部分,但这里的主要重点是发送超过 2 对 hexdata。 %x 是我在互联网上找到的唯一可以做我想做的数据类型
  • int i;声明仅服务于 16 位(2 字节)的内存。 10 hex 需要 10x8 位内存。 AVR中最长的数据类型只有64位(uint64_t)
  • 您想从什么发送到您的 AVR?你的代码运行了吗?或者您想从您的 AVR 发送?我真的不清楚。

标签: c hex avr uart


【解决方案1】:

您可以通过将要发送的数据存储在软件缓冲区中来实现此目的,并且一旦 avr 发送了 1 字节的 uart 数据,就用软件缓冲区中的字节填充 uart 寄存器。你可以这样做:-

char ar[] = "hello";
for (i = 0; i < strlen(ar); i++) {
    while ((UCSR0A & (1<<UDRE0)) == 0);
    UDR0 = ar[i]; 
}

希望对你有帮助

【讨论】:

  • int i;声明仅服务于 16 位(2 字节)的内存。
  • 16 位足够好,它允许您在 char 数组中存储 65536 个元素
【解决方案2】:

AVR UART 在嵌入式环境中具有大小限制,因此 UART 缓冲区只有 8/16 位。您可以发送 2 个字节的数据,要发送更多数据,您需要循环发送剩余的数据字节。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多