我想使用C API将Labview FPGA中的数据发送到C函数.为了使数据传输同步,我执行以下操作:
1)输入:
2)在两个步骤中,我使用Labview中的连接数函数将这4个值打包到U64中(它确实是hi.lo).所以它基本上是:
((I16.I16).(I16.U16))
( U32 . U32 )
U64
Run Code Online (Sandbox Code Playgroud)
3)现在这个U64值被转移到C函数,它应该被解压缩,如下所示:
U64
( U32 . U32 )
((I16.I16).(I16.U16))
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何在C中处理拆包.在Labview中是否有类似"拆分号"功能的东西?如何确保所有部件都分配了正确的数据类型?
不,没有.你通常使用按位运算来做这种事情,主要是移位和掩码:
const uint64_t incoming = 0xfeedcafebabef00d;
const int16_t first = (int16_t) (incoming >> 48);
const int16_t second = (int16_t) ((incoming >> 32) & 0xffff);
const int16_t third = (int16_t) ((incoming >> 16) & 0xffff);
const uint16_t fourth = incoming & 0xffff;
Run Code Online (Sandbox Code Playgroud)
这当然假定端点在任何地方都是正确的,并且将设置first为0xfeed(-275十进制),依此类推.
作为一般观察,每次提取所需的实际代码量是最小的,这可以解释为什么没有通用功能来执行此操作:您不需要一个.
如果您愿意,您当然可以写一个:
uint16_t extractU16(uint64_t bits, uint8_t lsbIndex)
{
return (uint16_t) ((bits >> lsbIndex) & 0xffff);
}
Run Code Online (Sandbox Code Playgroud)
鉴于此,您可以将上述内容重写为:
const int16_t first = (int16_t) extractU16(incoming, 48);
const int16_t second = (int16_t) extractU16(incoming, 32);
const int16_t third = (int16_t) extractU16(incoming, 16);
const uint16_t fourth = extractU16(incoming, 0);
Run Code Online (Sandbox Code Playgroud)
我们可以通过做一个extractS16()返回来进一步改进(?)int16_t,允许放弃演员,但我不会打扰.:)
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |