【问题标题】:Serial communication with simulink使用 simulink 进行串行通信
【发布时间】:2013-10-25 13:46:21
【问题描述】:

我正在尝试使用 simulink (matlab 7.1) 和 d-space 通过串行端口发送和接收数据。我要发送和接收的值是双倍的。不幸的是,发送和接收块使用 uint8 值。我的问题是如何将双精度值转换为 uint8 值数组,反之亦然?是否有用于此的 simulink 块或者我应该使用嵌入式 matlab 函数?

【问题讨论】:

    标签: matlab serial-port simulink


    【解决方案1】:

    使用恰当命名的 Data Type Conversion 块,它就是这样做的。

    在 cmets 讨论后编辑

    关于缩放,这是我很久以前做过的事情的快照。它使用的是CAN而不是串口,但原理是一样的。在这里,信号总是正的,所以稍微容易一些,所以我不必担心缩放负数。 65535 是uint16 的最大值,我会在接收端进行反向缩放。当转换为uint16(或uint8,在您的情况下,它会自动舍入该值,您可以在块掩码中指定该行为)。

    【讨论】:

    • 这在我的情况下如何工作?每当我将 double 作为输入并将输出设置为 uint(8) 时,它只会给我一个 uint(8) 而不是数组。我想这是我应该期待的,但我如何确保它给我一个代表双精度的 uint(8) 数组?
    • 为什么要将“单”双精度转换为uint8 的数组,而不是“单”uint8?您想要的转换输出背后的逻辑是什么?
    • 好的,然后对您的double 进行一些缩放,如果需要将其分解为多个双精度数,或者执行您需要做的任何事情,然后将每个双精度数转换为uint8。在接收端做相反的事情。这是标准包装/拆包。
    • 获取双精度(标量)数据,通过最大值对其进行归一化(例如 realmax 或您自己的选择),添加偏移量使其始终为正,乘以最大值 unit8 值(2e8 - 1),四舍五入并转换为uint8。另一方面,将uint8 转换为double,除以uint8 的最大值,去掉偏移,乘以double 的最大值。使用标准数学块进行缩放,然后将数据类型从uint8 转换为double,反之亦然。
    • 假设您的输入可以在 -1000 和 +1000 之间变化。将它除以 1001,它现在严格介于 -1 和 +1 之间。加 1,现在介于 0 和 2 之间。乘以 2^7,您的数字现在介于 0 和 2^8 之间。将其四舍五入并将其转换为uint8,在接收端执行相反的操作。你得到 0 的原因是因为舍入错误。为避免这种情况,请使用不同的缩放比例。将您的 1.21 乘以(而不是除以)例如 1,000 或更大的数字以保留小数位,并在另一端除以,仍然确保您有 >0 的 nb。
    【解决方案2】:

    simulink中有pack和unpack blocks,在simulink库浏览器中搜索即可。您可能需要一些额外的产品,但不确定是哪一种。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 2017-05-11
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多