ich bin am verzweifeln ich programmiere mit dem Visual Studio .NET 2003 und benötige die serielle schnittstelle (RS232) wichtig: nicht nur asyncroner datenverker (RX/TX) sondern auch das setzen der Pins RTS und DTR sind für meine anwendung wichtig. keine beschrenkung auf nur 4 ports (COM1...COM4) sondern mindestens 20 ports müssen unterstützt werden, besser wären noch mehr ich habe bereits mehrere codebeispiele aus dem internet ausprobiert, habe aber keine so richtig zum laufen bekommen. hat jemand eine fertige voll funktionierende bibliotek für mich oder ähnliches? wäre euch für jede art von hilfe sehr sehr dankbar!! danke christoph
- Suchmal in der (mitgelieferten) MSDN nach "Serial Communications in Win32" da steht alles drin - mit SetCommState und entsprechenden dcb.fRtsControl sowie dcb.fDtrControl können die Controllleitungen direkt gesetzt werden oder du stellts das so ein wie benötigt (beim senden von Zeichen an/aus etc..) - Die Anzahl der COM-Ports die unterstützt werden ist Betriebssystemabhängig. Das verwenden der COM-Ports ist einfach: CreateFile mit "Datei"namen "\\.\COM1" bis "\\.\COM255". Wozu wird eigentlich mehr als 2 COM-Ports benötigt, 20 sind schon echt der Hammer ??? Es gibt auch sogenannte RS232-Umschalter (per LPT) die bis zu 16 RS232 - Anschlüsse an einen COM-Port anbinden. Gruss
bei com1-9 kann man auch nur COM1 usw schreiben, da kann die pfadangabe entfallen. über den dcb kann man nur umständlich die statusleitungen setzten, besser ist dafür EscapeCommFunction und GetCommModemStatus
wir haben in der firma nen nport von moxa, der hat alleine schon 16 comports, die über ethernet erreichbar sind und unter windows als virtuelle comports erscheinen ich mach mich mal an die msdn, guck mal ob ich das hinbekomme. wäre super, falls jemand da schon was fertig hat, dann bitte her damit, mir rennt die zeit davon danke christoph
...wobei das Handshake (RTS/DTR) nichts mit synchron zu tun hat! Andreas
Christoph, ich habe eine Weile mit dem Pendant der MOXAs gearbeitet: http://home.arcor.de/devicemaster/ Der vertrat auch 16 Ports. Die waren aber frei im Namen konfigurierbar. Wie macht das der MOXA-Treiber? Bei den Programmen, die Comtrol Corporation rausgibt, ist eine Beisiel-Appl. die alle Leitungen einzeln setzt. Ausserdem kann ich Dir www.iftools.com empfehlen. Die dortige CTB-Lib ermöglcht auch einen einfachen Zufriff auf die Ports. Falls Du dieses wx-System nicht nuzzen kannst, könntest Du aber die Portierung und die Beispielapllikation selber durchsehen, um zu erfahren, wie genau man mit Ports operiert.
danke leute, hab die perfekte componente gefunden. ist c# quelltext und baut complet auf der Winapi auf. einfach super wer den quelltext haben will, bitte melde, schick euch den dann per mail danke christoph
Bitte lass uns nicht dumm sterben und sag uns wie/woher dieser C# quelltext ist... Gruss
CommBase.cs und myRS232 in projekt einbinden und los gehts. myRS232 hab ich geschrieben und setzt der CommBase nur nen schönen hut auf g was das teil kann: - RX/TX - RTS/DTR setzen und sogar der TX-pin kann auf 1 oder 0 mit break gesetzt werden. in der myRS232 heißt das property glaub ich O_Break oder so. - baudrate und comport kann eingestellt werden! alle anderen schnittstellenparameter wie stopbits,parity etc. natürlich auch, sind nur noch keine propertys mit get/set in der myRS232 implementiert. könnt ihr ja machen und dann wieder hier reinposten. für mein projekt brauche ich momentan nicht mehr einstellungen, daher erweiter ich die komponente wenn ich mal wieder mehr zeit habe. fänd es super, wenn ihr den thread hier mit euren erfahrungen aktuell haltet. scheibt einfach wenn ich das ding erweitert habt oder es benutzt habt und euch fehler aufgefallen sind. gruß christoph
Hallo Christoph Vielen Dank, dass du uns deine sehr umfangreiche RS232-Libray zur Verfügung stellst! Einen Verbesserungsvorschlag hätte ich allerdings noch. Schön wäre, wenn die Library in eine Komponente verpackt wäre und die Empfangsroutine als Ereignis z.B. onReceive(string s) und / oder onReceiveBinard(buffer buf) für die Binärübertragung als Schnittstelle zur Verfügung stellt. Wie gesagt, nur ein Vorschlag, jedenfalls eine tolle Arbeit Beste Grüsse Gerhard
ich habe vor das teil noch umfangreicher und sauberer zu gestalten, wie ich das in eine komponente packen, weiß ich noch nicht, aber das finde ich schon heraus. momentan wenig zeit, deswegen dauert es noch ein wenig. danke an alle für die vorschläge und anregungen, auch an die, die mir diese per mail zukommen lassen haben. vieleicht wird ja auch ein kleines open source projekt draus. gruß christoph
Hallo Christoph Ich kann dir hier dann vielleicht ein paar Tipps geben, wie man zu einer Komponente kommt. Beste Grüsse Gerhard
Hi ich weiss leider nicht wie deine Erfahrungen mit der MSComm32.ocx aussehen und ob es da eine Einschränkung in Bezug auf sychron/asynchron b.z.w. die Anzahl der ComPorts gab. Bei mir hat es jedenfalls immer bestens funktioniert. Momentan steuer ich damit einen AT90S2313 von einem Tool erstellt in VS2004 C++.net. Die Schaltung selbst ist ein 230V Dimmer und per RS232 schicke ich den Startzeitpunkt der Zündung in den Atmel. Die Datei abspeichern und unter Extras->Toolboxelemente hinzufügen/entfernen -> Reiter ComSteuerelemente -> Button Durchsuchen ... dann wenn gefunden doppelklicki. Es erscheint dann in der Toolbox unter Komponenten als Telefonhörer-Icon(zumindest bei mir) Ich werde mal versuchen dein Programmbeispiel in ein Benutzersteuerelement zu stopfen. Wäre dann wohl das einfachste...per Drag and Drop auf die Form ziehen und alles in Property's ansprechen. Gruss die Oma
Hallo everybody ! Christoph, danke für Deine Programme. Sie sind super. Leider habe ich mit "ComBaseTerminal" das gleiche Problem wie mit "Telix", oder "Hyper Terminal". Ich verbinde meinen iPaq H5500 via Bluetooth über eine Com Schnittstelle mit meinen Laptop. Mit dem Programm "Com Test" für den iPaq kann ich Daten vom Pocket PC auf meinen Laptop schicken. Diese erscheinen dann im Textfenster z.B. Deines Programmes "ComBaseTerminal". Wenn ich aber was senden will (vom Laptop auf den Pocket PC), gibt's regelmässig einen gnadenlosen Systemabsturz. Blauer Bildschirm mit einer Fehlermeldung, die nur etwa 1 Sekunde lang zu sehen ist. Dann Neustart. Das kann und will ich nicht gut finden. Woran kann das nur liegen ? Wie gesagt, das gleiche Problem habe ich auch mit anderen Programmen. Einzig und allein das famose Programm "Advanced Serial Port Monitor 3.0" ist in der Lage, Daten auf meinen PPC über Bluetooth zu senden, ohne dabei einen Absturz zu verursachen. Ich bin dankbar für jede Hilfe beim Finden der Ursache des Problems. Tilman.
nur so als info, ich hab den ComBaseTerminal nicht selbst geschrieben, hab die quelltexte irgendwo im netz gefunden und fald sie ziemlich blöd an anderer stelle einzubinden. deswegen hab ich die CommBase.cs der myRS232.cs vererbt und das ding somit einfacher nutzbar gemachen. @Tilman keine ahnung was bei dir los ist, aber blue screen hört sich sehr nach Win98 an, was für ein Betriebssystem nutz du? schon mal daran gedacht, dass es auch was mit den bluetooth treibern zu tun haben kann? vielleicht ist bei denen was krum. freut mich übrigens sehr, dass die myRS232 bei so vielen anklang findet, danke für die mittarbeit. gruß christoph
Ach so...Du meinst also, da könnte ein Zusammenhang bestehen zwischen dem BLAUEN Bildschirm und BLUE Tooth ? Da bin ich ja noch gar nicht drauf gekommen ! Vielleicht sollte ich ja mal WiFI ausprobieren und gucken, welche Farbe der Bildschirm dann annimmt. ...nix für ungut, aber zu so später Stunde muss man einfach auch mal ein Spässle machen können. Jedenfalls habe ich WIN XP als OS. Ich hab inzwischen ein weiteres Programm gefunden, das HERVORRAGEND funktioniert. "ByteWedge" von Fogsoft. Da das also funktioniert, kann das Problem definitiv kein genereller Fehler der BlueTooth Hard- oder Software sein. Es muss ein Fehler in der Verbindungssoftware sein. Ich freu mich schon auf die Fehlersuche. Der Absturz geschieht wie gesagt NUR beim Senden von PC auf iPaq.
Hallo, sehr gute Arbeit! Mit soetwas kann man was anfangen. Ich bräuchte nur eine kurze Erklärung: Welche Funktion hat der Timer? Gruß Willi
Hallo, das myRS232_cs_net2003.zip ist schon so ziemlich genau das, was ich brauche. Allerdings habe ich keinerlei Java-Kenntnisse. Ich muss ein Programm zur Ansteuerung einer RS232 schreiben, die mit einem FPGA kommunizieren soll. Wie kann ich das Programm am besten an Visual Studio.NET anpassen? Gruß Nighfall
Die Klasse ist für das .Net in der Sprache C# geschrieben. Dafür brauchst du keine Java sondern C#-Kenntnisse.
Äh ich meinte die .csproj Dateien. Die bekomm ich mit .NET nicht auf.
Wo genau ist dein Problem? musst schon etwas näher beschreiben was du tun willst. wenn du die RS232 in einem C#-Projekt verwenden willst, brauchst du nur .cs Dateien in deinem Projekt einbinden. Combase.cs und myRS232.cs das ist alles bekommst irgendwas nicht mit deinem .NET geöffnet. welche version von .NET hast du und bist du sicher dass du auch C# installiert hast und nicht nur Visual Basic oder so? gruß Christoph
Also folgendermaßen: Ich möchte einzelne Zeichen über Serielle Schnittstelle (die RS232) senden und empfangen. Dazu benötige ich die Einstellungen für Baudrate,Paritätsbit, ect. Ich benötige das ganze für C mit parameterübergabe und so. (Sorry, wenn ich mich etwas unprofesionell ausdrücke, doch meine C-Kenntnisse sind etwas eingerostet. Ist ein Weilchen her, dass ich zuletzt was programmiert habe). Nun habe ich hier dein ComBaseTerminal gefunden, das alle Anforderungen vordergründig erfüllt. Nach geringfügigen Anpassungen hätte ich meines Erachtens das, was ich brauche. Wenn ich jetzt aber die Projektmappe ComBaseTerminal.sln mit Microsoft Visual C++ .NET öffnen möchte, kommt eine Fehlermeldung die mich darauf hinweist, dass "die Anwendung für Projekt ComBaseTerminal.csproj" nicht installiert ist. Und "stellen Sie sicher, dass die Anwendung für den Projekttyp (.csproj)installiert ist".
Also, hab nochmal mit meinem Systemadmin geredet. Das Problem ist, das wir nur die Visual Studio.Net C - Version haben. C-Sharp (C#) funktioniert da leider nicht. Mein Fehler. Lässt sich die Klasse in C++ Code umwandeln? Ich habe leider keinerlei Kenntnisse, von den Unterschieden zwischen C# und C++. Oder bekomme ich vielleicht irgendwo einen günstigen C# Compiler? Hoffe ihr könnt mir helfen.
wenn du willst kann ich dir ne dll erzeugen, die bindest du unter verweise ein und fertig. sollte funktionieren. versuche das mal im laufe des tages hier rein zu stellen. gruß christoph
>>Oder bekomme ich vielleicht irgendwo
einen günstigen C# Compiler?
Borland C# Builder -> afaik freeware
hier hab dir die quelltexte unter C# zu einer classlibrary compiliert. jetzt kannst du die in der zip befindlichen dll einfach in dein projekt unter verweise einfügen und darauf zugreifen. viel erfolg christoph
Marco, schau mal in das Verzeichnis c:\windows\mircosoft.net\framwork\<version>\ dort solltest Du den c# compiler csc.exe finden. Olaf
Hallo Leute, ich brauche eure Hilfe und zwar habe ich mir die Datei von Cristoph runtergeladen und für meine RS232 Anwendung verwendet aber ich habe folgendes problem. Die Daten die über die Schnittstelle empfangen werden sind permanent gesendete Daten. Leider empfange ich diese aber nicht permanent. In der Funktion Open wird zwar ein Thread gestartet um diese Daten zu bearbeiten aber irgendwie klappt es nicht so ganz. Habt Ihr eine Idee ? Gruß Kürsat
hi ein gerät sendet also ununterbrochen daten und du versuchst sie zu empfangen, aber du empfängst nicht alles? du kannst mit myRS232 nur maximal 4069 bytes empfangen, das ist die größe des empfangsbuffers. vielleicht erhöhst du die größe des buffers einfach. was mciht stutzig macht ist, bei einem buffer overflow wird eine Error Exception ausgelöst, sodass es dir aufgefallen wäre. ich kann nur von mir behaupten, dass myRS232 bei mir einwandtfrei funktioniert. schau mal ob das nicht auch ein hardwarefehler sein kann oder teste den empfang mal mit dem HyperTerminal von windows oder so. dann weißt du ob es wirklich an der software liegt oder vielleicht doch nicht. eine frage noch. mit wieviel baud sendest du?
Hi, kannst du nicht dafür sorgen dass der Sender Daten nur bei Änderung sendet? In diesem Zustand musst du ständig auslesen, wenn dein PC da nicht hinterherkommt gehen dir viele Daten verloren! Was sind das für Daten und welches Gerät sendet diese ? Gruss die Oma
Hallo Also ich sende 19200 Baud. Das Gerät das die Daten senden Funktioniert einwand frei. Ich hatte die Anwendeung bereits Programmiert aber in C++. Da läuft es perfekt und ich verliere keine Botschaften vom Sender. Aber ich muss die Anwendung in C# einbinden können weil für eine Spätere Anwendung eine GUI gebastelt werden soll und die GUI wird mit C# realisiert. Wenn es ein Bufferoverflow entsteht weiß es der Sender und sendet dann ein Bufferoverflow- Frame. Weil der Sender diese Botschaften wiederum von einem anderen Gerät empfängt. Also die Sache sieht so aus. Ich habe ein Gerät das CAN Daten von einem Spammer empfängt. Die empfangenen Daten sollen über die RS 232 Schnittstelle an den PC gesendet werden. Da habe ich dein Quellcode versucht einzubauen aber mein PC empfängt die Botschaftten 1. verzögert 2. unterbricht es den Empfang nach dem 2 Datenframe Kann ich mit deinem Code (Christian) vom COM Port Daten emfangen ? Wenn ja wie ? Würde mich freuen wenn ihr mir da Helfen könntet. Gruß Kürsat
> Sorry die Frage war kann ich permanent Daten empfangen ?
ich denke mal daten mit deinem pc und der myRS232 willst du permanent
daten empfangen?!
dann ist die antwort ja, du kannst indem du in einer schleife z.B.
einem Timer immer den Buffer ausließt. das geht mir Readstr oder
Readbytes
1 | #region Using directives
|
2 | |
3 | using System; |
4 | using System.Collections.Generic; |
5 | using System.ComponentModel; |
6 | using System.Data; |
7 | using System.Drawing; |
8 | using System.Windows.Forms; |
9 | |
10 | #endregion
|
11 | |
12 | namespace _04serielle_schnitstelle |
13 | {
|
14 | partial class Form1 : Form |
15 | {
|
16 | |
17 | public Form1() |
18 | {
|
19 | InitializeComponent(); |
20 | |
21 | }
|
22 | |
23 | private void serialPort1_ReceivedEvent(object sender, |
24 | System.IO.Ports.SerialReceivedEventArgs e) |
25 | {
|
26 | try
|
27 | {
|
28 | |
29 | empfangen = serialPort1.ReadExisting(); |
30 | empfang = true; |
31 | |
32 | }
|
33 | catch
|
34 | {
|
35 | textBox1.Text = ("fehler"); |
36 | }
|
37 | |
38 | }
|
39 | |
40 | private void button1_Click(object sender, EventArgs e) |
41 | {
|
42 | if (serialPort1.IsOpen) |
43 | MessageBox.Show("Fehler serialport bereits |
44 | verwendet"); |
45 | |
46 | else
|
47 | {
|
48 | this.serialPort1.Open(); |
49 | button1.Enabled = false; |
50 | button2.Enabled = true; |
51 | button3.Enabled = true; |
52 | button4.Enabled = true; |
53 | button5.Enabled = false; |
54 | textBox2.Enabled = true; |
55 | label1.Text = ("Status: port open"); |
56 | |
57 | |
58 | }
|
59 | }
|
60 | |
61 | private void button2_Click(object sender, EventArgs e) |
62 | {
|
63 | if (serialPort1.IsOpen) |
64 | {
|
65 | this.serialPort1.Close(); |
66 | button1.Enabled = true; |
67 | button2.Enabled = false; |
68 | button3.Enabled = false; |
69 | button4.Enabled = false; |
70 | button5.Enabled = true; |
71 | textBox2.Enabled = false; |
72 | label1.Text = ("Status: port closed"); |
73 | }
|
74 | }
|
75 | |
76 | private void button3_Click(object sender, EventArgs e) |
77 | {
|
78 | string senddata; |
79 | senddata = textBox2.Text; |
80 | this.serialPort1.Write(senddata); |
81 | textBox2.Text = (""); |
82 | label5.Text = ("Gesendet:" + senddata); |
83 | }
|
84 | |
85 | private void button4_Click(object sender, EventArgs e) |
86 | {
|
87 | textBox1.Text = (""); |
88 | }
|
89 | |
90 | private void timer1_Elapsed(object sender, |
91 | System.Timers.ElapsedEventArgs e) |
92 | {
|
93 | if (empfang == true) |
94 | {
|
95 | textBox1.Text = (textBox1.Text + empfangen); |
96 | empfang = false; |
97 | }
|
98 | |
99 | if
|
100 | (abfragen == true) |
101 | {
|
102 | label7.Text = (label7.Text + " " + |
103 | serialPort1.PortName); |
104 | label8.Text = (label8.Text + " " + |
105 | serialPort1.BaudRate); |
106 | label9.Text = (label9.Text + " " + |
107 | serialPort1.DataBits); |
108 | label10.Text = (label10.Text + " " + |
109 | serialPort1.StopBits); |
110 | abfragen = false; |
111 | }
|
112 | |
113 | }
|
114 | }
|
115 | }
|
hab mal einen code geschrieben for dot net framework 2.0 wo die serielle unterstützt wird hat ziemlich elegant ausgesehen und auch gut funktioniert
man könte auch ein panel oder etwaws machen und des für invalidate erklären fals daten angekommen sind und das neue zeichen dann in einen ausgabestring schreiben ist nur zur erleuterung der grunzäzlichen einfachheit bei.net2.0 müste mit der aktuellen betta eigentlich ähnlich funktionieren
@ Christoff Vielen Dank vür den Code, war genau das wonach ich gesucht habe. Mann findet leider nicht sehr viele Beispiele zur rs232 für Visual Studio im Netz. @Kürast Hallo Kürast, wie hast du das Problem gelöst? Ich habe es in eine Endlosschleife reingepackt in der die read() Funktion aufgerufen wird und wenn Daten da sind, werden sie auf der Console ausgegeben. Es funktioniert auch, nur geht dabei die CPU-Last auf 50% (P4 3,2) Ich denke für für den Echtbetrieb ist es dann zu viel. Kannst du deine Lösung hier reinstellen? Gruß Eddy
@eddy gegen die cpu-last (zumindest unter c++) hilft ein Sleep ;) aber bitte über 10ms ;)... 100 sollten eigetnlich wunderbar funktionieren..hängt aber vom buffer,... ab. aja und in irgendeinem anderen rs232-thread hab ich in den letzten 2-3 tagen mal etwas aus der msdn gepostet... da gings um das ansprechen von ports über com9 ;) da musst nämlich irgendwas anders machen... 73
Hallo Eddy, ich musste das Projekt modifizieren da ich meinen kompletten Quellcode freigeben darf. Aber du kannst mit dem gegebenen Projekt RS232 Schnittstelle permanent abhören. Du kannst es so modifizieren wie du es möchtest. Mit freundlichem Gruß Kürsat nicht Kürast :-)
Hallo zusammen Wer sich noch kein Visual Studio gekauft hat, dem kann ich die C# Express Edition nur wärmstens ans Herz legen. Ist im Moment noch kostenlos und darin ist eine tolle Klasse für den RS232 Port enthalten (.NET Framework 2.0), welche bestens funktioniert. Grüsse Johann
Wo bekommt man eigentlich die C# Express Edition her wenn man kein DSL hat? Als Beilage hab ich's noch nicht entdeckt. Chris
Eventuell kannst Du bei Microsoft eine CD bestellen, aber ich bin mir nicht sicher. Jedenfalls wird es ab mitte November die definitifen Versionen im Kaufhaus geben und auch sehr günstige Versionen, welche den Express Editions entsprechen. Grüsse Johann
Hallo Alle Ich habe das Problem, dass bei mir der COM-Port als Belegt ausgewiesen wird (keine Ahnung warum, keine Anwendung greift darauf zu).Wenn ich die angeschlossene Komponente (eine Waage) abschliesse und wieder anschliesse funkt meine Anwendung wieder. Mit dem Code von Christoph kann ich nur aus der Anwendung geöffnete COM-Ports schliessen. Hat einer von Euch eine Idee wie ich die COM-Ports einem "Reset" unterziehen kann? Grüße Christian
Mit dem ProcessExplorer kannst Du herausfinden, welches Programm Dateien und auch Schnittstellen blockiert. Dazu die Funktion "search handle" aufrufen und wahlweise "COMn" oder "Serialm" angeben (n durch Schnittstellennummer, m durch Schnittstellennummer - 1 ersetzen). Ein so gefundenes Handle kann, wenn man den zugehörigen Prozess betrachtet, auch hinterrücks geschlossen werden. Den ProcessExplorer gibts für lau bei www.sysinternals.com
Hi, habe die myRS232 & CommBase Klassen in ein Projekt eingebunden. Soweit funktioniert alles problemlos. Nur: Öffne ich z.B. für Tests den COM Port mit einem anderen Tools (z.B. WinNav und vorher ein VB 6 Tool) und schicke damit Daten - o.k. Öffne ich dann mein Tool und schicke Daten - o.k. Öffne ich z.B VB 6 Tool schicke Daten - ComEventBreak Es scheint als ob der ComPort unter Windows evtl. mit anderen Settings geschlossen wurde oder abgestürzt ist?!?!? Hat jemand eine Ahnung - bin seit ca. 4 Tagen schon dran, jedoch noch kein Erfolg in Aussicht. MfG Joe
Ich will nun auch den Code nutzen, bin aber leider blutiger Anfänger. Ich hab mir die DLL runtergeladen und kann das Projekt offensichtlich nicht öffnen, da ich eine zu alte Version von VB.NET habe. Ach ja, ich will das in VB.NET programmieren. Verstehe ich das richtig, dass ich die Library trotzdem benutzen kann, da sie schon kompelliert ist, oder geht das nur, wenn ich C benutze und eine neuere Version hab. Ich habe die Version von 2002 (VB Version 7) Kann mir jemand da weiterhelfen? Gruß Tabi
Ich habe so meine liebe mühe mit dem CommBase.cs ich schicke 15 Bytes über Funk auf meine Rs232 Schnittstelle. Von zeit zu zeit jedoch kommen anscheinend nur 12 oder 13 Byte an... Wer kann mir helfen?
Habe das Problem, dass meine Applikation (Windows-App in C#) mehrere COMM-Schnittstellen zur gleichen Zeit unterstützen muss (Senden und Empfangen von SMS über mehrere Module). Hierbei kommt es nach einigen Tagen vor, dass das Handle einer geöffneten COM-Schnittstelle verloren gehen kann. Wie kann ich herausfinden (Codetechnisch) welcher COM-Port welche Handle besitzt??? (such Handle von COM-Schnittstelle "2" z.B) Muchas gracias!!!!!
Hi Leute, ich verwende für C# als Entwicklungsumgebung das SharpDevelop 2.0 (ist noch Beta genauso wie das .NEt-Framework 2.0 Beta2). Das .NET-Framework 2.0 bringt von Haus aus eine Bibliothek für die serielle Schnittstelle mit (System.IO.Ports). Vielleicht hilft euch das weiter. Gruß, Slowflyer
Hi Leute, kann man das .Net-Framework 2.0 auch mit Visual Studio .Net 2003 (Professional) benutzen ? Gruß, Mike
Das weiss ich nicht, da ich kein VS habe. Ich wüsste jedoch nicht was dagegen sprechen würde.
Hallo, da ich leider noch keine Ahnung habe von RS232 programmierung, wollte ich fragen, ob es eine Grundlegende Doku gibt, die das ganze einem in C# halbwegs verständlich beschreibt. Gruß Mark K.
Hi! Ich kenne keine Solche Doku. Was mir ganz gut geholfen hat, war ein funktionierendes Programm, aus dem ich mir das nötige raus gesucht habe. Allerdings ist das in VB.net programmiert. Aber vielleicht hilft dir das ein wenig weiter... http://www.codeworks.it/net/VBNetRs232.htm Hilfreich kann auch Wissen über die Arbeitsweise von RS232 sein. http://www.beyondlogic.org/ Gruß Tabi
hi Johann Gysin du hast ja anscheint schon was mit der Net2.0 und C# gemacht. Senden geht bei mir schon , ist ja auch kein großes Problem. Nur mir dem Empfangen habe ich so meine Probleme. Es gibt ja eine Funktion Datareceive die aufgerufen wird wenn Daten ankommen. Ich wollte jetzt Testweise diese Daten in ein Textbox schreiben, bekomme aber ne Fehlermeldung das die Textbox in einen anderen Thread erstellt wurde. Wie kann ich das umgehen. Gruß Eltman
hab ich auch schon gemerkt und zwar kann man in der ereignisrotiene vom serial port recive event nich direkt in eine text box oder ähnliches schreiben aber in geine globale variable und dan irgend etwas für invalidate erklären
Hola, Hab grad auch mit der System.IO.Ports.SerialPort Klasse zu tun und bin kurz vor der Weisglut ;) Aber erstmal zu Eltmans Porblem. Was Slaud angesprochen hat funktioniert auch, aber du kannsts acuh einfacher ham. Im Eventhandler ne Methode aufrufen die Dir dann den Text in z.B. ner Textbox setzt. Funzt einwandfrei. Nu zu meinem Problem ;) (Visual Studio 2005, C# .Net 2.0) Ich versuche mit SerialPort.ReadExisting() den kompletten Rückgabestring auszulesen. Leider wird mir dieser immer wieder zerhackstückelt und teilweise auch in vertauschter character reihenfolge... Ich geh hier bald am Krückstock da mir echt keine Lösung mehr einfällt. Wenn alles zerhackstückelt, aber in der richtigen reihenfolge kommt... was solls... aber dann auch noch vertauscht... bin ja nicht moses :( Falls jemand ne Idee zu hat, wäre ich um die Lösung extremst dankbar :) Grüße aus Mannheim, Gøran
Achso, hier noch n kleiner Codeschnipselt für Eltmans... private void SerPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { SetReply(); } catch (Exception ex) { System.Console.WriteLine(ex.ToString()); } } private void SetReply() { // Vorsicht vor enventuell nicht abbildbaren characters wie STX, etc. textbox1.text = SerPort.ReadExisting(); }
Danke für den kleiner Codeschnipselt. Mit dem Problem zerhackstückelter String, da gibt es bei der Seriellen Schnittstelle und VS2005 die Einstellung ReceivedBytesThreshold das steht meist auf 1, sobald ein Bytes empfangen wurde wird er Event ausgelöst. Eltman
Mein kommunikation mit dem Controller funktioniert jetzt eigentlich richtig gut. Hab aber auch Enfangs und End Zeichen eingeführt. Eltman
Hola, hab mein Problem eben auch gelöst. Ich verwende einfach die Methode ReadTo(xxx); und verwende xxx = Delimiter ( in meinem Falls \r). Siehe da, die sache funzt ;) Jetzt bekomm ich immer einen Antwortstring der genau bis zum Delimiter reicht. Mehr wollte ich nicht. Jetzt kann ich endlich die Read-Properties für meinen Laser sicher setzen... Ok, noch ein Trick hat das ganze benötigt, aber der tut hier nix zur Sache denk ich ;) War Anwendungsspezifisch. Dann sind ja nu alle happy, oder? :) :) :) Greetings
hi, das mit den zerstückelten infos habe ich anders gelöst. bei meinem projekt muss ich ein lesegerät einlesen. ReceivedBytesThreshold hat mir nicht geholfen, weil die informationen immer eine unterschiedliche länge haben und dadurch dann eintweder kein event ausgelöst wurde bzw. auch zu früh. habe dann einfach den ReceivedBytesThreshold auf 1 gelassen und in der funktion, welche einliest, am anfang einen thread.sleep eingebaut von 0,5 sekunden. diese zeit bemerkt man bei der ausführung nicht und die daten werden in der zeit komplett in den puffer geladen aus dem dann ausgelesen wird. ergebnis war, das jedesmal eingelesen wurde und alle daten auf einmal ankamen. ob es in deinem fall auch eine lösung ist, musst du wissen... kommt halt drauf an, was du auslesen willst.
@Wolfram Was wären die Vorteile eines Timeouts gegenüber einer Timer? Ich möchte einen kontinuirlichen Datenstrom aus einem virtuellen Seriellenport lesen und habe mir das ganze genauso vorgestellt - z.B alle 300-400 ms die daten aus dem Puffer auszulesen. Könnte ich das mit Timeouts machen und wenn ja wie? Wenn du irgendwelche Informationsquellen hast, dann her damit! Danke!
Die Frage ist was du machen willst, also Master Slave Kommunikation oder kontinuierliches einlesen eines Streams den das Meßgerät selbstständig sendet. Im 1. Fall würde ich mit Timeout arbeiten (Master sendet und der Slave muss in einer bestimmten Zeit geantwortet haben.Wenn nicht gibt es einen Timeout Fehler und du musst entscheiden wie du damit umgehst. Im 2. Fall würde ich einen Thread verwenden der ständig die Schnittstelle pollt. Sind dort ein oder mehrere Bytes vorhanden werden diese gelesen. Der Thread muss in der Lage sein den Anfang des Paketes zu finden, wenn er den Datenstrom aus irgendeinem Grund verliert muss er eben erneut den Anfang finden. Das Paket muss er dekodieren und die Informationen weitermelden z.B. per event. Wenn gerade nichts von der Schnittstelle kommt sollte er sich für eine bestimmte Zeit schlafen legen. Ob er mit Timeout arbeitet ist letzten Endes deine Entscheidung je nachdem was einfacher ist. 1. Möglichkeit kein Timeout ReceivedBytesThreshold auf 1 Das heisst jedes Byte wird einzeln abgeholt ,was den Rechner belastet 2. Möglichkeit ReceivedBytesThreshold > 1 (=x) Wenn es ein kontinuierlicher Datenstrom ist kein Problem ansonsten wird er eben x Bytes warten bis du informiert wirst und wenn er am Ende des Paketes ist wird es möglicherweise bis zum Eintreffen des nächsten Dauern, das musst du einschätzen ob es akzeptabel ist. 3. Möglichkeit mit Timeout Die Nachteile der 2. Möglichkeit werden aufgehoben ,man muss halt nur mit diesem Fehler umgehen
Danke für deine Antwort! Ich habe es jetzt gut verstanden was du mit dem Timeout meinst. Ich denke für den Anfang wäre für mich die 2. Möglichkeit am einfachsten zu realisieren. Wobei ich eigentlich asynchron arbeiten werde und keinen Thread benutzen werde. Den Puffer werde ich entsprechend vergrössern. Der Datenstrom ist wirklich kontiuirlich - obwohl der Serielle Port mit 115kbaud eingestellt ist, werde ich eigenlich viel mehr information bekommen. Ich lese einen Bluetooth und die können bis zu 70kbyte/s schaffen. Das ist auch einbisschen verwirrend für mich der Port ist nur mit 115 kbaud geoffnet und man kann mit ca 60-70 KB/s Datenstrom rechnen. Diese Resultate habe ich mit dem Terminal Programm von Tobias geschafft. Na ja ich werde es ausprobieren und nach einigen Tagen wieder berichten.
Wenn du asyncron arbeiten willst, erhöhe den Schnittstellen Puffer und rechne von vornherein damit, dass du Zeichen verlierst. Ich weiss nicht was du gemessen hast 115kbaud sind 115 Kilobit/s das sind je nach Stopbitanzahl, Datenbitanzahl ca. 11..12 Kbyte/s.
@Wolfram Wenn ich z.B 2 Rechner per Bluetooth über dem SPP(serial port profil) verbinde, dann wird eine viruelle Serielleschnittstelle vom Bluetooth Trieber angelegt. Wenn ich z.B. mit HTerm eine 3 MB grosse Datei über diese virtuelle Serielleschnitstelle(z.B COM10)schicke, wobei die Schnittstelle mit 115 kbaud geöffnet ist dann zeigt das HTerm ca. 60 kbyte/s. Und das entspricht auch ungefähr die Geschwindigkeit vom Bluetooth. Ich hoffe jetzt ist einbisschen klarer geworden.
>Wenn du asyncron arbeiten willst, erhöhe den Schnittstellen Puffer und >rechne von vornherein damit, dass du Zeichen verlierst. >Ich weiss nicht was du gemessen hast Da ich aber keine Daten verlieren will werde ich wie du mir vorgeschlagen hast mit einen Thread arbeiten. Ich habe schon 2 Threads im Programm und wollte eigentlich noch einen vermeiden. Aber Empfängen von allen Daten ist wichtiger.
ich habe deine Aussage bezüglich geschwindigkeit mal in den HTERM Thread gepostet...
@pencho: Ich jabe das gerade noch einmal ausprobiert und bei mir zeigt das Programm bei SendFile mit 115200baud dauerhaft 11.25k an ('echte' Serielle sowie virtuelle an USB). Dei Frage wäre, ob der virtuelle Port die Daten vllt zwischenpuffert und dadurch schneller annimmt als rausschickt. Sollte sich feststellen lassen, wenn auch noch länger nach Beendigung des Sendens Daten eintrudeln. Oder der Treiber ist buggy und hält sich nicht an die Geschwindigkeit, die eingestellt wurde. Müsste man mal auf der Empfangsseite messen, wie schnell die Daten ankommen. Hat sonst noch jemand einen Seriell-Bluetooth-Wandler zur Verfügung und kann das ganze testen?
Hallo Tobi, um das ganze zu testen brauchst du keinen Seriell-Bluetooth-Wandler, sondern nur 2 PCs mit Bluetoothdongels. Beim Bluetooth gibt es s.g. Profile, damit verschiedene Verbindungstypen untersützt werden können wie Headset, PAN, SPP u.s.w.SPP(Serial Port Profil) ist als ersatz für eine Serielle Verbindung per Kabel von 2 PCs gedacht. Wenn man die Bluetoothgeräte per SPP verbindet, dann stellt der entsprechende Bluetoothtreiber einen virutellen Seriellen Port, den man ganznormal öffnen kann. Ich habe an den beiden PCs HTerm gestartet und die entsprechenden Ports geöffnet - mit 115kbaud. Und wenn ich die 3MB grosse Datei geschickt habe war ich von den Geschwindigkeit überascht - die Datai wurde wirklich so schnell gesendet und ich denke dein Programm hat die richtige Geschwindigkeit angezeigt. So die 60-70 kbyte/s ist auch die Geschwindigkeit vom Bluetoot. Deswegen denke ich nicht das nicht dein Programm einen Bug hat(hätte auch im anderen Thread gepostet) sondern es ist irgendwas mit dem Bluetoothtreiber. Ist für mich nur interesant warum das so ist, und ob noch jemand das bestätigen kann.
Hallo, ich bin es wieder. Hier habe ich ein Screenshot von der ganze Geschichte. Es ist ganz klar zu sehen, dass der COMPort mit 115kbaud geoeffnet ist und die uebertragung mit ca 50 kbyte/s stattfindet. Koennte mir jemand das erklaeren. Was fuer Probleme koennte das eventuel bei einer implimentierung mit .NET 2.0 haben?
Das ist eindeutig. Habe allerdings keine Erklärung dafür. Ich kann mir nur einen Fehler im Treiber vorstellen. Evtl mal Hersteller anschreiben und nachfragen?
Es kann nicht sein dass alle Bluetoothhersteller Fehler in ihren Treivern haben. Das gleiche gilt auch für andere Bluetoothdongels. Und wie gesagt die Geschwindigkeit entspricht genau die vom Bluetooth. Ich werde ein Thema im andern Formu posten, dort werden vielleicht mehrere Leute antworten.
Ich habe das gleiche Problem wie schon vorher jemand hier in dem Thread hatte. Ich verwende die rs232 Komponente des .NET 2.0 in SharpDevelop 2. Senden und empfangen functioniert wunderbar, ich kann allerdings die empfangen Daten nicht in meiner Form weiterverwenden, ich bekomme immer den Fehler "Cross-thread operation not valid: Control 'lblStatus' accessed from a thread other than the thread it was created on...." Diesen Code habe ich exact so ausprobiert, funktioniert auch nicht: > Achso, hier noch n kleiner Codeschnipselt für Eltmans... > private void SerPort_DataReceived(object sender, > SerialDataReceivedEventArgs e) > { > try > { > SetReply(); > } > catch (Exception ex) > { > System.Console.WriteLine(ex.ToString()); > } > } > > private void SetReply() > { > // Vorsicht vor enventuell nicht abbildbaren characters wie STX, > etc. > textbox1.text = SerPort.ReadExisting(); > } hat jemand noch eine Idee? Ich könnte natürlich den Umweg über eine globale Variable gehen, allerdings würde ich gerne ereignisgesteurt reagieren und nicht über einen Timer ständig die Variable prüfen. Irgendwie muss es doch möglich sein...
@Günther Ich denke (bin mir aber nicht mehr sicher) das gleiche Problem hatte ich auch mal. Ich habe es folgendermaßen gelöst: void serialPort1DataReceived(object sender, System.EventArgs e) { byte[] buffer = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead); for (int i = 0; i<buffer.Length;i++) { tempstring += (" 0x"+buffer[i].ToString("x2")); // in hexdarstellung konvertieren } } Wichtig: tempstring ist eine globale Variable, die auch aus anderen Threads zugänglich ist, das ist bei deiner textbox1 nicht der Fall deshalb die Fehlermeldung. Gruß, Slowflyer
Oh, wer lesen kann ist klar im Vorteil! Natürlich hast meinen vorhin vorgeschlagenen Weg eingeschlagen. Ich denke man muss einfach die textbox1 als protected oder public deklarieren. Wenn in C# nichts vor der Variablendeklaration steht, wird sie als private deklariert (default). Vielleicht kann man das Problem so umgehen. Gruß, Slowlfyer
Danke für die schnelle Antwort Slowflyer! Leider hat es mit protected oder public nicht funktioniert. Hat überhaupt keinen Einfluss auf den Fehler. Eine Idee wäre noch, irgendwie vom rs232DataRecieved Thread aus ein Ereignis im Form Thread auszulösen und dem Ereignis dann die globale Variable auslesen. Mit Threadprogrammierung kenn ich mich aber nicht so aus, keine Ahnung ob oder wie das gehen könnte. Naja, wenn alles nichts hilft nehm ich halt nen Timer mit 100ms, so zeitkritisch ist es auch wieder nicht.
Ich denke ich habe eine Lösung gefunden, die bei mir funktioniert. Sieh dir das mal an: http://www.neowin.net/forum/lofiversion/index.php/t319506.html Gruß, Slowflyer
hi, ich habe ein kleines problem: ich arbeite momentan mit einer Hardware, die mit folgenden Daten arbeitet: Baud: 19200 1 Startbit 8 Datenbits 1 Stoppbit kein Handshake habe das alles soweit in die Komponente von .NET 2.0 eingegeben und probiert. Nebenbei habe ich Portmon laufen um die daten mitzuloggen. Sobald ich aber einen Befehl sende kommt keine Antwort des Geraetes. Wenn ich das Ganze einfach mit dem Hyperterminal probiere kommt nach jedem Buchstabe oder Zeichen eine Antwort des Geraetes. Woran koennte das liegen? Habe alle Einstellungen richtig...
Meine Kristallkugel ist gestern runtergefallen und ist kaputt ;) Scherz bei Seite, was zeichnet Portmon bei deiner Software und beim Hyperterminal auf? Kannst du mal deinen Quelltext posten? So kann man nur raten. Gruß, Willi
Portmon zeigt mir nur, dass ich etwas gesendet habe (in meinem Fall einfach nur mal ein "hallo", ist ja egal, weil das ja schon eine Antwort vom Geraet erfordern muesste) das kommt bei meinem prog raus [quote] 173 0.00164239 daempfungsregul IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS 174 0.00003324 daempfungsregul IRP_MJ_WRITE Serial0 SUCCESS Length 5: hallo 175 0.00000726 daempfungsregul IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS 176 0.00366555 daempfungsregul IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS [\quote] und das beim Hyperterminal [quote] 227 0.00002291 hypertrm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: t 228 0.00000000 hypertrm.exe IRP_MJ_READ Serial0 Length 80 [\quote] es erfolgt also ein read naja was soll ich dir an quelltext geben? ich hab ja nur die Zeile serialPort1.write("hallo");
Danke hat sich erledigt... ich will ja eigentlich nicht unbedingt etwas empfangen... habe jetzt ein Display, welches mir zeigt, dass die Einstellung vorgenommen wurde :) also lauft alles wie gewollt
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.