Skocz do zawartości

Odczyt danych Z modułu wagowego RS232 ASCII do Arduino


WEIGT

Pomocna odpowiedź

Witam wszystkich serdecznie.

Jest to mój pierwszy post na forum. Tym Bardziej Witam wszystkich.

Mam taki problem.

Potrzebuję nawiązać komunikację z pewnym modułem wagowym poprzez port RS232.

Moduł ten nie posiada wyjścia tensometrycznego tylko RS232.

Za pośrednictwem tego portu przebiega proces Tarowania i Zerowania i ogólnego konfigurowania wagi.

O ile moduł sam w sobie ma wiele możliwości mnie interesuje tylko "masa zważona" i wysyłanie do modułu komendy "T" w ASCII w celu wytarowania wagi.

Po podłączeniu rs232 wagi do rs232 w komputerze PC mam pełną kontrolę nad wagą, przez HyperTerm.

( zdjęcie poniżej)

W trybie ciągłym waga wysyła wszystkie potrzebne komunikaty i informacje.

Potrzebuję zbudowania urządzenia zastępującego komputer PC>

tj;

Chcę zastosować Arduino do zbierania wszystkich informacji z wagi i wyświetlania na matrycę 7 segmentową, konkretnej wagi która jest wysyłana ciągle w komórce (GEWICHT) "na zdjęciu powyżej.

Podłączyłem wagę do Arduino poprzez układ MAX 232.

Ale po uruchomieniu komunikacji w Arduino mam problem.

tj;

Zapętla się to co przysyła waga.

Nie odbiera najważniejszych danych, które przez HyperTerm normalnie są wyświetlane.

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
 Serial.begin(19200); //Uruchomienie komunikacji
}

void loop() {
 if(Serial.available() > 0) { //Czy Arduino odebrano dane
   odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   Serial.println(odebraneDane); //Wyświetl dane
 }
}

Co ciekawe, czasami podczas majstrowania kablami rx/tx wartość ta zostaje wysłana do Arduino.. .

Czy mogli byście mnie nakierować ?

Link do komentarza
Share on other sites

W tej chwili (patrząc po kodzie) masz trzy urządzenia na jednej magistrali: mikrokontroler, konwerter USB-serial i wagę (poprzez układ MAX232). Jeśli chcesz wysyłać dane do komputera, to musisz np. zastosować układ z większą liczbą modułów UART lub zastosować programową implementację interfejsu.

Link do komentarza
Share on other sites

Dzięki za odpowiedź. Chyba nie do końca się zrozumieliśmy.

Połączenie jest tylko między Wagą a Arduino.

W wadze RX/TX do układu MAX232 i z układu max 232 do Arduino RX/TX

Max 232 zastosowany dla wyrównania poziomów napięć sygnałów.

Link do komentarza
Share on other sites

Połączenie jest tylko między Wagą a Arduino.

To skąd zrzuty z ekranu PC z danymi przesłanymi z Arduino?

I jak rozumiem celem linijki

Serial.println(odebraneDane); //Wyświetl dane 

jest przesłanie danych do wagi?

Generalnie spojrzałbym na oscyloskopie na przebiegi na liniach RX i TX, bo na linii RX mikrokontrolera masz dwa nadajniki (nawet jeśli sobie z tego nie zdajesz sprawy) - wagę oraz konwerter USB-serial. Teoretycznie konwerter USB-serial ma rezystory umożliwiające podłączenie innego nadajnika, ale możliwe, że bufor wyjściowy w donglu RS-232 jest za słaby.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To skąd zrzuty z ekranu PC z danymi przesłanymi z Arduino?

To po to żeby pokazać co wysyła waga przy normalnym podłączeniu i nasłuchiwaniu przez Hyperterm.

Link do komentarza
Share on other sites

No właśnie, a jak w kodzie masz linijkę

Serial.println(odebraneDane); //Wyświetl dane

to wszystkie odebrane dane przesyłasz do wagi (zakładając, że TX mikrokontrolera masz połączone z RX modułu RS-232 - nie pokazałeś schematu).

W tych danych znajduje się wiele liter 'T', więc dla jednej 'paczki' wysłanej z wagi, wysyłasz komendę tarowania kilka razy.

Poza tym

Co ciekawe, czasami podczas majstrowania kablami rx/tx wartość ta zostaje wysłana do Arduino

wskazuje na zawodne połączania. Co to znaczy 'majstrowania'?

Link do komentarza
Share on other sites

To w jaki sposób odbierać, użyć tylko konkretnej wartości ?(zaznaczona na zdjęciu)

potrzebuję wysłać ją na Wyświetlacz np LCD 2x16.

Link do komentarza
Share on other sites

No to w kodzie musisz uwzględnić pomijanie tych tekstowych/początkowych informacji.

Samo wyciąganie masy ze stringa (linii) możesz zrealizować prosto, jeżeli na każde pole w linii jest przypisana ustalona liczba znaków. Wtedy wiesz, że interesująca Cię wartość znajduje się np. od indeksu 10 do indeksu 16 i możesz taki substring konwertować na int/float.

Na czas testów możesz po prostu odłączyć linię RX wagi od Arduino i wtedy możesz wykorzystywać Serial.print() do debugowania. Tarowanie dodasz na samym końcu.

Link do komentarza
Share on other sites

