【问题标题】:Sending Hex value in win32 not working similar to c++ code在 win32 中发送十六进制值与 c++ 代码类似
【发布时间】:2013-12-27 08:44:03
【问题描述】:

我有如下的 c++ 代码来显示 int 数组中的十六进制值。

#include <iostream>
using namespace std;

int main()
{
    int binText[32]={1,0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1};
    char temp[255]={0};
    for (int i=0; i<32; i++)
    {
        sprintf(&temp[strlen(temp)], "%d", binText[i]);
    }
    char HexBuffer[255];
    unsigned long long int Number = 0;
    int BinLength = strlen(temp);

    for(int i=0; i<32; i++)
    {
        Number += (long int)((temp[32 - i - 1] - 48) * pow((double)2, i));
    }

    ltoa(Number, HexBuffer, 16);
    cout << HexBuffer <<endl;
}

它的输出是:af1af5f1 所以这段代码将存储在 int 数组中的二进制数字转换为十六进制值。

但是当我尝试使用相同的代码在使用 win32 的串行通信中发送十六进制值时。它没有发送正确的十六进制值。代码是

    serialObj.begin("COM1", 9600); //opens the port
    int binText[32]={1,0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1};
    char temp[255]={0};
    for (int i=0; i<32; i++)
    {
        sprintf(&temp[strlen(temp)], "%d", binText[i]);
    }
    char HexBuffer[255];
    unsigned long long int Number = 0;
    int BinLength = strlen(temp);

    for(int i=0; i<32; i++)
    {
        Number += (long int)((temp[32 - i - 1] - 48) * pow((double)2, i));
    }

    ltoa(Number, HexBuffer, 16);
    serialObj.send(HexBuffer);

    serialObj.close();//closes the port

“serialObj.send(HexBuffer);”调用的“send”函数如下:

void serial::send(char data[])
{
    DWORD dwBytesWrite;
    WriteFile(serialHandle, data, 4, &dwBytesWrite, NULL);
}

但它发送的数据是:“61 66 31 61”。我无法弄清楚它为什么给出这个输出。

“send”函数“serialObj.send”适用于以下代码

char str[4]={0x24,0x24,0x53,0x3F};
serialObj.send(str);

它发送 24 24 53 3F。

所以我想从上面存储在 int 数组中的二进制数字发送 AF 1A F5 F1(如上所示)。我该怎么做呢

【问题讨论】:

    标签: c++ winapi binary serial-port hex


    【解决方案1】:

    如果您想发送实际的二进制位,请不要调用ltoa

    serialObj.send((char *)&Number);
    

    请注意,Number 被声明为 long long,它可能是 64 位,不适合您的 serial::send() 函数发送的 4 个字节。

    【讨论】:

    • 您好,感谢您的回复。似乎当我使用您的线路发送时。它发送 F1 F5 1A AF 。与 AF 1A F5 F1 相反。它接近解决方案。那么你能解释一下我发送这个“号码”时发生了什么
    • @user3048644:您遇到了“endian”问题。简而言之,现在大多数 CPU 将整数存储在内存中,从 最低 有效字节开始(但对于某些 CPU,情况仍然相反)。因此,十六进制数 0x12345678 将作为字节 78 56 34 12 存储在小端系统的内存中,并且字节将按该顺序从串行端口发送出去。您可以使用类似 htonl() 函数(对于 32 位数字)之类的东西快速转换这些字节。
    • 要使用 htonl() ,我认为我们需要包含 "winsock2.h" 并且我的程序在包含 winsock2 时显示许多重新定义错误。那么有没有其他方法可以将这个小端转换为大端
    • 没错,htonl() 函数在 winsock 库中(不知道为什么,但确实如此)。您可以手动完成(例如,请参阅:stackoverflow.com/questions/859535/…),但最简单的方法是调用已经提供的函数。
    • 出于某种草率的原因,winsock2.h 必须包含在 windows.h 之前,而不是之后。
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2019-02-21
    • 1970-01-01
    • 2015-03-21
    • 2015-07-25
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多