C String ASCII связь с SerialCOM с помощью примера VB

#c #visual-studio-2013 #serial-port #ascii

#c #visual-studio-2013 #последовательный порт #ascii

Вопрос:

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

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

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

Я просто оставлю немного кода.

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

 Private Sub cmdGetTemperaturePV_Click()

  If MSComm.PortOpen Then
    MSComm.Output = Chr(1) amp; Chr(0) amp; Chr(0) amp; Chr(1) amp; Chr(13) amp; 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);
  

Используя программу «Hercules», я могу имитировать прием компьютера, и я вижу, что я отправляю точно то же самое, что и программа 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 amp; Asc(Mid(stx, i, 1)) amp; ","
      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 = " amp; B1 amp; "    9..16 = " amp; B2

        Case 13:
          txtAlarms1.Text = " 1.. 8 = " amp; B1 amp; "     9..16 = " amp; B2
        Case 14:
          txtAlarms2.Text = "17..24 = " amp; B1 amp; "    25..32 = " amp; 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-байтовую строку, и этого не происходит.

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

Еще раз, большое вам спасибо!

Комментарии:

1. Попробуйте дождаться, пока в буфере приема будет 6 байт: while (6 != this->serialPort1->BytesToRead)....

2. Спасибо за ответ, я на самом деле этого не пробовал. К сожалению, я могу проверить это только в следующий понедельник. Я дам некоторый ответ позже. Еще раз спасибо!

3. @JohnnyMopp Я пробовал и не совсем сработал, программа просто перестает работать. С помощью предложенной вами команды я пытаюсь прочитать, сколько байтов находится в буфере, и пытаюсь понять, в чем проблема. Еще раз спасибо за ваше предложение