Hallo,
ich versuche den ganzen Tag über die serielle Schnittstelle Daten zu
senden und auch zu empfangen.Ich kann zwar senden aber nicht empfangen.
Ich arbeite mit der Programmiersprache c#. Kann vielleicht jemand mir
Tipps geben .
public Form1()
{
InitializeComponent();
getAvailablePorts();
}
void getAvailablePorts()
{
String[] ports = SerialPort.GetPortNames();
cbCOM.Items.AddRange(ports);
serialPort1.RtsEnable = true;
//RTS=Sendeanforderung. Áktiv, wenn Computer bereit
ist Daten zu senden
serialPort1.RtsEnable = false; ????
serialPort1.DtrEnable = true; ????
serialPort1.DtrEnable = false; ????
}
VG
Das sind einfach zuwenige Infos, um deine Frage zu beantworten. Du
müsstest zumindest noch folgende Infos liefern:
1) was ist angeschlossen und wie
2) werden rts und cts vom angeschlossenen Gerät überhaupt benutzt?
3) ein vollstänsiges Programm (oben fehlt quasi alles, was das Empfangen
etc. erledigt...
4) hast du mal die Pins 2 und 3 am 9poligen seriellen Steckvverbinder
gebrückt und dann was gesendet? Kommt dann was an?
MRK schrieb:> Kann vielleicht jemand mir> Tipps geben .
Wenn das Gepostete der ganze Code sein soll, dann ist er kompletter
Mist.
Du holst die Liste der verfügbaren Ports und fummelst dann sofort an den
Portpins rum. Irgendwie fehlen dazwischen zwei Schritte, nämlich das
Auswählen des gewünschen Ports und vor allem auch das Öffnen dieses
Ports.
Mit einem nicht geöffneten SerialPort kann man nix machen, auch nicht an
den Pins rumfummeln.
Metaller schrieb:> Wo ist das richtige Programm?
Gehört ja - wenn's denn mal kommt - sowieso eher ins Forum
"PC-Programmierung". Mein ARM jedenfalls kann kein C#.
Markus F. schrieb:> Mein ARM jedenfalls kann kein C#.
"Dein ARM" kann dann vermutlich auch kein C, C++ oder Assembler, sondern
nur den daraus generierten Maschinencode ausführen oder ggf. einen
Interpreter für die o.a. Programmiersprachen.
Und natürlich gibt es auch die Möglichkeit, aus C# generierten Code auf
ARM-Prozessoren auszuführen, z.B. durch das .NET Micro Framework oder
das .NET Compact Framework.
Hallo MRK,
wenn du nicht sicher bist, ob deine Gegenstelle die Steuerleitungen
benutzt dann lasse sie so wie sie sind und probiere es aus. Sofern die
Gegenstelle Steuerleitungen braucht muß du die Entsprechenden freigeben
mit "serialPort1.xxxEnable = true". Dann müssen diese Leitungen aber
auch im Kabel vorhanden sein und es muß der richtige Kabeltyp
(Verbindungskabel(1:1) oder NullModemkabel(gekreuzt)) verwendet sein.
Hier ein kleines VC# Beispiel, mit dem alle empfangenen Zeichen aus dem
Empfangspuffer in einen String gelesen werden:
----------------------------------------------------------
using System.IO;
serialPort1.PortName = "COM1";
// Zugriffe auf die Schnittstelle ermöglichen
serialPort1.Open();
// Für empfangene Zeichen
String sIn;
// Falls etwas empfangen
if(serialPort1.BytesToRead)
// Alle Zeichen in einen String lesen
{ sIn = serialPort1.ReadExisting();
// mache irgend etwas mit den empfangenen Zeichen
// Am Ende den Port schließen
serialPort1.Close();
----------------------------------------------------------
Verwendet wird eine Drei-Draht-Verbindung (TXD,RXD,GND) ohne
Steuerleitungen und da zwei DEE's(DatenEndEinrichtung) verbunden sind,
ist das Kabel gekreutzt.
Gruß. Tom
Andreas S. schrieb:> Und natürlich gibt es auch die Möglichkeit, aus C# generierten Code auf> ARM-Prozessoren auszuführen, z.B. durch das .NET Micro Framework oder> das .NET Compact Framework.
Nee. Das kann er auch nicht.
Markus F. schrieb:> Andreas S. schrieb:>> Und natürlich gibt es auch die Möglichkeit, aus C# generierten Code auf>> ARM-Prozessoren auszuführen, z.B. durch das .NET Micro Framework oder>> das .NET Compact Framework.>> Nee. Das kann er auch nicht.
Ich habe nicht "aus C# generierten Maschinencode" geschrieben.
Nikolaus schrieb:> ich bin für jede Antwort dankbar...
Ist es denn eine richtige serielle Schnittstelle, also ist da ein
richtiger Com-Port an deinem PC dran oder ist es ein
USB-Seriell-Konverter?
Wie lautet die Bezeichnung deines Konverters?
Manche Konverter können die RTS/CTS-Pins einfach nicht ansprechen.
Hast du mal versucht die Spannung an den RTS/CTS-Pins zu messen und sie
in deinem Programm per Hand auf high/low zu setzen?
Wenn das nicht geht nimm dir einfach einen anderen
USB-Seriell-Konverter.
Hallo,
ich glaube mein Problem liegt im Verständnis. Ich weiss nicht genau wann
ich RTSenable bzw DTRenable auf false oder auf true setzen soll und was
da genau geschieht?
DTR Data Terminal Ready.
Kurz gesagt: du aktivierst es, wenn dein Programm bereit ist. Generell
bereit. Es ist einfach nur die Meldung an die Gegenstelle: Huhu, hier
ist jemand.
Heutzutage wird DTR meistens ignoriert.
RTS und CTS spielen zusammen und haben nicht mehr die Bedeutung, die sie
früher mal hatten. Heutzutage ist das einfach nur die Leitung, mit der
man der Gegenstelle mitteilt: "Daten marsch, ich bin bereit und
aufnahmefähig" bzw. "Warte mal ein bisschen, ich bin gerade beschäftigt
und kann mich nicht um dich bzw. das was du mir sagen willst kümmern"
Denk an dich und ein Telefongespräch:
"Warte mal, da ist jemand an der Tür"
.... grummel grummel grummel, Postbote
"So, geht wieder"
Nikolaus schrieb:> ich glaube mein Problem liegt im Verständnis. Ich weiss nicht genau wann> ich RTSenable bzw DTRenable auf false oder auf true setzen soll und was> da genau geschieht?
Tja, das hängt genau nur davon ab, wie die Übertragung von der
"gegnerischen" Seite behandelt wird, ist also ein einfaches Problem der
Vereinbarung zwischen den Kommunikationspartnern.
Es gibt da die HW-Handshake-Varianten "7wire", dann spielt sowohl RTS
als auch DTR eine Rolle und "5wire", dann spielt nur RTS eine Rolle.
Allerdings ist es in beiden Fällen nicht nötig (oder sogar: möglich),
mit eigener Software was sinnvolles beizutragen, weil das Windows-API
das alles viel effizienter (und sehr viel weniger Timing-kritisch)
bereits auf Treiber-Ebene abhandeln kann. Man muss dazu einfach nur die
Schnittstelle passend initialisieren.
Und ja: auch die unsäglich miese Implementierung namens SerialPort, die
MS da die Frechheit hatte mit .Net2 zu veröffentlichen (und bis heute
nicht wirklich gefixt hat), kann das. Irgendwie... Notdürftig...
Man muss den völlig kranken Scheiss einfach nur richtig benutzen, dann
wird es im Normalfall auch meistens funktionieren (nur das war wohl auch
das Designziel der komplett unfähigen Programmierer, die es verbrochen
haben). Diese idiotische .Net-Implementierung fasst jedenfalls erstmal
die zwei denkbaren Varianten des Hardware-Handshake zu einer zusammen
(Handshake.Hardware). Das meint eigentlich 7wire. Also ist, bei Absenz
der gegnerischen Ansteuerung von DTR, das lokale DSR physisch, durch
entsprechendes Kabel, mit dem lokalen DTR zu verbinden und das lokale
DTR auf "true" zu setzen, womit effektiv nur noch die Flußsteuerung über
CTS/RTS aktiv ist, also die 5wire-Variante.
Die wird dann (zumindest meistens) korrekt über das tatsächlich
fehlerfrei funktionierende Win32-API umgesetzt. Tatsächlich hat aber die
Implementierung von SerialPort derart viele Macken, dass man eigentlich
nur davon abraten kann, diesen perversen Scheiss überhaupt zu benutzen,
sobald es um mehr geht, als nur ab und an ein paar Bytes über die
RX-TX-Verbindung zu nudeln...
Hallo,
also hierbei sollen Daten von modem an dem PC und umgekehrt gesendet und
empfangen werden. Dabei ist das Modem über die serielle Schnittstelle an
dem PC angeschlossen. Es wird jeweils ene Datenleitung (RXD/TXD) dür das
Empfangen bzw Senden verwendet. Wenn ich jetzt RTSenable
(Sendebereitschaft) auf true setze, wer sendet und wer empfängt Daten?
Waspassiert beim false?
Karl H. schrieb:> Heutzutage wird DTR meistens ignoriert.
heißt das, dass ich diesen Teil aus meinem Programm weg machen soll
serialPort1.DtrEnable = true; //?????????????????????
serialPort1.DtrEnable = true; //?????????????????????
VG
Nikolaus schrieb:>> Heutzutage wird DTR meistens ignoriert.>> heißt das, dass ich diesen Teil aus meinem Programm weg machen soll>> serialPort1.DtrEnable = true; //?????????????????????> serialPort1.DtrEnable = true; //?????????????????????
Muss nicht sein. Wenn es benutzt wird, brauchst du das, wenn es
ignoriert wird schadet es nicht.
Wenn du dann mal auf eine Gegenstelle striffst, die die Statussignale
auswertet, musst du erst den Fehler suchen und dann die richtige
Verwendung wieder reinbasteln.
Georg