2

シリアル COM ポートに 16 進数のバイトを送信しようとしています。問題は、コマンドを送信するセグメントが整数ではなくシステム文字列を必要としているように見えることです (エラー C2664 "パラメータ 1 を 'int' から 'System::String ^' に変換できません)。代わりに整数を使用しましたが、うまくいきませんでした (16 進値の文字列表現を送信しようとしましたが、デバイスはコマンドを認識しませんでした)。

コードの主要部分

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;
         }

これが私の問題を解決したものです。ヨッヘン・カルムバッハの厚意により

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]);
4

1 に答える 1

1

シリアルラインで整数を送信することはできません....送信できるのは 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
    
  • または、1 バイトだけを書き込みます。

    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
    
于 2013-08-07T13:18:36.450 に答える