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


von Thomas Frosch (Gast)


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.

von Floh (Gast)


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?

von ge-nka (Gast)


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

von Thomas Frosch (Gast)


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.

von patrifizius (Gast)


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.

von Floh (Gast)


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?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Baudrate/Frameeinstellungen/Parity?

von Thomas Frosch (Gast)


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

von Thomas Frosch (Gast)


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?

von Läubi .. (laeubi) Benutzerseite


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?

von Thomas Frosch (Gast)


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?

von AlexF91 (Gast)


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.

von Thomas Frosch (Gast)


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?

von Läubi .. (laeubi) Benutzerseite


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:
1
string = readSerial();
oder
1
byteArray = readSerial();
2
string = new string(byteArray)
und empfängst eine 0, dann wirst du das nicht mitkriegen, da eine 0 nie 
in einem String ausgegeben wird!

von Tobias (Gast)


Lesenswert?

Oder mit .NET in C#:
1
using System.IO.Ports;
2
[...]
3
SerialPort Schnittstelle;
4
Schnittstelle=new SerialPort();
5
Schnittstelle.PortName = "COM1";
6
Schnittstelle.BaudRate = 56000;
7
Schnittstelle.Parity = 0;
8
Schnittstelle.DataBits = 8;
9
Schnittstelle.Open();
10
int wert;
11
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.

von Rufus Τ. F. (rufus) Benutzerseite


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

von Thomas Frosch (Gast)


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!

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.