【发布时间】:2013-10-25 13:46:21
【问题描述】:
我正在尝试使用 simulink (matlab 7.1) 和 d-space 通过串行端口发送和接收数据。我要发送和接收的值是双倍的。不幸的是,发送和接收块使用 uint8 值。我的问题是如何将双精度值转换为 uint8 值数组,反之亦然?是否有用于此的 simulink 块或者我应该使用嵌入式 matlab 函数?
【问题讨论】:
标签: matlab serial-port simulink
我正在尝试使用 simulink (matlab 7.1) 和 d-space 通过串行端口发送和接收数据。我要发送和接收的值是双倍的。不幸的是,发送和接收块使用 uint8 值。我的问题是如何将双精度值转换为 uint8 值数组,反之亦然?是否有用于此的 simulink 块或者我应该使用嵌入式 matlab 函数?
【问题讨论】:
标签: matlab serial-port simulink
使用恰当命名的 Data Type Conversion 块,它就是这样做的。
在 cmets 讨论后编辑
关于缩放,这是我很久以前做过的事情的快照。它使用的是CAN而不是串口,但原理是一样的。在这里,信号总是正的,所以稍微容易一些,所以我不必担心缩放负数。 65535 是uint16 的最大值,我会在接收端进行反向缩放。当转换为uint16(或uint8,在您的情况下,它会自动舍入该值,您可以在块掩码中指定该行为)。
【讨论】:
uint8 的数组,而不是“单”uint8?您想要的转换输出背后的逻辑是什么?
double 进行一些缩放,如果需要将其分解为多个双精度数,或者执行您需要做的任何事情,然后将每个双精度数转换为uint8。在接收端做相反的事情。这是标准包装/拆包。
realmax 或您自己的选择),添加偏移量使其始终为正,乘以最大值 unit8 值(2e8 - 1),四舍五入并转换为uint8。另一方面,将uint8 转换为double,除以uint8 的最大值,去掉偏移,乘以double 的最大值。使用标准数学块进行缩放,然后将数据类型从uint8 转换为double,反之亦然。
uint8,在接收端执行相反的操作。你得到 0 的原因是因为舍入错误。为避免这种情况,请使用不同的缩放比例。将您的 1.21 乘以(而不是除以)例如 1,000 或更大的数字以保留小数位,并在另一端除以,仍然确保您有 >0 的 nb。
simulink中有pack和unpack blocks,在simulink库浏览器中搜索即可。您可能需要一些额外的产品,但不确定是哪一种。
【讨论】: