Forum: PC-Programmierung Daten von C# über USB/COM3 zum Mikrocontroller schicken


von André K. (staind)


Angehängte Dateien:

Lesenswert?

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, also wird es wohl 
nicht daran liegen):
1
.include "m8def.inc"
2
 
3
.def temp = R16
4
 
5
.equ F_CPU = 3686400                             ; Systemtakt in Hz
6
.equ BAUD  = 9600                               ; Baudrate
7
 
8
; Berechnungen
9
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
10
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
11
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
12
 
13
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
14
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
15
.endif
16
 
17
    ; Stackpointer initialisieren
18
 
19
    ldi     temp, HIGH(RAMEND)
20
    out     SPH, temp
21
    ldi     temp, LOW(RAMEND)
22
    out     SPL, temp
23
 
24
    ; Port D = Ausgang
25
 
26
    ldi     temp, 0xFF
27
    out     DDRD, temp
28
 
29
    ; Baudrate einstellen
30
 
31
    ldi     temp, HIGH(UBRR_VAL)
32
    out     UBRRH, temp
33
    ldi     temp, LOW(UBRR_VAL)
34
    out     UBRRL, temp
35
 
36
    ; Frame-Format: 8 Bit
37
 
38
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
39
    out     UCSRC, temp
40
 
41
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
42
 
43
receive_loop:
44
   sbis     UCSRA, RXC                      ; warten bis ein Byte angekommen ist
45
   rjmp     receive_loop
46
   in       temp, UDR                       ; empfangenes Byte nach temp kopieren
47
   out      PORTD, temp                     ; und an Port D ausgeben.
48
   rjmp     receive_loop                    ; zurück zum Hauptprogramm

und mein C# programm
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.IO.Ports;  //Einfügen
10
11
namespace WindowsFormsApplication1
12
{
13
    public partial class Form1 : Form
14
    {
15
16
        SerialPort AktuellerComPort = new SerialPort ("COM3",9600,Parity.None, 8,StopBits.One); // ComCort erzeugen 
17
        
18
19
        public Form1()
20
        {
21
            InitializeComponent();
22
        }
23
24
        private void button1_Click(object sender, EventArgs e)
25
        {
26
            string[] schnittstellen = SerialPort.GetPortNames();   // Gibt alle aktuell verfügbaren Comports zurück
27
            foreach (string comport in schnittstellen) 
28
            {comboBox1.Items.Add(comport); }
29
             
30
31
        }
32
33
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
34
        {
35
            try
36
            {
37
                AktuellerComPort.PortName = comboBox1.Text; // dem ComPort Objekt einen Comport zuweisen
38
            }
39
            catch (Exception ex)
40
            {
41
                 MessageBox.Show(ex.Message);                
42
            }
43
44
        }
45
46
        private void button2_Click(object sender, EventArgs e)
47
        {
48
            try
49
            {  
50
                AktuellerComPort.Open();
51
                AktuellerComPort.Write(textBox1.Text);  // sende inhalt der Textbox an ComPort       
52
                AktuellerComPort.Close();
53
            }
54
            catch (Exception ex)
55
            {
56
                 MessageBox.Show(ex.Message);
57
            }
58
        }
59
60
        private void button3_Click(object sender, EventArgs e)
61
        {
62
            try
63
            {
64
               AktuellerComPort.ReadTimeout = 300;     //Wartezeit (Timeout Zeit) (in ms) auf Antwort bevor der Lesevorgang abgebrochen wird
65
                AktuellerComPort.Open();
66
                textBox2.Text = AktuellerComPort.ReadLine();   //einlesen                    
67
                AktuellerComPort.Close();
68
            }
69
            catch (Exception ex)
70
            {
71
                MessageBox.Show(ex.Message);
72
                AktuellerComPort.Close();
73
            }
74
        }
75
    }
76
}

hier noch die Form dazu

Bild im Anhang form1.JPG

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:

Bild im Anhang mysmartusb_g.png

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)

Bild im Anhang programm.JPG

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é

von Sven H. (dsb_sven)


Lesenswert?

Hier mal nen Schwung Ideen:

- Kann es mit den Steuerleitungen der Schnittstelle zusammen hängen?
- Ist es vielleicht problematisch, dass du die Schnittstelle immer 
wieder auf und wieder zu machst? Eventuell gehen dann Einstellungen 
verloren?
- Das Öffnen und Schließen der Schnittstelle wirkt sich sicherlich auch 
irgendwie auf die Steuerleitungen aus.
- Werden die Daten vielleicht nicht komplett gesendet? -> 
Terminalprogramm und 2/3 Brücke könnten dir da helfen.
- Mit dem Terminalprogramm könntest du auch die Funktionalität der µC 
Software testen.
- Fehlen vielleicht Steuerzeichen wie ein Zeilenumbruch am Befehlsende?

Noch was: In beim Senden hast du im catch-Block die Schnittstelle nicht 
geschlossen. Könnte zu Problemen führen. In solchen Fällen (also wenn 
etwas auf jeden Fall passieren soll, sowohl im try als auch im catch) 
gibt es noch den finally-Block. Such mal bei Google nach "try catch 
finally" da gibts mehr Infos.

Ich hoffe, ich konnte dir den ein oder anderen Tip geben, der dir auch 
hilft...


Sven

von Sven H. (dsb_sven)


Lesenswert?

Achso, einlesen von der Schnittstelle mache ich immer im dazugehörigen 
Event. (ich glaub der heißt "OnReceive")

von Hans G. (Gast)


Lesenswert?

hallo,

der msu2 muss erst in den Datenmodus geschlatet werden. Das geht per 
Software aber auch per DIP-Schlater... guckst du hier:

http://shop.myavr.de/index.php?ws=download_file.ws.php&dlid=48&filename=produkte/mysmartusb_mk2/techb_mysmartusb-mk2_de_en.pdf

übrigens gibts schon einen spannenden C# Thread zum mk2 von myAVR:
Beitrag "C#:Wie Nachricht vom Mikrocontroller über dem Com-Port empfangen"

Gruß

von André K. (staind)


Lesenswert?

@ Hans G.

Danke das war der Fehler! Also wenn ich den Schalter 2 auf on schalte 
funktioniert alles! Boah bin ich happy. Vielen Dank.

Weiß jemand zufällig wie ich das über der Softwarelösung realisiere?

Gruß André

von Ralf S. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo André,

ich hab mir einfach mal vom vorangegangenen Thread die Datei für SiSy 
runter geladen. (Danke für die Vorarbeit) Ich hab die dann mal etwas 
angepasst. Also die Modi schalten kann der Programmer aber das andere 
muss ich erst noch ausprobieren.
Achtung, ich hab eine Baud-Rate von 19200 (damit ist es einfacher) und 
COM 9 verwendet. Kannste dir ja bei Bedarf anpassen.

Gruß Ralf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.