mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PC Kommunikation mit uC


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo habe folgendes Problem. Und zwar haben wir grad ein Projekt für
die Kommunikation zwischen PC und MC am laufen.
Der ganz grobe Ablauf sieht so aus: PC schickt Daten an uC mit denen er
mitteilt welcher Kanal gewandelt werden soll und in welchen
Zeitabständen und ob Einzelwandlung oder kontinuierliche Wandlung. Die
Auswahl geschieht über Radiobuttons in einem eigens Dafür geschriebenen
Programm.Der uC wandelt, speichert die Messwerte gegebenenfalls und
schickt alles zusammen wieder zum PC. Meine Frage ist wie ich es
realisieren kann mehrere Werte vom PC aus zu empfangen und mit dem uC
darauf zu reagieren. Meinetwegen, dass der uC bei "101" Poti in 50ms
Zeitabständen kontinuielich wandelt oder bei "060" Temperatur in
100ms Zeitabständen einmalig wandelt. Habe es bis jetzt nur so
hingekriegt einen Char zu verschicken und darauf zu reagieren. Das
andere wären ja Strings die man nacheinander empfangen müsste,
zwischenspeichern müsste und danach auslesen und darauf reagieren. Oder
seh ich das falsch?
Wäre über jede Hilfe dankbar
mfg Markus

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, ich würde es so machen:

$101*

Als kleines Protokoll.

MC wartet, bis er ein Dollar empfängt. Dann beginnt er die Werte in ein
kleines Array zu schreiben, bis der Stern kommt.
Hat er den Stern empfangen, kann er schauen, was im Array liegt und es
auswerten/reagieren.

Ist aber nur eine Idee, falls der PC kontinuierlich den Befehl sendet.
Ansonsten könnte man das rudimentäre Protokoll sogar weglassen.

Alex

Autor: Alexander Nießen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um Missverständnissen vorzubeugen:
Das Posting von 'Alex' stammt nicht von mir.
Gibt ja noch mehrere Leute mit dem Namen ... aber wenn jemand so etwas
unqualifiziertes schreibt und nur seinen (fiktiven ?) Vornamen schreibt
möchte ich mich davon distanzieren.

@markus:
Das siehst du richtig. Schließlich kannst du ja nur Byte für Byte
emfpangen. Du musst die Werte zwischenspeichern und danach sowas wie
einen 'Select ... case ...' (in C) machen.

Grüße,
Alex

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Vorschlag für ein einfaches Protokoll:
Der PC sendet:
SOH       // StartOfHeader  = 0x01
A         // ASCII "A....X" für irgendeinen Befehl für den MC
1          // zweite Befehlsnummer ( wenn viele verschieden Befehle
=       // Trenner für folgenden Parameter
1        // es folgen beliebige Anzahl von Werten. hier die Zahl 123.
2
3
;      // Befehlstrenner
B
1
=
;
;
usw
ETX   // EndOfText  0x03
BCC   // eventuell noch die Checksumme (1 Char) von SOH bis ETX


//
Die Auswertung im MC:
In der Empfangsroutine auf SOH warten. Wenn diese kommt, alle folgenden
Daten bis ETX bzw. BCC in einen Buffer laden.
Auswerteroutine:
Der 1.Befehl steht im Buffer immer an [1].

uchar *data = &buffer[0];

do
repeat = 0;
switch (*data++)  // sprung zu und increment pointer
{
  case "A"
    hier nocheinmal ein switch, wenn es einen 2.Befehlskennung gibt
    ansonsten:
    if (*data++ == "=" ) // trenner vorahnden?
    {
   // hier den folgenden string "123" auswerten.
   // wenn der Trenner ";" erreicht ist kannst Du über eine
   // Do..While -Schleife in dem der switch (*data++) eingebettet ist
   // einfach alle empfangenen Befehle bzw. Daten interpretieren.
   // Danach !! entweder ein SOH ACK / NAK an den PC oder angeforderte

   // Daten zurück senden.
   // Zum Daten zurücksenden, würde ich das gleich Protokoll benutzen.
      if (*data != "EOT")
       repeat = 1;    //Next
     break;
     }

  case "B"

  case // und so weiter.....
}//switch
while (repeat);

Wenn Du BCC mit übergeben hast solltest du die Cheksumme vor eintritt
in die do - switch - while Schleife prüfen. Wenn falsch ein SOH NAK an
den PS zurück...

Gruß
Rainer

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhhhps.... ein Fehler..
uchar *data = &buffer[0]

muss sein:  uchar *data = &buffer[1];

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"unqualifiziertes schreibt"

Haben dir deine Eltern zu wenig Aufmerksamkeit gewidmet oder hast du
einfach nur nen schlechten Tag?

Das von ihm beschriebene deckt sich mit dem von Rainer, nur das es
nicht so ausformuliert ist.

Gruß, Mike

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.