VB中利用串口发送浮点数,也就是实现C语言中union

本文讨论了如何在VB环境中将浮点数通过串口(mscomm控件)发送到单片机的问题。提供了使用CopyMemory API进行内存拷贝的具体实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一段:

回复次数2

发表于 2007-06-06 13:55:41 楼主

在VB中如何发送一个浮点数,例如 -7.738263E-09  如何通过串口(mscomm控件发送,在另一端使用单片机接收。我知道在VC中只要使用
union
{
    char temp[4];
    float num;
}at;
at.num =  -7.738263E-09;
利用
    CByteArray array;     
    array.RemoveAll();
    array.SetSize(Count);
    for(i=0;i<4;i++)
        array.SetAt(i, at.num[i]);

    m_Comm.SetOutput(COleVariant(array)); // 发送数据
但是在VB中如何实现呢?求助呀。

 

回答者:

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)


Dim a As Single, Buffer(3) As Byte

a = -7.738263E-09
CopyMemory Buffer(0), a, 4
MSComm1.Output = Buffer

 

追答:

'谢谢,我测试过了您的方法可以。只是我使用API浏览器看到的CopyMemory的格式是
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'同样也可以解决问题。等结帖的时候一定给您加分。

 

### 使用 `union` 进行浮点数传输 为了实现通过串口通信发送浮点数,可以利用 `union` 结构来处理不同数据类型的表示方式。由于计算机内部存储浮点数的方式依赖于系统的字节序(大端或小端),因此在设计用于网络或其他设备间通信的应用程序时,必须考虑这一点。 下面是一个简单的例子,展示了如何定义一个 `union` 来方便地访问同一块内存作为整型数组或单精度浮点数值: ```cpp #include <iostream> #include <cstdint> union FloatTransfer { float value; uint8_t bytes[sizeof(float)]; }; ``` 此代码片段创建了一个名为 `FloatTransfer` 的联合体,它允许程序员既可以作为一个完整的浮点变量看待该对象也可以逐个字节查看其组成部分[^4]。 当准备向另一台机器发送这个浮点数之前,应该先将其转换为目标平台所期望的字节顺序。如果知道接收方采用的是特定的一种字节序,则可以根据情况调用相应函数来进行必要的交换操作。例如,在POSIX兼容系统上,有专门用来改变字节序的标准库函数如 `htonl()` 和 `ntohl()` (针对32位),以及 `htons()` 和 `ntohs()` (针对16位)。 一旦完成了任何必需的字节序调整之后,就可以按照字符流的形式依次写出这些字节数组到串口中去了。读取的时候同样要遵循相反的过程——即从输入缓冲区中提取相应的数量的字节并重新组装成原始的浮点数形式。 这里给出一段更具体的示范代码,假设我们正在使用 POSIX API (`termios`) 配置好的串口句柄 fd: ```c // 假设已经打开了串口号fd, 并配置好参数... void send_float(int fd, float f) { union FloatTransfer ft; ft.value = f; #ifdef __BYTE_ORDER__ #if __BYTE_ORDER__ == __LITTLE_ENDIAN__ // 如果本地是little endian则需要swap byte order. for(size_t i=0; i<sizeof(ft.bytes)/2 ; ++i){ std::swap(ft.bytes[i],ft.bytes[sizeof(ft.bytes)-1-i]); } #endif #endif write(fd, ft.bytes, sizeof(ft.bytes)); } ``` 这段代码首先将给定的浮点数放入联合体内,接着根据编译器宏判断当前体系结构是否为小端模式,如果是的话就执行一次字节反转以确保发出的数据是以大端格式排列的。最后一步就是实际写入串口了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值