www.mikrocontroller.net

Forum: PC-Programmierung Probleme mit VB Expess Comport Daten empfangen


Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe ein kleines Problem, ein paar Bytes mit VisualBasic Express2008 aus 
meinem ATmega32 zu lesen.

Mit der Funktion ConfigRead_Click sende ich ein 0xA1 an den ATmega, um 
ihm zu sagen, was er schicken soll. Leider muß ich es 2-3 mal ausführen, 
bis die Zeichen in richtiger Reihenfolge ankommen.
Teste ich es mit HTerm, funktioniert es tadellos. Wo habe ich einen 
Fehler in der Empfangsroutine?
    Private Sub ConfigRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConfigRead.Click
        bytTransmit(0) = &HA1
        bytTransmit(1) = &H0
        SerialPort1.Write(bytTransmit, 0, 2)
        ReceiveBytes()

        Bel1EinStunden = bytReceived(0)
        Bel1EinschaltStunden.Value = CStr(Bel1EinStunden)
        Bel1EinMinuten = bytReceived(1)
        Bel1EinschaltMinuten.Value = CStr(Bel1EinMinuten)
        Bel1AusStunden = bytReceived(2)
        Bel1AusschaltStunden.Value = CStr(Bel1AusStunden)
        Bel1AusMinuten = bytReceived(3)
        Bel1AusschaltMinuten.Value = CStr(Bel1AusMinuten)
        '    Bel1EinschaltMinuten.Value = CStr(Bel1EinMinuten = bytReceived(1))              'Beleuchtungszeit 1 Einschaltzeit Minuten
        '   Bel1AusschaltStunden.Value = CStr(Bel1AusStunden = bytReceived(2))              'Beleuchtungszeit 1 Ausschaltzeit Stunden
        '  Bel1AusschaltMinuten.Value = CStr(Bel1AusMinuten = bytReceived(3))              'Beleuchtungszeit 1 Ausschaltzeit Minuten
    End Sub



    Public Sub ReceiveBytes()
        ' receives it on  serial port2

        'dim includes the 0 case
        'must be dimensioned or you will get a run time
        'error with the "bytReceived(iI) = SerialPort2.ReadByte"
        'below- this will be generalized
        Dim iI As Integer = 0
        While SerialPort1.BytesToRead > 0 Or iI = 0
            'note that if we are waiting for a message
            'the >0 will show as false immediately, 
            'so the iI=0 condition is added
            bytReceived(iI) = SerialPort1.ReadByte
            iI = iI + 1
        End While
        'MsgBox("Number of bytes received- " & Str(iI) & vbCrLf & _
        'BitConverter.ToString(bytReceived), _
        'MsgBoxStyle.OkOnly, "Message Received")
    End Sub

Gruß Sascha

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Focus schrieb:
       Dim iI As Integer = 0
        While SerialPort1.BytesToRead > 0 Or iI = 0
            'note that if we are waiting for a message
            'the >0 will show as false immediately, 
            'so the iI=0 condition is added
            bytReceived(iI) = SerialPort1.ReadByte
            iI = iI + 1
        End While

Nach dem ersten Durchlauf ist iI nicht mehr 0, aber vielleicht das 
zweite Zeichen (wieviele Zeichen erwartest Du eigentlich?) noch nicht 
eingetroffen, also .BytesToRead = 0 und die While Schleife bricht ab.
Du solltest entweder lesen (und dabei warten) bis Du ein eindeutiges 
Endzeichen oder eine vorbestimmte Anzahl Zeichen empfangen hast.
Eventuell mit einem Timeout, falls etwas schiefgeht.

Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@severino, danke für deine Antwort. Habe es geändert und es 
funktioniert.

Nun kommt (natürlich) das nächste Problem. Ich sende vom PC zum AVR bis 
zu 64 Bytes ( nutze die Uart-Lib von Peter Fleury). Nun gehen teilweise 
welche verloren, anstatt dem eigentlichen Wert dann eine 0. Das bei 10 
Versuchen,  ca. 4 mal.

Teste ich es anstatt dem AVR mit HTerm, sieht man, das alle Bytes 
erfolgreich gesendet werden. Also liegt es jetzt am AVR Programm.

Hier der Teil der main.c
unsigned int c;
unsigned char Kommando;
int main(void)
{
  lcd_ini();
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  Init_ISR();
  
  while(1)
    {
    
      lcd_gotoline(1);
      lcd_writezahl (STUNDE, 2, 0);
      lcd_writechar (':');
      lcd_writezahl (MINUTE, 2, 0);
      lcd_writechar (':');  
      lcd_writezahl (SEKUNDE, 2, 0);
      
      lcd_gotoline(3);
      lcd_writezahl (Bel1EinStunden, 2, 0);
      lcd_writezahl (Bel1EinMinuten, 2, 0);
      lcd_writezahl (Bel1AusStunden, 2, 0);
      lcd_writezahl (Bel1AusMinuten, 2, 0);
      lcd_writezahl (BelDimbar, 2, 0);
      lcd_writezahl (Bel1Dimzeit, 2, 0);
      lcd_writezahl (Bel1DimMin, 2, 0);
      lcd_writezahl (Bel1DimMax, 2, 0);
           c = uart_getc();
      if ( c & UART_NO_DATA )
        {
        /* 
         * no data available from UART 
         */
        }
      else
        {
        Kommando = (c & 0xff);
        // 0xa0 = Uhrzeit vom PC empfangen
        // 0xa1 = Config an PC senden
        // 0xa2 = config vom PC empfangen
          switch (Kommando)
          {
            case (0xA0):
              Set_Time();
              break;
        
            case (0xA1):
              Write_Uart_Config();
              break;
        
            case (0xA2):
              Read_Uart_Config();
              break;
        
            default:
              ;
              break;
          }
        
        
        }
    }

return 0;
}
void Read_Uart_Config(void)
{
  unsigned char LowByte, HighByte;
  Bel1EinStunden = uart_getc();
  Bel1EinMinuten = uart_getc();
  Bel1AusStunden = uart_getc();
  Bel1AusMinuten = uart_getc();
  BelDimbar = uart_getc();
  Bel1Dimzeit = uart_getc();
  Bel1DimMin = uart_getc();
  Bel1DimMax = uart_getc();
  Bel2Aktiviert =  uart_getc();
  Bel2EinStunden = uart_getc();
  Bel2EinMinuten = uart_getc();
  Bel2AusStunden = uart_getc();
  Bel2AusMinuten = uart_getc();
  Bel2Dimzeit =  uart_getc();
  Bel2DimMin = uart_getc();
         ...
}

Gruß Sascha

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Focus schrieb:

> Teste ich es anstatt dem AVR mit HTerm, sieht man, das alle Bytes
> erfolgreich gesendet werden. Also liegt es jetzt am AVR Programm.

Also mach im Forum "µC & Elektronik" einen neuen passenden Thread auf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.