PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [LabView] zeilenweises Auslesen der seriellen Schnittstelle



bmtil
05.10.2011, 14:32
Hiho.
Vorneweg: ich hoff mal hier gibt es ein Paar LabView Profis und ich benutze die 2011'er Version von LabView.
Ich hab ein folgendes Problem.
Nachdem ich meinen µC beigebracht hab 2 verschiedene Temperaturwerte
(von 2 verschiedenen LM35) in digitale Werte umzuwandeln und diese mir
auf den Hyperterminal zu schicken, versuche ich nun das selbe in
LabView.
Wer hätte es gedacht, natürlich hat es nicht auf Anhieb funktioniert.
Mit nur einem angelöteten Sensor hat es wunderbar geklappt, also das
Auslesen der seriellen Schnittstelle, mit zwei nicht.
Hab mal meine "Prinzipschaltung" angehangen um das Problem
zu verbildlichen (hätte auch gern die VI angehangen, aber das geht ja leider nicht).
Hier kommt das "krankheitsbild":
Erstens: gibts keine Veränderung der Temperaturwerte in LabView wenn ich
die erwärme.
Zweitens: die For Schleife läuft anscheinend genau 2 mal. (sonst gäbe es
ja eine Wertveränderung).
Drittens: Anscheinend kommt das Signal noch nichteinmal in die Case
Struktur rein.

Das sind gerade so die größten Probleme.
An irgendwelchen Einstellungen scheint es nicht zu liegen, da die
Übertragung mit nur einem Sensor funktioniert.
Das Zusammensetzen des Arrays aus dem Datenstring sollte auch richtig
sein, weil LabView das Zeilenumbruchzeichen (0x0A) ja auch versteht.

Bin für jede Hilfe dankbar
Grüße.

Ceos
05.10.2011, 15:27
dein Bild ist bei mir sehr klein und praktisch unlesbar, liegt das am Forum!? Hab schon öfters gesehn das forumbilder kleiner sind als das was druntersteht!

du kannst deine labview "schaltung" als bild exportieren, jemand mit dem passenden labview kann es dann einfachn in ein VI ziehen udn es baut sich selber zusamenn, also her damit ^^ .. Übung hab ich mittlerweilen genug was COM und co. angeht

bmtil
06.10.2011, 06:00
Alles klar,
hab mal die VI als Screenshot hochgeladen, mit dem Prinzip was es machen soll.
und hier ist das stueckchen programmcode welches für das senden der sensordaten an den rechner verantwortlich ist:



while(1)
{

if (overflowzahl >= 1)
{
if (adc_wertref = adc_read_avg(0, 100))
{
itoa(adc_wertref, buffer, 10);
uart_puts("Ref");
uart_puts(buffer);
USART_Transmit(0x0A);
}

if (adc_wertkam = adc_read_avg(1, 100))
{
itoa(adc_wertkam, buffer, 10);
uart_puts("Kam");
uart_puts(buffer);
USART_Transmit(0x0A);
}
USART_Transmit(0x0A);
overflowzahl=0;

}


}

jetzt noch eine wichtige Frage:
Reicht es dem Labview zu verstehen dass "0x0A" das Zeilenumbruchszeichen ist?
Eigentlich versteht es das Zeichen ja, aber ist LabView intelligent genug den String auch an genau diesen Stellen zu zerlegen und eben ein Array daraus zu basteln?
Oder muss ich dafuer noch irgendwas in meinem C-Quellcode ändern, das wäre echt ärgerlich, da LabView>>C ^^

