Forum: PC-Programmierung C# - Mikrocontroller Brige


von Tanja V. (p3rform3r)


Lesenswert?

Hi,

Ich muss für ein Schuldprojekt einen Mikrocontroller (ATMEGA8) per 
Serieller Mini USB Schnittstelle verbinden und einfache 
Rechenoperationen wie z.B "2+2" ausrechnen lassen und auf einem Display 
ausgeben lassen.
Problem ist dabei, dass das ganze dann über einen C# Programm laufen 
soll.
Also quasi soll ich ein C# Programm schreiben, wo ich 2 + 2 eingebe, es 
soll an den Controller geschickt werden, der Mikrocontroller soll es 
berechnnnen und am Ende soll die Rechnung vom Mikrocontroller auch 
wieder zum C# Programm zurückgeschickt werden.

Mein Programmierlehrer meinte, dass sei sehr einfach und ich weiß, dass 
ich die SerialPort Class nutzen muss, allerdings stehe ich beim genauen 
Ablauf etwas auf dem Schlauch. Muss ich die Rechenoperation in Binäre 
Zahlen umwandeln und das an ein Bascom Programm schicken oder wie mache 
ich das am besten?

Danke für jede Hilfe :)

von Max H. (hartl192)


Lesenswert?

Kevin Antonow schrieb:
> Muss ich die Rechenoperation in Binäre
> Zahlen umwandeln und das an ein Bascom Programm schicken oder wie mache
> ich das am besten?
Zahlen sind im PC und µC schon binär. Ich würde sie ASCII Codieren.

Welche Rechenoperation sollen ausgeführt werden, wie lange? Sind es nur 
so Sachen wie A+B, A-B, A*B, A/B, nur A+B oder auch komplizierteres wie 
A+B*C-D.

: Bearbeitet durch User
von Tanja V. (p3rform3r)


Lesenswert?

Ganz einfache Sachen wie z.B 2+2. Nichts kompliziertes. Hauptaugenmerk 
liegt auf der Verbindung C# zum ATMEGA8. Quasi als Fernsteuerung.

von Max H. (hartl192)


Lesenswert?

Kevin Antonow schrieb:
> Ganz einfache Sachen wie z.B 2+2. Nichts kompliziertes.

Dann würde ich
1
"<Zahl1>+<Zahl2>\n"
an den µC senden, den String dort parsen und die Operation dann 
ausführen und ausgeben

: Bearbeitet durch User
von Tanja V. (p3rform3r)


Lesenswert?

Max H. schrieb:

> Dann würde ich
>
1
"<Zahl1>+<Zahl2>\n"
> an den µC senden,

Das war ja die Frage. Wie ich genau das mache. Da habe ich nicht so den 
Durchblick. Ich habe mir auf Google einiges angeschaut, aber eine 
richtige Antwort habe ich nicht gefunden und natürlich auch noch wie ich 
es an C# wieder zurücksende.

: Bearbeitet durch User
von Blinky (Gast)


Lesenswert?

Hängt mit von der Programmiersprache für den µC zusammen wie einfach das 
wird.

Auf dem µC die Serielle Schnittstelle (UART) konfigurieren und abfragen.
Wenn was kommt, warten bis die Zeile komplett empfangen wurde, dann in 
Zahl1,Operator,Zahl2 zerlegen, Anhand dem Operator berechnen und das 
Ergebnis wieder auf die serielle Schnittstelle schreiben.

Das kann man auch direkt mit einem Terminalprogramm auf dem PC testen 
bis es funktioniert.

Auf dem PC mit C# im Prinzip das selbe. Die Eingaben (Zahl1, Zahl2, 
Operator) über die serielle Schnittstelle an den µC schicken und die 
empfangenen Daten (das Ergebnis) wieder anzeigen.

von Max H. (hartl192)


Lesenswert?

Kevin Antonow schrieb:
> Das war ja die Frage. Wie ich genau das mache.
1
int zahl_1;
2
int zahl_2;
3
4
// Read user input
5
6
string tx_str = zahl_1.ToString();
7
tx_str += "+";
8
tx_str += zahl_2.ToString();
9
tx_str += "\n";
10
11
// Now send tx_str via serial

von Tanja V. (p3rform3r)


Lesenswert?

Blinky schrieb:

> Auf dem PC mit C# im Prinzip das selbe. Die Eingaben (Zahl1, Zahl2,
> Operator) über die serielle Schnittstelle an den µC schicken

Ja. Mit welchen Befehl mache ich das?

Ich kann mit der SerialPortKlasse, den Mikrocontroller über C# 
ansprechen:

private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, 
StopBits.One);

Aber wie schicke ich einen ASCII Code an den Mikrocontroller?
Sagen wir mal ich habe eine ASCII Zeichenkette, die ich in C# schon 
konventiert habe, dann muss ich ja über die Serialport Schnittstelle 
IRGENDWIE C# sagen, dass er das jetzt zum Mikrocontroller senden soll.
Ich habe also eine Variable... Und dann ja. Keine Ahnung.

> // Now send tx_str via serial

Ja, nur wie?

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Kevin A, schrieb:
> Aber wie schicke ich einen ASCII Code an den Mikrocontroller?

einfach mal die Doku lesen?

https://msdn.microsoft.com/de-de/library/system.io.ports.serialport(v=vs.110).aspx

welche Funktion könnte denn da in frage kommen?

von Blinky (Gast)


Lesenswert?

Tip:
Steht unter Funktionen bzw Methoden und beginnt mit W...
"\n" nennt man auch "Newline".

von Tanja V. (p3rform3r)


Lesenswert?

WOW. Danke. Ich habe jetzt einen Anfang. Hat mir super geholfen.
Jetzt bleibt nur noch eine Frage: Nämlich wenn ich die Strings zum uC 
geschickt habe: Wie frage ich diese in der IDE (In meinem Fall BASCOM) 
ab?
Quasi eine if Abfrage ala.

if data_recieved
z = string1
y = string 2
Rechenoperator = string3

Und vorallem wie ich in Bascom den Rechenoperator (+, - usw.) als 
Rechenoperator unwandle..

Sorry. Ich bin neu auf dem Gebiet. Ich denke sonst habe ich auch keine 
Fragen mehr.

von Albert (Gast)


Lesenswert?

Kevin A, schrieb:
> Quasi eine if Abfrage ala.
>
> if data_recieved
> z = string1
> y = string 2
> Rechenoperator = string3
>
> Und vorallem wie ich in Bascom den Rechenoperator (+, - usw.) als
> Rechenoperator unwandle..

In Bascom wandelst Du den Operator gar nicht um, sondern fragst den nur 
für die Entscheidung für die Rechenoperation ab. Zuerst wandelst Du aber 
z und y wieder in numerische Variablen (z.B. a und b) zurück:

if operator = "+" then
   ergebnis = a + b
if operator = "-" then
   ergebnis = a - b
if operator = "*" then
   ergebnis = a * b
if operator = "*" then
   ergebnis = a * b

sende ergebnis > PC

Damit hast Du gleich die Grundrechenarten erschlagen.

von Albert (Gast)


Lesenswert?

sorry, das letzte muss natürlich heissen.

if operator = "/" then
   ergebnis = a / b

Und für die Umwandlung z und y in a und b wären flotingPoint Variablen 
nützlich

von Blinky (Gast)


Lesenswert?

Mit Bascom kenn ich mich jetzt überhaupt nicht aus.
Schau mal was es bei Bascom in der Stringverabeitung gibt, was Du 
brauchst wäre "Suche ein Charakter in einem String" und "Zerlege den 
String an dieser Stelle".
Im Prinzip so was wie:

- Warte bis ein String von der seriellen Schnittstelle gekommen ist
- Suche den Operator (+,-,...)
- Kopiere den Operator in eine Variable (Operator)
- Kopiere den Teil vor dem Operator in eine Variable (Zahl 1)
- Kopiere den Teil nach dem Operator in eine Variable (Zahl 2)
- Erzeuge eine leere Variable für das Ergebnis
- Mache für jeden möglichen Operator eine "IF" Abfrage
  if(operator == "+") dann ergebnis = zahl1 + zahl2
  if(operator == "-") dann ergebnis = zahl1 - zahl2
  ...
- Schreibe die Ergebnis Variable zurück auf die serielle Schnittstelle

von Paul B. (paul_baumann)


Lesenswert?

Kevin A, schrieb:
> Ich muss für ein Schuldprojekt einen Mikrocontroller (ATMEGA8) per
> Serieller Mini USB Schnittstelle verbinden....

Da sieht man wieder: Schulden machen bringt manch Einen in 
Zwangslage...

MfG Paul

von Tanja V. (p3rform3r)


Lesenswert?

So.


Danke schon mal für die viele Hilfe. Hat mich sehr gut weitergebracht.
Allerdings gibt es noch ein Problem: Der Mikrocontroller scheint nicht 
die Variablen zu empfangen.

Mein C# Code:

 try
                    {

                        port.Open();
                        port.Handshake = Handshake.XOnXOff;
                        int zahl_1 = Convert.ToInt32(textBox1.Text);
                        int zahl_2 = Convert.ToInt32(textBox2.Text);
                        string tx_str = Convert.ToString(zahl_1);
                        string tx_str2 = Convert.ToString(zahl_2);
                        port.Write(tx_str);


                    }
                    catch (Exception exc)
                    {
                        MessageBox.Show("Fehler beim Senden der Daten. 
Mikrocontroller nicht gefunden." + Environment.NewLine + 
Environment.NewLine + exc.ToString());
                    }




Und mein Bascom Code:
Do
Dim Empfangen As String * 255
 Input Empfangen
Cls
LCD Empfangen
Loop
End

Im C# Programm gibt es keine Fehler und der Code wird abgeschickt und 
alles wird erkannt, allerdings kommt im Controller gar nichts an und ich 
weiß nicht was ich sonst noch ausprobieren soll.

Hat jemand eine Idee? Danke.

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.