To OK rozumiem. ale po wyciągnięciu z Arduino TX. dalej odczyt kończy się ta tym samym,i zapętla od nowa.

[ Dodano: 16-03-2018, 09:32 ]

A może bufor się zapycha?

Link do komentarza
Share on other sites

Witam.

Kod z arduino SerialEvent przerobiony na odbiór linii tekstu do tablicy znaków char: https://www.forbot.pl/forum/topics74/komunikacja-kilka-liczb-rzeczywistych-arduino-pc-vt15338.htm?sid=3e2eb6499eea4ba3edef412099f8c66e . Wystarczy zamienić "," na ":" , wywalić porównywanie cmd.

Wysłanie linijek initialization będzie powodować wyświetlanie głupot, można sobie to oprogramować. A wygląda to na szybko tak, wysłano dwie linie:

Tarierwert (P): 42119 Tarierwert (G): 1378.3

23.2: 26.4: 82174: 1310.8: 82160: 40041: 1310.2 S

Mogłeś dać text, zrzuty ekranu nie mówią czy to formatowanie spacjami czy tabulatorami, mam nadzieję, że fukcje przy tych bialych znakach dzialają tak samo.

Odebrano na terminalu to:

Otrzymane polecenie: Tarierwert (P): 42119 Tarierwert (G): 1378.3

Tarierwert (P)

42119 Tarierwert (G)

1378.3

Aktualne parametry:

Zmienna 1 = 0.00

Zmienna 2 = 42119.00

Zmienna 3 = 1378.30

Zmienna 4 = 0.00

Otrzymane polecenie: 23.2: 26.4: 82174: 1310.8: 82160: 40041: 1310.2 S

//to wynik podziału tablicy stringów:

23.2

26.4

82174

1310.8

82160

40041

1310.2 S

//A tutaj wynik konwersji funkcją atof() i przypisanie do tablicy floatów

Aktualne parametry:

Zmienna 1 = 23.20

Zmienna 2 = 26.40

Zmienna 3 = 82174.00

Zmienna 4 = 1310.80

Więc Ciebie interesuje wyrzucenie na LCD zmiennej dane[3]. Oczywiście analogicznie można zrobić wszystko.

Kod arduino:

#define buffsize 128
char input[buffsize];
float dane [10]; // jakie i ile  zmiennych odbieramy z UART
byte index = 0; 
boolean stringComplete = false;  // gdy cale polecenie/napis odebrany


void   parsujpolecenia()
 {
   //polecenie ma wygladac tak: cmd=zmienna1,zmienna2,zmienna3,zmienna4  z zalozenia sa to 4 liczby calkowite
   // do 5 cyfr, dlatego buffsize32 ma zapas, dla innych trzeba zmodyfikowac bufor, tablice zmiennych, funkcje
   // do konwersji napisu na liczby
   //cmd=234,342,553,3432

    uint8_t index=0;
   char * polecenie=input;
   Serial.print("Otrzymane polecenie: ");
   Serial.println(polecenie);

   char* command1 = strtok(polecenie, ":");

//if (strcmp(command1 , "cmd")==0){  //sprawdzenie czy czesc przed znakiem = jest rowna cmd
dane[0]=atof(command1);
index++;
while (command1 != 0)
{
Serial.println(command1);
command1 = strtok(NULL, ":"); //dzielimy reszte napisu w miejscach gdzie jest ","

// Find the next command in input string
if(index<10) dane[index]=atof(command1); //konwersja napisu na INT i zapisanie do kolejnej pozycji w tablicy
index++;
} 
//}
// else Serial.println("Polecenie nieprawidlowe"); 
 Serial.println("Aktualne parametry:");
 Serial.print("Zmienna 1 = ");
 Serial.println(dane[0]);
 Serial.print("Zmienna 2 = ");
 Serial.println(dane[1]);
 Serial.print("Zmienna 3 = ");
 Serial.println(dane[2]);
 Serial.print("Zmienna 4 = ");
 Serial.println(dane[3]);
   stringComplete = false;
 }


// Arduino initialization function.
void setup() 
{
 Serial.begin(115200);
}


void loop() 
{ 

if (stringComplete) parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
}



void serialEvent() {
 while (Serial.available()>0) {

char aChar = Serial.read();
    if(aChar == '\n')
    {
      // wykryto znak konca linii \n, koniec odbioru
      input[index] = 0;
      index = 0;
      stringComplete = true;
    }
    else
    {
       input[index] = aChar;
       if(index<buffsize) index++;
       input[index] = '\0'; // Na koncu napisu wstawiamy 0   
    }
 }
}

Bufor ma być tak duży by pomieścić całą linię tekstu, nie wiem, dałem 128, pewnie za dużo. Po każdej linii idex bufora zmienia się na zero i nadpisuje stare dane, wszystko za zerem jest ignorowane.

Tarowanie to np. odczyt stan przycisku i gdy wciśnięty wysłanie Serial.println("T"). Docelowo trzeba też zakomentować wszystko co wysyła się na serial, by waga nie głupiała, że dostaje coś czego nie rozumie. Do potrenowania wystarczy udawanie wagi z terminala i obserwowanie co robi Arduino na terminal i na LCD.

Niektóre komentarze nieaktualne, kod wyjściowy był dla INT (mniej więcej), muszę spadać. Powodzenia.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.