mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik serielle Schnittstelle emfpängt 255 statt 0


Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich habe eine Art Protokol um zwischen PC und µC per serieller 
Schnittstelle zu kommunizieren. Dies hat Jahrelang auch super 
funktioniert. Seitdem ich meinen Rechner neu installiert habe und auch 
einige Windows Updates gemacht habe, empfängt mein PC für eine 0 die vom 
µC gesendete wurde eine 255.

Ich benutze die MSCOM32.ocx.

Hab jetzt schon rumpropiert ob irgend etwas an den Einstellungen oder am 
µC nicht passt, aber ich kann den µC ausschließen. Selbst wenn ich per 
Nullmodemkabel die beiden Com Ports am PC verbinde und eine 0 sende, 
kommt eine 255 an.

Hab ich trotzdem noch irgendetwas falsch Eingestellt oder liegt es an 
den updates?

Ein anderer rechner den ich ein paar Monate vorher neu installiert habe 
zeigt gleiches Verhalten.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Frosch schrieb:
> Ein anderer rechner den ich ein paar Monate vorher neu installiert habe
> zeigt gleiches Verhalten.

Also liegts nicht wirklich am PC.

Was passiert, wenn du was anderes sendest?

Autor: ge-nka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade probiert, mit MSCOMM32.OCX (Ver. 6.01.9814)
Excel->Virtuall-pair (Com2-Com3)->Hyperterminal(Hterm.exe)
W7, 32 bit, Excel2010

0 kommt als 0x00
255 kommt als 0xFF

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze XP einmal SP2 einmal SP3.

Denke es liegt jedoch nicht am µC da ich ja per Nullmodem oder 
Crosslinkkabel zwischen beiden seriellen Schnittstellen gleichen Effekt 
bekomme. Auch wenn ich an den einen µC einen anderen hänge und per LCD 
das gesendete anzeigen lasse habe ich perfekt alle meine 0en.

Autor: patrifizius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es möglich andere Werte zu senden?

denn 0000 0000 -> 1111 1111
Könnte mir vorstellen dass er das invertiert interpretiert. Bei einem 
anderen Wert könnte man das Verhalten des Controllers überprüfen und 
evtl Rückschlüsse ziehen.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was passiert, wenn du was anderes sendest?

Test doch einfach mal andere Werte.
Vielleicht invertiert dein Programm ja nur die Bits (irgendeine 
Einstellung), oder es passt was mit der Baudrate nicht?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baudrate/Frameeinstellungen/Parity?

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baud 9600
8 Datenbits
Keine Parität
1 Stoppbit
keine Flusssteuerung

bei beiden das gleiche eingestellt.

Sende ich andere zahlen funktioniert alles einwandfrei.
0   -> 255
5   -> 5
255 -> 255

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe soeben festgestellt, dass es nicht so ist, dass statt 0 255 
empfangen wird sondern es wird für 0 nichts empfangen. Da ich 255 als 
trennzeichen für mein Protokol verwende habe ich dass zuerst vermutet. 
Nun habe ich jedoch mit der MSComm und mit einer anderen Variante auf 
die serielle zugegriffen und festgestellt, dass eben überhaupt keine 0 
empfangen werden kann.

Gibt es dazu irgendwelche Einstellungen?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Frosch schrieb:
> Gibt es dazu irgendwelche Einstellungen?

ASCII 0 wird von vielen Programmiersprachen als Stringendezeichen 
interpretiert und entsprechend dann auch nicht ausgegeben (sehr netter 
Effekt bei Debugausgabe welche aufeinmal "abgeschnitten" im Terminal 
erscheinen). Schonmal mit HTerm versucht?

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp. Hterm empfängt die 0. Dann hat Microsoft anscheinend 
etwas an der MSComm geändert. Zufor hatte das alles wunderbar 
funktioniert. Gibt es eine Möglichkeit es mit MScomm oder etwas anderem 
doch zu realisieren? Also eine DLL die ich in VB oder C++ einbinden 
kann?

Autor: AlexF91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Frosch schrieb:
> Gibt es eine Möglichkeit es mit MScomm oder etwas anderem
> doch zu realisieren? Also eine DLL die ich in VB oder C++ einbinden
> kann?