Die "Diagnose" geht weiter (hab irgendwie echt viel mit Medizin zu tun)
Die Werte kriege ich ja immer abwechselnd, die Stringlänge ist also genau 7 (wenn der gesamte String ankommen würde, müsste die Länge bei 14 liegen) (3 Buchstaben, 3 Zahlen (Zimmertemperatur, Wert noch nicht in Temperatur ausgerechnet, Zeilenumbruchzeichen welches ja nicht angezeigt wird), also versteht Labview tatsächlich was ich davon will.
Warum also kriegt es nicht hin die Werte mir gleichzeitig in einer Matrix (von dem Wort Array könnt ich langsam kotzen) untereinander anzuzeigen?

PS irgendwie stellt das Forum die Bilder viel zu klein dar -.-

Ceos
06.10.2011, 10:53
okay ich bin mir jetzt dem ganzen programm nicht bewusst, kann also sein dass ich noch was übersehn habe, aber spontan würde ich sagen: richte für den VISA-Name und die Fehlerbehandlung mal unbedingt ein Schieberegister für die Schleife ein also links und rechts deiner while-schleife!
Und im Fehlerfalle solltest du die Schleife unbedingt beenden!
außerdem fängst du das Timeout nicht ab, das wird als Fehler gewertet und jede weitere Operation wird automatisch abgebrochen!

bmtil
06.10.2011, 11:27
Also, hab heute von ganz neu angefangen und folgendes ist rausgekommen:
Ich kann jetzt ein Array erstellen mit tatsächlich zwei (juhu!) Zeilen.
Problem: In der unteren und der oberen Zeile wird synchron das selbe angezeigt.
Mein Datenstring der von der Schnittstelle kommt sieht so aus:
"Ref Temperaturwert Zeilenumbruch
Kam Temperaturwert Zeilenumbruch"

Das heisst ich muss den Datenstring in zwei (später mehr) Teilstrings aufsplitten.
Die Teilung muss immer dann erfolgen wenn ein Zeilenumbruch kommt.
Theoretisch könnte ich eine feste Position des Zeilenumbruchs festlegen, aber das möchte ich nicht, weil das viel Geraffel im C Quellcode für den Mikrocontroller wird.
Das müsste einfacher gehen, indem ich LabView sage: "Such nach dem Zeilenumbruch und wenn du einen gefunden hast, dann teile den String und hänge den gespiltteten teil des Strings unter den ersten Teil (so sollte es prinzipiell dann für alle Stringteile funktionieren: Ersten Zeilenumbruch gefunden--->Rest den Strings an die zweite Zeile anhängen im Array, zweiten Umbruch gefunden--->Rest des Reststrings an die dritte Zeile im Array hängen, usw., sowas in C zu machen ist Sackgang mit meinen sehr spärlichen C kenntnissen).

Hab mal den Screenshot der aktuellen VI angehangen, die kann den Datenstring nicht Teilen, aber immerhin schon zwei Zeilen des Arrays erstellen.
Hoffe mein Problem ist verständlich.

Nochmal zur Erlaüterung:
Ich möchte später alle Eingänge meines ADC an dem AtMega16 nutzen, das sind 8 Stück.
Momentan sind zwei Sensoren an denen angelötet.
Wenn ich spätere neue anlöte, möchte ich einfach nur noch im C Code sagen: "Hey da ist ein neuer Sensor, an den und dem Pin, UART, gib mir die Messwerte des Sensors" Das isn Dreizeiler im C.
LabView soll dann automatisch erkennen dass ein neuer Zeilenumbruch kommt, und automatisch den neuen Wert an das bereits vorhandene Array anhängen (maximal müsste ich dann in LabView sagen dass sich das Array um eine Zeile vergößern muss, dass passiert einfach indem ich einen neuen Case in der For Schleife einfüge, die das Arrays zusammenbaut).

Viele liebe und gerade etwas verzweilte Grüße, Mikhail

PS: mein letzer Satz war ganz schön hart am Rande der Homosexualität.

Ceos
06.10.2011, 11:36
dann solltest du vll. doch ein klein wenig mehr arbeit in den c-code investieren! mach den buffer um 1 byte größer und füge folgendes hinzu



if (_valuetosend_ = adc_read_avg( _channeltoread_ , 100)) //diese if-abfrage ergibt garkeinen sinn ... wozu das eigentlich .. oder überseh ich was ?
{
itoa( _channeltoread_ , buffer, 10); //solange deine _channeltoread_ nicht größer 9 wird ist das kein problem!
itoa( _valuetosend_ , buffer+1, 10);
uart_puts("dein channel-name");
uart_puts(buffer);
USART_Transmit(0x0A);
}
USART_Transmit(0x0A); // ... noch ein zeilenende ?!
overflowzahl=0;


OT: wenn ich code aus einem quote kopier versemmelt der mir immer alle formatierungen!

in labview brauchst du jetzt nur jedes erste zeichen einer "zeile" als deine kanal-nummer interpretieren

bmtil
06.10.2011, 11:56
Was macht genau die Modifikation im Quellcode?
Wie gesagt meine C Kenntnisse sind sehr bescheiden.
Achja:
Hab das selbe Problem mit den Codes und Quotes wie du.


Das letzte Zeilenende in der If Schleife (was du kommentiert hast) ist noch ein Überbleibsel aus den Spielereien mit dem Terminal.
Das gehört eigentlich nicht mehr da rein.