- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: UART Control mit VB.NET

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Anzeige

    Praxistest und DIY Projekte
    Leider muss ich jetzt hier nochmal pushen um dass Thema mal wieder aufzuwerfen.

    Ich hab leider ein großes Problem:

    Ausgangslage: Ich "benutze" meinen Roboter mit dem HyperTerminal -> alles geht gut und ist lesbar

    VB: Ich empfang bei Encoding default keine Zahlen. (Scheint wohl Ascii zu sein)
    Stell ich das Encoding manuell auf Unicode oder BigEndianUnicode, dann hab ich zwar alle Zahlen, aber der Text stellt sich mir nur Kästchen dar. Ich hab leider keinen Plan was da los ist und was ich ändern soll. Vorallem, da dass Hyperterminal, welches auf ANSI Terminalerkennung gestellt ist, alles richtig macht.

    Ne Idee? Danke. Ich häng hier gleich noch meine VB Datei an.

    Andun

    http://www.subms.de/files/SUBMESS_PC_Client.rar
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    Das Encoding muss auf ASCII stehen.

    An die "Zahlen" kommst du dann per Asc(Zeichen As String) ran. Das musst du dann irgendwo bei deiner Empfangsroutine einfügen...

    (ich weiß, das ist kein schönes VB.NET, es sei mir verziehn )

    Gruß Cowz

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Moin

    Achso ... Wenn ich die erst wieder zurückwandeln muss ... ist aber schon seltsam ... Naja, danke. Werd ich so machen.

    Nachtrag:
    Also ich versteh jetzt aber immer noch nicht, wie dass dann gehen soll? Ich wandel ja im µC schon die Zahlen in ihr Ascii pendant um, deswegen funktioniert es ja auch im Hyperterminal ...

    Oder ich hab dich noch nciht richtig verstanden.

    Danke

    Andun

    Nachtrag:

    Ich hab es jetzt über folgende Konstruktion, welche aber sichtlich langsam alles aufbaut gelöst. Wenn du bitte ne besser Lösung hast, wäre ich dankbar.

    Code:
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Do
                If SerialPort1.ReadBufferSize = 0 Then
                    Exit Do
                End If
                Me.SetText(Chr(SerialPort1.ReadChar()))
            Loop
            'Me.SetText(SerialPort1.ReadExisting) <-- ging ja nciht
        End Sub
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  4. #24
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    ansich müsste ReadExisting dir direkt den Text (also als ASCII Zeichen kodiert (65 => A)) ausgeben.

    Bist du sicher dass du
    Connection.Encoding = System.Text.Encoding.ASCII
    gemacht hast?

    Gruß, CowZ

  5. #25
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Moin

    Also:
    Ich habe jetzt nochmal alles ausprobiert und habe immer noch die gleichen Symptome. Hier seht hier mal alles:

    So sieht es im Hyperterminal aus und auch in meiner Variante mit der Schleife über jeden einzelen char wie ich oben gepostet habe:

    Code:
    COM1 als aktiven Port ausgewählt
    Verbindung wurde geöffnet
    Geschrieben wurde: 6
    Alle Werte aus dem EEPROM auslesen
    18:07:41 08.01|87|188|97
    18:10:00 08.01|87|188|97
    22:32:57 08.01|87|188|97
    22:39:00 08.01|87|188|97
    22:39:25 08.01|87|188|98
    22:40:00 08.01|87|188|98
    22:49:15 08.01|87|188|97
    22:50:00 08.01|87|188|97
    22:51:33 08.01|87|188|98
    22:52:19 08.01|87|188|98
    22:57:00 08.01|87|188|97
    22:58:24 08.01|87|188|97
    usw.
    So, sieht es aus, wenn ich das Encoding immer noch auf Ascii lasse, aber die Variante mit ReadExisting nutze:
    Code:
    COM1 als aktiven Port ausgewählt
    Verbindung wurde geöffnet
     Befehl eingeben: Geschrieben wurde: 6
    Alle Werte aus dem EEPROM auslesen
    188:08|88
    8
    30.877|20 0|972:017188:18|88
    8
    54.877|26 0|983:017188:08|88
    8
    59.877|23 0|983:018

    Wenn ich das Encoding auf Unicode stelle wird seltsamerweise zwar nicht mehr an Inhalt angezeigt, aber die Formatierung bei der Uhrzeit nimmt bessere Formen an:

    Code:
    COM1 als aktiven Port ausgewählt
    Verbindung wurde geöffnet
    扁瑳湡獤敳獮牯湥›਍㈀㔵ഀ䈊瑩整䈠晥桥楥杮扥湥›਍獅猠湩⁤㄀  楍⹮ഠ 楄⁥敬穴整䴠獥畳杮眠牡甠  䴠湩*⸮*敭獳湥⸠⸮਍䄀汬獥洠獥敳൮
    汁敬圠牥整搠牥氠瑥瑺湥愠瑫敵汬湥䴠獥畳杮猠数捩敨湲മ
    asd摁敲獳㩥 ㈲7ഠ
    湅敤猠数捩敨湲⤨മ
    Geschrieben wurde: 6
    汁敬圠牥整愠獵搠浥䔠偅佒⁍畡汳獥湥਍㄀㠀㨀 㜀㨀㐀㄀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    18:10:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㌀㈀㨀㔀㜀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    22:39:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㌀㤀㨀㈀㔀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    22:40:00 08.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㐀㤀㨀㄀㔀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    22:50:00 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㔀㄀㨀㌀㌀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    22:52:19 08.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㔀㜀㨀    㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    22:58:24 08.01|㜸簀㄀㠸簀㤀7਍㈀㌀㨀㄀ 㨀    㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    23:26:04 08.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㈀㜀㨀 ㄀  㠀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    23:27:06 08.01|㜸簀㄀㠸簀㤀7਍㈀㌀㨀㈀㤀㨀㈀   㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    23:30:00 08.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㔀 㨀㐀㔀  㠀⸀ ㄀簀㠀7|㠱8|㜹ഀ
    23:53:39 08.01|㜸簀㄀㠸簀㤀7਍㈀㈀㨀㔀㄀㨀㔀㜀  㤀⸀ ㄀簀㠀7|㠱8|2:53:27 09.01|㜸簀㄀㠸簀㤀8਍㈀㈀㨀㔀㌀㨀㔀㠀  㤀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    23:00:00 09.01|㜸簀㄀㠸簀㤀8਍㈀㌀㨀㄀ 㨀    㤀⸀ ㄀簀㠀7|㠱8|㠹ഀ
    (Wie ich hier im Fenster grade sehe ist wohl ein Steuerzeichen für rechts nach links schreiben drinne, deswegen dass umdrehen, aber ich finde es beachtlich, dass hier die Formatierung mit Doppelpunkten bei der Uhrzeit stimmt, was bei Ascii ja nicht der fall ist)

    Kann mir dass zufällig jemand ekrlären?

    Hier die Datei:
    http://www.subms.de/files/SUBMESS_PC_Client2.rar
    (Ich weiß, dass die Fehlerbehandlung bei der Variante noch nicht richtig ist, aber das ist erstmal egal)

    Danke

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  6. #26
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    das einzige, was dich an der "ReadExisting"-Variante stört, sind doch die ungewollten Zeilenumbrüche oder?
    Das liegt dann vermutlich entweder daran, dass er nach jedem Empfangendatenblock automatisch ein Zeilenumbruch sendet, oder deine Funktion zum Empfangen das macht... Kannst du diese Funktion nochmal posten?

    Gruß, CowZ

  7. #27
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Ne Leider sind es nicht nur die Umbrüche. Wenn du dir mal die gewollte ausgabe (1.) anschaust, siehst du dass die Daten auch gut für Menschen lesbar sind, mit Datum und dann 3 Werte getrennt durch einen |. Das ist leider bei der 2. Variante nicht der Fall.

    Zum senden vom Robo aus, benutze ich die Funktionen aus dem RN Wiki + Asuro PrintInt sieht dann zusammen so aus:

    uart.c
    Code:
    /*
    UART Funktionen
    */
    #include <avr/io.h>
    #include "uart.h"
    #include <stdlib.h>
    
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
    
    void uart_init()
    {
    	UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
    	UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
       
        // UART Receiver und Transmitter anschalten
        // Data mode 8N1, asynchron
        UCSRB = (1 << RXEN) | (1 << TXEN);
        UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    
        // Flush Receive-Buffer
        do
        {
            unsigned char dummy;
            (void) (dummy = UDR);
        }
        while (UCSRA & (1 << RXC));
    }
    
    void uart_puts (const char *s)
    {
        do
        {
            uart_putc (*s);
        }
        while (*s++);
    }
    
    /*Gibt einen Integer über die UART Schnittstelle aus*/
    void PrintInt(int a){
    	char temp[10];
    	itoa(a,temp,10);
    	uart_puts(temp);
    }
    
    /*Übernommen und abgewandelt aus der Asuro Lib 2.6
    ACHTUNG: In *data muss eine Platz mehr sein, als die Zeichenkette! (/0 Zeichen)
    */
    void SerRead(unsigned char *data, unsigned char length,unsigned int timeout)
    {
    	unsigned char i = 0;
    	unsigned int  time = 0;
    	if (timeout != 0) {
    		while (i < length && time++ < timeout) {
    			if (UCSRA & (1 << RXC)) {
    				data[i++] = UDR;
    				time = 0;
    			}
    			Msleep(10);
    		}
    		if (time > timeout) data[0] = 'T';
    	}
    	/* blocking */
    	else {
    		while (i < length) {
    			if (UCSRA & (1 << RXC)) 
    				data[i++] = UDR;
    		}
    	}
    	data[length] = 0;
    }
    uart.h
    Code:
    /*
    Header für uart.c
    ------------------------
    Johannes Kreuzer - 2006
    */
    #ifndef _UART_H_
    #define _UART_H_
    
    #include <avr/io.h>
    
    extern void uart_init(void);
    extern void Msleep(int dauer);
    
    static inline void uart_putc (const char c)
    {
        while (!(UCSRA & (1 << UDRE)))
            ;
          
        UDR = c;
    }
    
    static inline int uart_getc_wait(void)
    {
        while (!(UCSRA & (1 << RXC)))
            ;
       
        return (int) UDR;
    }
    
    static inline int uart_getc_nowait(void)
    {
        return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
    }
    
    #endif /* _UART_H_ */
    
    /*Sendet einen String*/
    void uart_puts (const char *s);
    
    void PrintInt(int a);
    void SerRead(unsigned char *data, unsigned char length,unsigned int timeout);

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Mhhh komischer Fehler... Kann ich dir leider nicht weiterhelfen, sry...

    Gruß, CowZ

  9. #29
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Ja, ok. Hab ich ehrlich gesagt auch fast schon vermutet.

    Ich werde jetzt einfach die Variante mit der Schleife nehmen... ich vermute ja auch irgendwie dass das irgendwas mit dem Timing zu tun hat oder irgendwas ... da sich die fehlerhafte ausgabe ändert, wenn der Ticker nebenher läuft. Also dann ist sie anders falsch. Aber so mit der Schleife gehts.

    Danke trotzdem für die Mühen.

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen