PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten von C# über USB/COM3 zum Mikrocontroller schicken



Staind
06.07.2011, 17:21
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):



.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



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

http://img804.imageshack.us/img804/4489/form1v.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:

http://img233.imageshack.us/img233/6475/mysmartusbg.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)

http://img13.imageshack.us/img13/7053/programmw.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é

o.g.1985
06.07.2011, 17:40
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

Staind
06.07.2011, 17:47
erstmal danke für die Antwort.
habe Framework 4.0
gruß André

shedepe
06.07.2011, 18:05
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/library/system.io.ports.serialport.aspx

o.g.1985
06.07.2011, 18:17
Was mir aufgefallen ist, dass brauchst du bei deine jetzigen Code nicht!


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:


/// <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.


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.

Richard
06.07.2011, 18:17
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

shedepe
06.07.2011, 19:05
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:
https://www.roboternetz.de/community/showthread.php?53894-Beispiel-Anwendung-C-Zugriff-auf-SerialPort&p=517133#post517133

Richard
06.07.2011, 20:08
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

shedepe
06.07.2011, 20:12
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;http://myavr.de:80/shop/article.php?artDataID=36

Richard
06.07.2011, 20:48
Das war mir nicht bekannt und leuchtet mir Schnittstellen bedingt auch nicht ein?

Gruß Richard