C ++ String ASCII Связь с SerialCOM с примером VB - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть код VB 5.0, который делает то, что мне нужно, но мне нужно реализовать его в Visual Studio C ++ (2013), дело в том, что я туда не попадаю, и я понятия не имею, что я делаюнеправильно, поэтому я покажу вам некоторый код (VB против C ++ - мой) и надеюсь, что кто-то сможет помочь.

А пока, спасибо, что прочитали это.

Я пробовалчтобы отправить строку в очень разных форматах, и я думаю, что я, наконец, понял, в том, как отправить, проблема по-прежнему читает ответ, я понятия не имею, что я делаю неправильно.Машина возвращается (я думаю, 2 байта), и они НАЧИНАЮТ ЗАГОЛОВОК, и?, Я могу видеть это, печатая в консоли числа 1 и 63.

Я просто оставлю некоторый код.

Для запроса текущей температуры программа VB:

Private Sub cmdGetTemperaturePV_Click()

  If MSComm.PortOpen Then
    MSComm.Output = Chr(1) & Chr(0) & Chr(0) & Chr(1) & Chr(13) & Chr(10)
    txtMsg(1).Text = "1,0,0,1,13,10"
    txtPVTemperature.Text = ""
  Else
    txtMsg(1).Text = "COM Port OFF"
    Beep
  End If

End Sub

А у меня (C ++):

String^ a1 = "\x1";
String^ a2 = "\x0";
String^ a3 = "\x0";
String^ a4 = "\x1";
String^ a5 = "\xD";
String^ a6 = "\xA";
String^ enviar = a1 + a2 + a3 + a4 + a5 + a6;

this->serialPort1->Write(enviar);

С помощью программы "Геркулес" я могу смоделировать приеммашины, и я вижу, что я посылаю то же самое, что и программа VB.Теперь я думаю, что проблема в получении, так что вот что:

Private Sub tmrRun_Timer()

  Dim i As Integer
  Dim apt As Byte, B1 As Byte, B2 As Byte
  Dim stx As String



  If MSComm.PortOpen Then
    If MSComm.InBufferCount >= 6 Then
      stx = MSComm.Input
      stx = Right(stx, 6)
      txtMsg(2).Text = ""
      For i = 1 To Len(stx)
        txtMsg(2).Text = txtMsg(2).Text & Asc(Mid(stx, i, 1)) & ","
      Next i
      txtMsg(2).Text = Left(txtMsg(2).Text, Len(txtMsg(2).Text) - 1)

      apt = Asc(Left(stx, 1))
      B1 = Asc(Mid(stx, 2, 1))
      B2 = Asc(Mid(stx, 3, 1))

      Select Case apt
        Case 1:
          txtPVTemperature.Text = Format(0.1 * GetInt(B1, B2), "0.0")
        Case 2:
          txtSPTemperature.Text = Format(0.1 * GetInt(B1, B2), "0.0")
        Case 3:

        Case 4:
          txtPVHumidity.Text = Format(0.1 * GetInt(B1, B2), "0.0")
        Case 5:
          txtSPHumidity.Text = Format(0.1 * GetInt(B1, B2), "0.0")
        Case 6:

        Case 7:
        Case 8:
        Case 9:
          If Asc(Mid(stx, 2, 1)) > 0 Then
            txtChamber.Text = "ON"
          Else
            txtChamber.Text = "OFF"
          End If

        Case 10:
          txtEvents.Text = GetInt(B1, B2)
        Case 11:

        Case 12:
          txtInputs.Text = "1..8 = " & B1 & "    9..16 = " & B2

        Case 13:
          txtAlarms1.Text = " 1.. 8 = " & B1 & "     9..16 = " & B2
        Case 14:
          txtAlarms2.Text = "17..24 = " & B1 & "    25..32 = " & B2

      End Select
    End If
  End If

End Sub

И я пробую много разных вещей, лучшее, что я получил (тот, который привел меня к 1 и 63)это:

{
        String^ rec;

        if (this->serialPort1->IsOpen)
        {
            this->textBox1->Text = String::Empty;

            try
            {
                rec = this->serialPort1->ReadExisting();
            }
            catch (TimeoutException^)
            {
                this->textBox2->Text = "Timeout";
            }
        }

        this->textBox1->Text = rec;

        char aux[100];

        if (rec == String::Empty)
            this->textBox2->Text = "String Empty";
        else
        {
            std::string rec1 = marshal_as<std::string>(rec);

            strcpy(aux, rec1.c_str());


            int a, b, c, d, e1, f;

            printf("String received: ");

            for (int i = 0; i < 6; i++)
            {
                if (aux[i] == 0)
                    break;
                printf("%ld ", aux[i]);
                if (i == 0)
                    a = aux[i];
                if (i == 1)
                    b = aux[i];
                if (i == 2)
                    c = aux[i];
                if (i == 3)
                    d = aux[i];
                if (i == 4)
                    e1 = aux[i];
                if (i == 5)
                    f = aux[i];
            }
        }
    }

Я ожидаю получить 6-байтовую строку, и это не происходит.

Мне очень жаль за длинный пост, но я думаю, что таким образом я могу бытьболее конкретно.

Опять же, большое спасибо!

...