【问题标题】:Receive a floating point in Matlab from bytes从字节接收Matlab中的浮点数
【发布时间】:2013-04-10 20:49:06
【问题描述】:

我想通过串行 COM 向 Matlab 发送一个浮点数并将其解释为单精度浮点数。

我可以通过串口将数据作为字节包发送。

所以在发送方我将 32 位浮点数移位 8,将其屏蔽并发送

(byte)((number >> 8) & 0x000000FF)
(byte)((number >> 16) & 0x000000FF)
...
\r\n (line termination)

现在,在 Matlab 上,我使用fscanf(s,'%f') 连接到 COM 并接收,其中 s 是串行实例。它读取字节直到终止行。

现在,问题是 Matlab 上的输出与我发送的不一样。我认为问题在于不同的浮点表示或不同的发送顺序。

例如。如果我发送十进制 1.2 (0x3f99999a),Matlab 打印 1.5315e+010

我做错了什么?

编辑:

Matlab fscanf http://www.mathworks.co.uk/help/matlab/ref/fscanf.html

【问题讨论】:

  • 那个发件人代码太破了,这不好笑。为什么要移位四位? number 是从哪里来的,你连浮点数都不能用>>?是什么让您认为可以将fscanf 用于二进制数据?当其中一个数据字节恰好是\r\n 时会发生什么?
  • @Ben Voigt 对不起。我的意思是移动8位。创建线程时的错字。 Matlab 在收到\r 或\n 时会自行终止读取。 Number 是 C 中的浮点数。我添加了指向 matlab 函数的链接,该函数声明可以接收和格式化二进制数据。

标签: matlab floating-point


【解决方案1】:

默认情况下,number 是 64 位的 double 类型。您应该为 64 位而不是 32 位执行移位。否则,您可以将数字声明为 uint32 类型并进行 32 位移位。

【讨论】:

    【解决方案2】:

    当数据是二进制时,尝试fread 而不是fscanf

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2020-07-22
      • 2015-07-12
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多