Das .NET Framework bietet hierfür doch Funktionen an, die sollten also 
auch in VB funktionieren. Das ganze müsste sich in System.IO.ports 
befinden.

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es auch etwas nicht .net? hab schon Io.dll probiert aber da hab ich 
das gleiche Problem mit der 0. Programmiere im Moment noch mit VB 5.0

Wenn ich .net verwende ist dann sichergestellt, dass meine 0 erkannt 
wird?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Frosch schrieb:
> Danke für den Tipp. Hterm empfängt die 0. Dann hat Microsoft anscheinend
> etwas an der MSComm geändert.
Also entweder es gibt einen "Raw mode" oder du interpretierst da nur 
etwas falsch!
Wenn du sowas in der Art machst:
string = readSerial();
oder
byteArray = readSerial();
string = new string(byteArray)
und empfängst eine 0, dann wirst du das nicht mitkriegen, da eine 0 nie 
in einem String ausgegeben wird!

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder mit .NET in C#:
using System.IO.Ports;
[...]
SerialPort Schnittstelle;
Schnittstelle=new SerialPort();
Schnittstelle.PortName = "COM1";
Schnittstelle.BaudRate = 56000;
Schnittstelle.Parity = 0;
Schnittstelle.DataBits = 8;
Schnittstelle.Open();
int wert;
wert = Schnittstelle.ReadChar();

ein kleiner leicht abgeänderter Ausschnitt aus einem aktuellen Projekt 
von mir. Damit wird eine Variable vom Typ "SerialPort" erzeugt, dieser 
Variable wird eine serielle Schnittstelle zugewiesen, dann wird die 
eingestellt (Datenrate, Datenbits, Paritätsbits, ...), geöffnet und ein 
einzelner Wert von der Schnittstelle gelesen. Dieser wird wirklich "roh" 
gelesen, also wirklich die 8bit Rohdaten. Stringendezeichen ('\0' bzw. 
einfach der Wert 0) wird auch als 0 erkannt, 255 als 255 usw.

Irgendwie funktioniert die Einstellung der Stoppbits nicht, ich kann 
nicht sagen Schnittstelle.StopBits = 1;, dann meldet er mir er möchte 
keinen Wert vom Typ "int" sondern vom Typ "StopBits". So ohne Zuweisung 
wird Standard 1 Stoppbit verwendet.

Bin halt noch blutiger Anfänger in C#, aber vielleicht hilft dir der 
Codeschnipsel trotzdem.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:
> Irgendwie funktioniert die Einstellung der Stoppbits nicht, ich kann
> nicht sagen Schnittstelle.StopBits = 1;, dann meldet er mir er möchte
> keinen Wert vom Typ "int" sondern vom Typ "StopBits". So ohne Zuweisung
> wird Standard 1 Stoppbit verwendet.

Dann wirst Du Dir mal den Typ von "Schnittstelle.StopBits" näher ansehen 
müssen. Das wird vermutlich ein enum bzw. das VB.Net-Äquivalent davon 
sein, der drei Werte annehmen kann, die halt für 1, 1.5 und 2 Stopbits 
stehen (wobei 1.5 Stopbits rein hardwaremäßig nur bei 5 Bit Wortlänge 
funktionieren, also ein praktisch vollkommen nutzloses Relikt aus der 
Fernschreiber-Ära sind).

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich habe von einem älteren PC die MSComm32.ocx kopiert. Diese zeigte 
ein Änderungsdatum von 2008 an.

Bei meinem frisch neuinstalliertem Rechner, habe ich alle automatischen 
Updates und die updates auf der MS Seite durchgeführt. Ich habe alle 
Updates von SP2 installiert. SP3 habe ich nicht mehr installiert, weil 
ein mein WLan Treiber damit nicht zurecht kommt.

Das angezeigte Änderungsdatum der MSComm32.ocx war von 2007.

Seeeeeehr seltsam!!

Aber! Nun bekomme ich wieder meine 0en und alles läuft perfekt!
Ach ja, man kann auch 0en in einen String schreiben, also praktisch 
chr(0). Dies funktioniert trotzdem!! Das hat vorher auch immer wunderbar 
geklappt.

Vielen dank an alle!

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.