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.
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?
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
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.
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.
> 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?
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
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?
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?
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?
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.
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?
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!
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.