• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Qt] [Arduino] Rozkodowywanie danych z portu szeregowego

Cloud VPS
0 głosów
235 wizyt
pytanie zadane 11 maja 2019 w C i C++ przez albert828 Nowicjusz (200 p.)

Cześć,
Wysyłam sobie dane z Arduino przez port szeregowy i odbieram je w aplikacji napisanej w Qt. Problem mam taki że wysyłam ciąg w postaci "H123 V2 L63 V2413 I23 CRC2a" Czyli znak, wartość spacja itd. I mam problem z odebraniem tych danych tak aby nie otrzymywać sieczki. Przykładowy odbiór: "H&?? j\u0002I&\u001AICL?H".
Czyli generalnie mam problem z rozkodowywaniem. Nie mogę sobie ustalić na sztywno konwersji bo rozmiar stringu się zmienia (inna długość gdy np mam H2 a inna gdy H123). Macie jakieś propozycje jak to rozwiązać?
Kod arduino:
 

String data;
void loop() {
  ++H; ++V; ++L; ++I;
  data = String("H");
  data += String(H, DEC);
  data += String(" V");
  data += String(V, DEC);
  data += String(" L");
  data += String(L, DEC);
  data += String(" I");
  data += String(I, DEC);
  CRC = CRC8(data.c_str(), strlen(data.c_str()));
  data += String(" CRC");
  data += String(CRC, HEX);
  Serial.println(data);
  delay(1000);
}

Kod Qt:
 

while(serial.isOpen())
{
  QByteArray data;
  
  if (serial.waitForReadyRead(1000))
  {
    data = serial.readLine();
    while (serial.waitForReadyRead(100))
    {
        data += serial.readAll();
    }
    QString response = QString::fromUtf8(data);
    qDebug() << "Data " << response << endl;
  }
  else
    qDebug() << "Timeout";
}

 

komentarz 11 maja 2019 przez j23 Mędrzec (195,240 p.)
edycja 11 maja 2019 przez j23

Nie rozumiem jednej rzeczy. Po co jest ta wewnętrzna pętla, skoro przed nią wywołujesz readLine (zakładam, że czyta całą wysłaną linię)?

 

Wydaje mi się, że powinieneś użyć QString::fromLocal8Bit zamiast QString::fromUtf8 (chyba że nadajesz w UTF-8).

 

Ten strlen trochę bez sensu jest, bo String ma metodę length :)

komentarz 11 maja 2019 przez albert828 Nowicjusz (200 p.)
edycja 11 maja 2019 przez albert828

Co do wewnętrznej pętli teoretycznie masz rację praktycznie bez tego nie działa (ucina wiadomości) nie doszedłem dlaczego tak jest :).

Co do kodowania masz rację rzecz w tym że QString nie zawiera metody fromAscii() (dałem jako przykładowe Utf-8). Testowałem wcześniej QString::fromLocal8Bit ale też otrzymuję taką sieczkę że nie jestem w stanie zlokalizować znaków przed wartościami. Dlatego liczę na to że coś w tym temacie pomożecie.

Faktycznie z length masz rację :)

Problem rozwiązany. Głupi błąd w Qt ustawiłem bit parzystości a w Arduino już nie. Co ciekawe dla 

Serial.println("Test");

działało poprawnie i to mnie zmyliło.Dzięki j23 za chęć pomocy! :)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 1,422 wizyt
0 głosów
0 odpowiedzi 164 wizyt
0 głosów
1 odpowiedź 658 wizyt
pytanie zadane 7 kwietnia 2016 w Mikrokontrolery przez sofnir Gaduła (4,690 p.)

93,469 zapytań

142,404 odpowiedzi

322,716 komentarzy

62,852 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...