Skocz do zawartości

Odczyt danych Z modułu wagowego RS232 ASCII do Arduino


Pomocna odpowiedź

Napisano

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ć ?

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.

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.

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.

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.

Chodziło mi o zrzuty z terminala 'arduinowego'.

Nie odpowiedziałeś na pytanie o wysyłanie danych odebranych przez Arduino z powrotem do wagi.

Nie takiej potrzeby nie ma,

(do wagi wysyłać mam tylko komendę "T" wtedy kiedy zajdzie taka potrzeba.

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'?

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.

Tak.

te informacje idą na początku tylko. To jakby inicjalizacja czy coś takiego.

Po tym zaczynają lecieć już docelowe dane z wagi.

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.

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?

  • 2 tygodnie później...

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...