c++ - 将十六进制字节发送到串行端口

标签 c++ c++-cli hex

我正在尝试将十六进制字节发送到串行 com 端口。问题是发送命令的段显然需要系统字符串而不是整数(错误 C2664“无法将参数 1 从‘int’转换为‘System::String ^’)。我一直在寻找一种方法来发送一个取而代之的是整数,但没有运气。(我尝试发送十六进制值的字符串表示,但设备无法识别这些命令)

代码主要部分

private: System::Void poll_Click(System::Object^  sender, System::EventArgs^  e) 
     {
            int i, end;
            double a = 1.58730159;
            String^ portscan = "port";
            String^ translate;
            std::string portresponse [65];
            std::fill_n(portresponse, 65, "Z");

            for (i=1;i<64;i++)
            {
                if(this->_serialPort->IsOpen)
                {
                    // Command 0 generator
                    int y = 2;
                    y += i;
                    int command0[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, dectohex(i), 0x00, 0x00, dectohex(y)};

                    for (end=0;end<10;end++)
                    {
                        this->_serialPort->WriteLine(command0[end]);
                    }

                    translate = (this->_serialPort->ReadLine());
                    MarshalString(translate, portresponse [i]);
                    if(portresponse [i] != "Z")
                    {
                        comboBox7->Items->Add(i);
                    }
                    this->progressBar1->Value=a;
                    a += 1.58730159;
                }
            }


     }

这是函数 dectohex:

    int dectohex(int i)
         {
            int x = 0;
            char hex_array[10];
            sprintf (hex_array, "0x%02X", i);
            string hex_string(hex_array);
            x = atoi(hex_string.c_str());
            return x;
         }

这就是解决我的问题的方法,由 Jochen Kalmbach 提供

auto data = gcnew array<System::Byte> { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x00, 0xBD };
_serialPort->Write(data, 0, data->Length);

替换了这个

this->_serialPort->WriteLine(command0[end]);

最佳答案

您不能通过串行线路发送整数....您只能发送 BYTES(7-8 位)!

你需要选择你想做什么:

  • 发送的字符:所以“数字”12会被转换成字节

    _serialPort->Write(12.ToString());
    // => 0x49, 0x50
    
  • 将整数(4 字节)作为小端发送

    auto data = System::BitConverter::GetBytes(12);
    _serialPort->Write(data, 0, data->Length);
    // => 0x0c, 0x00, 0x00, 0x00
    
  • 或者你只写一个字节:

    auto data = gcnew array<System::Byte> { 12 };
    _serialPort->Write(data, 0, data->Length);
    // => 0x0c
    
  • 或者写一个字节数组:

    auto data = gcnew array<System::Byte> { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x00, 0xBD };
    _serialPort->Write(data, 0, data->Length);
    // => 0xFF 0xFF 0xFF 0xFF 0xFF 0x02 0xBF 0x00 0x00 0xBD
    

关于c++ - 将十六进制字节发送到串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103779/

相关文章:

java - C++ 中的多态性和继承

c - 如何使用 gperf 为一系列值创建散列?

java - 字符串 as\x03\x00\x00\x00 转为整数

c++ - 如何为 Visual Studio 2012 调试器编写自定义 native 可视化工具 DLL?

c++ - 我们可以在 C++ 类的成员函数中使用 cin>> 吗?

c - 我是否需要在 C++/CLI 中删除非托管对象

c# - 从 C++/CLI 访问 TryGetMember

java - 为什么我制作的 Basic Java Hex Editor 会卡住大约 2MB 大小或更大的文件?

templates - 使用多个模板的运算符重载

c++ - C++ 中的闭包