【问题标题】:printf raw data -- get printf or print to NOT send charactersprintf 原始数据——获取 printf 或 print 以不发送字符
【发布时间】:2011-12-03 02:41:20
【问题描述】:

我有一块 Xilinx Virtex-II Pro FPGA 板,它通过 RS232 连接到 iRobot Create。

iRobot 将字节整数流作为命令。

我发现 printf 实际上会通过串行端口发送(Hypterminal 能够接收我打印的任何内容),并且我认为我可以使用 printf 将我的数据发送到 iRobot。

问题在于 printf 似乎将数据格式化为 ascii 输出,但我真的很喜欢它只是简单地发送原始数据。

我想要类似的东西:

printf(%x %x %x, 0x80, 0x88, 0x08);

但不是格式化十六进制,我希望它是实际发送的 0x80 值。

有什么想法吗?

【问题讨论】:

  • 您的编译器是否支持:printf(0x80,0x88,0x08);
  • printf("",0x80,0x88,0x08);

标签: c serial-port printf fpga serial-communication


【解决方案1】:

使用fwrite:

char buf[] = { 0x80, 0x80, 0x80 };

fwrite(buf, 1, sizeof(buf), stdout);

您可以写入任何文件句柄; stdout 只是反映您的 printf 的一个示例。

在 Posix 系统上,您还可以使用特定于平台的 write 函数写入文件描述符。

【讨论】:

  • 这很好!但我不知道我的标准输出的地址,......我想我可以试着四处挖掘。我的想法是只使用 RS232 RX 输出的内存地址……听起来是不是很正确?
  • 为什么需要地址?您之前很高兴使用printf,这与fprintf(stdout, ...) 相同......现在有什么问题?您绝对可以写入任何随机数。它必须是您以某种方式合法获得的FILE*
  • 嗯...我一直在使用 printf,但我似乎无法包含 stdio.h 库,我的编译器似乎不喜欢它.. 。 我很茫然。使用标准输出会给我一个错误,并且包含库也会给我一个错误。
  • 这似乎是最后的答案。我发现我可以在我使用的名为 STDOUT_BASE_ADDR 的平台中使用等效的。我没有立即标记它,因为我终于发现我用来连接机器人的电线坏了 T_T 花了好几个小时才弄明白。再次感谢 Kerrek!
  • 不错。对于长字符串,这比我一直使用的“%c%c%c”格式要好得多。
【解决方案2】:

请改用"%c%c%c" 格式。

【讨论】:

    【解决方案3】:

    您可以改用 fwrite。 Printf 根据定义是一个 ascii 打印机。

    char buf[] = {0x80, 0x80, 0x80};
    fwrite(buf, 1, 3, stdout);
    

    似乎是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多