-
        

Ergebnis 1 bis 10 von 10

Thema: Daten von C# über USB/COM3 zum Mikrocontroller schicken

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.05.2011
    Ort
    NRW
    Alter
    30
    Beiträge
    132

    Daten von C# über USB/COM3 zum Mikrocontroller schicken

    Anzeige

    Hallo,

    ich habe ein Problem. Ich habe ein C# Programm geschrieben mit den ich daten über den Com Port schicken kann. Mein uC soll diese nun empfangen. Sobald Daten empfangen werden, soll die LED am Port-D leuchten.

    Vorher aber erstmal die 2 programme.

    einmal mein uC Programm (Kommt aus den AVR Tutorial von www.mikrocontroller.net, also wird es wohl nicht daran liegen):

    Code:
    .include "m8def.inc"
     
    .def temp = R16
     
    .equ F_CPU = 3686400                             ; Systemtakt in Hz
    .equ BAUD  = 9600                               ; Baudrate
     
    ; Berechnungen
    .equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
    .equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
    .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
     
    .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
      .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
    .endif
     
        ; Stackpointer initialisieren
     
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
        ldi     temp, LOW(RAMEND)
        out     SPL, temp
     
        ; Port D = Ausgang
     
        ldi     temp, 0xFF
        out     DDRD, temp
     
        ; Baudrate einstellen
     
        ldi     temp, HIGH(UBRR_VAL)
        out     UBRRH, temp
        ldi     temp, LOW(UBRR_VAL)
        out     UBRRL, temp
     
        ; Frame-Format: 8 Bit
     
        ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
        out     UCSRC, temp
     
        sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
     
    receive_loop:
       sbis     UCSRA, RXC                      ; warten bis ein Byte angekommen ist
       rjmp     receive_loop
       in       temp, UDR                       ; empfangenes Byte nach temp kopieren
       out      PORTD, temp                     ; und an Port D ausgeben.
       rjmp     receive_loop                    ; zurück zum Hauptprogramm
    und mein C# programm

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;  //Einfügen
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
    
            SerialPort AktuellerComPort = new SerialPort ("COM3",9600,Parity.None, 8,StopBits.One); // ComCort erzeugen 
            
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string[] schnittstellen = SerialPort.GetPortNames();   // Gibt alle aktuell verfügbaren Comports zurück
                foreach (string comport in schnittstellen) 
                {comboBox1.Items.Add(comport); }
                 
    
            }
    
            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    AktuellerComPort.PortName = comboBox1.Text; // dem ComPort Objekt einen Comport zuweisen
                }
                catch (Exception ex)
                {
                     MessageBox.Show(ex.Message);                
                }
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {  
                    AktuellerComPort.Open();
                    AktuellerComPort.Write(textBox1.Text);  // sende inhalt der Textbox an ComPort       
                    AktuellerComPort.Close();
                }
                catch (Exception ex)
                {
                     MessageBox.Show(ex.Message);
                }
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                   AktuellerComPort.ReadTimeout = 300;     //Wartezeit (Timeout Zeit) (in ms) auf Antwort bevor der Lesevorgang abgebrochen wird
                    AktuellerComPort.Open();
                    textBox2.Text = AktuellerComPort.ReadLine();   //einlesen                    
                    AktuellerComPort.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    AktuellerComPort.Close();
                }
            }
        }
    }
    hier noch die Form dazu



    dabei ist der Button "Daten Senden" Button2 und links daneben die Textbox1





    So als Programmer habe ich den myAVR mySmartUSB MK2 bzw habe das kommplette uC Board. Hier ein Bild vom Programmer:



    Ausgangssituration: Programm auf uC und das uC Board am PC via USB angeschlossen. Rote LED vom Programmer leuchtet

    Wenn ich jetzt das myAVRControlcenter benutze (hier ein Bild)



    und die Verbindung herstelle (Start Button oben rechts) dann geht die rote Led von den Programmer aus und die 2 grünen Leds an.
    Gebe ich dann im myAVR Controllcenter unter Daten Senden was ein und klicke Senden werden die Daten übertragen (grüne LEDs blinken) und der D Port vom uC wird gesetzt. -> Die Led Leuchtet (Port D PIN2 ist mit einer Led verbunden)



    Wenn ich das ganze über mein C# Programm probiere, geht die rote LED vom Programmer nicht aus. Gebe ich in der Textbox was ein und klicke den Butten "Daten Senden" leuchten zwar die beiden grünen LEDs vom Programmer kurz auf (also es wird wohl etwas übertragen), aber der uC bzw das Programm macht nichts. Also die LED am D Port leuchtet nicht.

    Wie kann ich das Problem lösen?
    Wäre super wenn einer eine Lösung weiß
    Schonmal vielen Dank für die Antworten!

    mfg André
    Geändert von Staind (06.07.2011 um 18:28 Uhr)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.01.2009
    Ort
    schwabch
    Alter
    32
    Beiträge
    93
    So ein Problem hatte ich auch mal, ich schau mal in meiner Samlung nach den Code - Snippet.
    Welches Net Framework hast du? 3.5?

    MFG Oliver G

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.05.2011
    Ort
    NRW
    Alter
    30
    Beiträge
    132
    erstmal danke für die Antwort.
    habe Framework 4.0
    gruß André

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Es ist ungünstig bei der Serialportklasse den Portnamen nachträglich zuzuweisen bzw. zuändern.
    Erstelle den Comport lieber über einen extra Button der z.B. "Comport erstellen" heißt.
    Dann, hast du die Parity, Baudrate usw. überprüft ?

    Statt einen extra Button "Empfangen von Serialport" registriere dich lieber für das SerialPort.DataRecieved Event.

    Weitere Informationen findest du hier
    http://msdn.microsoft.com/de-de/libr...erialport.aspx

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.01.2009
    Ort
    schwabch
    Alter
    32
    Beiträge
    93

    Beitrag

    Was mir aufgefallen ist, dass brauchst du bei deine jetzigen Code nicht!

    Code:
     private void button1_Click(object sender, EventArgs e)         
              {            
              string[] schnittstellen = SerialPort.GetPortNames();   // Gibt alle aktuell verfügbaren Comports zurück             
              foreach (string comport in schnittstellen)              
              {comboBox1.Items.Add(comport); }                       
              }
    Du hast doch den Com Port statisch zugewiesen mit "Com3".

    Ich hätte das so gemacht:

    Code:
    /// <summary>
            /// Com Port anzahl
            /// </summary>
            /// <returns></returns>
            int PortCount = 0;
            string Rueckmeldung = null;
            private string SerialPortCount()
            {
                try
                {
                    string[] SettingPort = SerialPort.GetPortNames();
                    foreach (string PortName in SettingPort)
                    {
                        PortCount++;
                        this.comboBox1.Text = PortName;
                        this.comboBox1.Items.Add(PortName);
                    }
                    Rueckmeldung = "OK";
                }
                catch
                {
                    Rueckmeldung = "Error";
                }
                return Rueckmeldung;
            }
     private void SendData(string DataInput)
            {
                SerialPort ComPort = new SerialPort(this.comboBox1.Text, 9600, Parity.None, 8, StopBits.One); 
                try
                {
                    ComPort.Open();
                    ComPort.Write(DataInput);
                    this.label1.Text = ComPort.BytesToWrite.ToString();
                    ComPort.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    Schreib mal das so um zu sehn wieviel gesendet wird. ich kann es leider nicht testen ich hab z.Z. nichts am Com Port angeschlossen.

    Code:
    AktuellerComPort.Open();                 
              AktuellerComPort.Write(textBox1.Text);  // sende inhalt der Textbox an ComPort 
              this.label1.Text = ComPort.BytesToWrite.ToString();                   
              AktuellerComPort.Close();


    Wenn du 5 zeichen sendest sollte im label 5 drin sein. ( es sei denn ich hab mich jetzt mit den buffer geirrt ). Das dass der "Globale" Sende Buffer ist.


    MFG Oliver g

    PS: ich schau noch mal weiter ob ich was finde was ich am Com anschliesen kann.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von Staind Beitrag anzeigen
    Hallo,


    Wenn ich das ganze über mein C# Programm probiere, geht die rote LED vom Programmer nicht aus. Gebe ich in der Textbox was ein und klicke den Butten "Daten Senden" leuchten zwar die beiden grünen LEDs vom Programmer kurz auf (also es wird wohl etwas übertragen), aber der uC bzw das Programm macht nichts. Also die LED am D Port leuchtet nicht.

    Ich begebe mich einfach einmal auf's Glatteis (mit C kenne ich mich nicht aus). Es kann sein das ich falsch verstanden habe! Das Programmieren klappt ja, aber versuchst Du jetzt wirklich "über dnen Programmierer" Daten zum µC zu senden???? Das dürfte kaum klapen, Pogramme werden über die ISP Schnittstelle vom µC (da hängt auch der Programmer dran) ins Flasch geschoben. Daten, Befehle u.s.w. erwartet ein Progrmm dann aber z.B. an der RS232.

    Gruß Richard

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Hallo Staind, ich habe vorhin mal eine kleine Beispielanwendung erstellt die die Verwendung des SerialPorts in C# zeigt. Die Exe und die Solutions findest du in diesem Thread hier:
    http://www.roboternetz.de/community/...133#post517133

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Ich Rätsel immer noch, man kann über einem Programmir Adapter NICHT/KEINE DatenBefehle an den µC übertragen, außer Daten welche Programmiert = (ins Flasch) "Programmspeicher" geschrieben werden sollen! Dabei wird das eigentliche Programm (zumindest teilweise) ÜBERSCHRIEBEN = Zerstört.....Ist nicht mehr lauffähig.

    Richard

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Doch das sollte damit gehen: wird zumindest beworben, dass man das Teil als USB-UART Wandler verwenden kann.
    http://shop.myavr.de/index.php?404;h...p?artDataID=36

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Das war mir nicht bekannt und leuchtet mir Schnittstellen bedingt auch nicht ein?

    Gruß Richard

Ähnliche Themen

  1. Signal über Zündung in KFZ an Atmega schicken
    Von ensacom im Forum Elektronik
    Antworten: 19
    Letzter Beitrag: 28.01.2009, 16:54
  2. Antworten: 8
    Letzter Beitrag: 22.01.2008, 15:26
  3. Daten an Master schicken mit I2CTWI_transmitBytes
    Von twebworld im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 21.10.2007, 11:20
  4. Daten Richtung Roboter schicken? mit RS232
    Von jo_robot im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 14.03.2007, 19:32
  5. String über rs232 schicken
    Von ceekay im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 25
    Letzter Beitrag: 24.02.2006, 07:08

Berechtigungen

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