PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dumme Anfängerfrage.: Wie kann ich den RS232 auslesen


DraconiX
2010-01-10, 10:20:41
Also ich möchte mir ein kleines Prgramm schreiben, mit welchem ich den Com Port auslesen möchte.

Ich kann zwar Firmewares für RISC Prozessoren ala PIC und AVR Mikrocontroller schreiben (C und Assembler) aber bei der PC Programmierung scheitere ich immer wieder aufs neue :freak:

An die Sprache hätte ich schon eher an C oder Visual Basic gedacht - die Express Edition vom Visual Studio dürften da ja schon völlig ausreichend sein.

Grund dafür ist: Ich habe mir einen 8 Leitung Logicanalyser auf Atmega32 Basis gebaut und programmiert, dieser gibt mir die Werte via RS232 aus und zeigt sie mir auch per LED an. Momentan rufe ich die Daten nur via Hyperterminal ab, jedoch ist dies selbstverständlich sehr unübersichtlich für mich (Achtmal ne Datenfolge von 0-1-1-0-1-0-1... muß man erstmal im Geist sortieren und versuchen diese übereinander zu legen :freak:)

Ich möchte es dann so haben das ich es mir auf einem Diagramm anschauen kann.

Da die Daten vom Atmega extrem schnell ausgelesen werden (ein Sample per 1µs) gehe ich nicht davon aus das die RS232 dies in Echtzeit einlesen kann. Aber ich kann mir ja im EEPROM Daten bis 2kb ansammeln welche er dann mit einem Schwung schreibt.

Meine ausgerechnete Verlustrate bei 38.400 baud mit einem XTAL von 8Mhz beträgt ca. 0,16% damit kann ich ja leben. Müsste mir das mal mit 96.000 baud ausrechnen - kann aber auch mein µC so umprogrammieren das ich einen Baudratenquarz nutzen kann. Sinvoll?

Gibt es da schon fertige Samples wie man diesen Port mit z.b. VB auslesen kann? Gibt es schöne Tutorial Seiten welche es man besuchen kann / sollte?

Danke für eure Hilfe!

Funky Bob
2010-01-10, 10:33:08
Mit dem Sourcecode solltest du weiter kommen können:


http://www.comp.lancs.ac.uk/~albrecht/sw/

Gast
2010-01-10, 10:47:17
In C/C++ helfen folgende Befehle:

CreateFile (COM* als Filename)
CloseHandle
GetCommState/SetCommState
CreateEvent
WaitCommEvent
ReadFile/WriteFile

sind ausführlich in der Windows-SDK-Doku ink. Beispiele beschrieben.
Ebenfalls sind dort VB-Beispiele.

Nebenbei: Falls du per RS232 schneller übertragen möchtest:
Verwende als Brücke einfach einen FT232R (von FTDI) oder einen
vergleichbaren Chip, die sind meist einfach in eine Schaltung zu
integrieren. Ansprechen lassen die sich wie eine normale serielle
Schnittstelle. Einige haben sogar ein eigenes SDK (auch für VB).
Damit lassen sich die Daten wesentlich schneller als über die
Windows-SDK auslesen.

Gruss

Jörg

Monger
2010-01-10, 11:38:27
Ich kann dir jetzt nur was zu .NET sagen (das betrifft dann auch z.B. VB.NET), da gibt es folgenden Namespace:

http://msdn.microsoft.com/de-de/library/system.io.ports.aspx

Schau dir davon insbesondere mal die SerialPort Klasse genauer an. Da gibt es auch ein Beispiel drin.

DraconiX
2010-01-10, 11:58:48
Vielen vielen Dank für eure Infos! Werde mir das mal alles anschauen :)

...Nebenbei: Falls du per RS232 schneller übertragen möchtest:
Verwende als Brücke einfach einen FT232R (von FTDI) oder einen
vergleichbaren Chip, die sind meist einfach in eine Schaltung zu
integrieren....


Oh sehr schön, kannte ich noch garnicht. Momentan kommt ein normaler MAX232EPE von Maxim zum Einsatz, ich werde mir aber auf jeden Fall mal den FT232R ordern. Ist ne nette Sache, da er ja nen UART <-> USB Wandler ist.

Gast
2010-01-10, 13:31:05
Habe ich vergessen zu erwähnen: Dem FTDI FT232R muss natürlich noch
ein Maxim MAX232xyz zur Pegelwandlung nachgeschaltet werden.
Beim FT232R bin ich mir nicht so sicher mit der Bezeichnung: Es gibt einen
parallelen (8Bit-Bus) und einen seriellen (RS232-Bridge) Chip, erkennbar
an der Endung L btw. R ?? Schau einfach mal bei Reichelt nach. Parallel
ist natürlich besser, falls einsetzbar. Dann hat man Übertragungsraten
von bis 12 MBits/s.

Gruss

Jörg

DraconiX
2010-01-10, 14:08:02
Habe ich vergessen zu erwähnen: Dem FTDI FT232R muss natürlich noch
ein Maxim MAX232xyz zur Pegelwandlung nachgeschaltet werden.
Beim FT232R bin ich mir nicht so sicher mit der Bezeichnung: Es gibt einen
parallelen (8Bit-Bus) und einen seriellen (RS232-Bridge) Chip, erkennbar
an der Endung L btw. R ?? Schau einfach mal bei Reichelt nach. Parallel
ist natürlich besser, falls einsetzbar. Dann hat man Übertragungsraten
von bis 12 MBits/s.

Gruss

Jörg

Jep, jep. Habe ich schon gesehen. Wenn dann wird er sowieso parellel als USB Interface geschaltet. Mit RS232 ist ja sowieso bei 16 kb/s das Ende der Fahnenstange erreicht.

Ich konnte bis jetzt aber noch keinen Unterschied zwischen dem FT232R und dem FT232RL im Datenblatt erkennen (ob seriell o. parallel). Aber im Grunde irrelevant, da alle beide genauso angesprochen werden können wie der MAX232 - und das ist schon genial! Endlich mal ein Blick über den Tellerrand des doch schon recht betagten MAX232 :rolleyes:

Gast
2010-01-10, 14:19:58
Ich habe mal eben in meinen PDFs nachgeschaut. FT232R ist die
parallele (d.h. 8 Bit-Bus als Interface), FT232RL ist die serielle
Version (TX,RX,RTS,CTS.. als Interface). Irgendwo auf der 3-5. Seite
ist ein Blockdiagramm, auf der rechten Seite der Skizze ist beim R
ein Bus-Controller, beim RL ein UART-Controller.

Jörg

DraconiX
2010-01-10, 14:28:11
Hmm.. hab mir nun den RL geordert. Nunja, werde mir dann wohl den R auch noch dazu bestellen. Im 8Bit Modus dürfte er ja um einiges schneller (µC <-> FT232R) seine Daten erhalten. Der FT232RL hingegen ist natürlich hochkompatibel zu fertigen Projekten. Ein Fehlkauf war es sicherlich nicht.

Gast
2010-01-10, 15:10:04
Naja, im Prinzip "drauf geschissen" welchen du bestellt hast. Habe selber
zwei RL Chips für meinen MSP430, und die Arbeiten für einen MyProcessor
schnell genug.

Wenn du noch schnellere Datenübertragung haben willst: Schau mal nach
einem LAN-Bridge-Chip, der hat auch kaum mehr Beine und ist ebenfalls
einfach in eine Schaltung integrierbar, auch für MyProcs geeignet. Ausserdem
haben diese Chips schon die Driver integriert (kein "Max232".. erforderlich).

Jörg

Gast
2010-01-10, 19:57:24
Bei einem FT232 braucht es sicher keinen MAX232 mehr wenn man ihn an den µC hängt, weil beide (LV)TTL sprechen.
Ich hoffe, der OP will die Daten nicht wie beschrieben im EEPROM zwischenspeichern. Das geht erstens kaputt und zweitens ist es langsam.

Gast
2010-01-11, 08:46:43
@Gast (von 19:57:24),

LOL, dumme Idee von mir, wie komme ich auf einen nachgeschalteten
MAX232?? Braucht man natürlich nicht, der FT232 wird direkt an USB
angeschlossen !!!

Das EEPROM btw. das Zwischenspeichern kann man sich aber jetzt
ersparen, die USB-Verbindung ist schnell genug, liefert bis 4MByte/s.

Nebenbei bemerkt: Mit dem FT232R (parallele Version) kann man ohne
viel Aufwand (d.h. ohne MyC) einen 8-Bit-Datenlogger mit 4MSamples/s
bauen.

Jörg

DraconiX
2010-01-11, 15:35:12
Soo also mal wieder btt.:

Sehr schön, das klappt schonmal ganz gut. Also VB ist ne feine Sache wenns leicht und schnelle gehen muß:

http://www.abload.de/img/unbenannt96oe.png

Jetzt muß ich diese Werte nur noch grafisch irgendwie aufwerten.... Jemand nen Tipp?!

DraconiX
2010-01-11, 19:20:14
Soo nun auch mit grafischer Auswertung: :D

http://www.abload.de/img/unbenanntp6oe.png

moBi
2010-01-12, 23:42:55
Etwas OT, aber hast Du einen Link, wo beschrieben ist, wie man so kleine Graphen erstellen kann? Ich kenn nur Zedgraph und das ist für sowas overkill.:redface:

DraconiX
2010-01-13, 20:35:17
Hab ich mir selber gebastelt den Graphen... moment suche mal fix den Code...

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
g = e.Graphics
Dim x1, x2, y1, y2, aold As Integer
For i = 0 To Len(AVRString) - 1
If Mid$(AVRString, i + 1, 1) = "0" Then
a = 5
Else
g.DrawLine(pen1, x2, y2, x2, y2 - (a * 2))
a = 0
End If
If a = aold Then
Else
g.DrawLine(pen1, x2, y2, x2, y2 + (a * 2))
End If

x1 = i * 10
y1 = 10 + (a * 2)
x2 = (i * 10) + 10
y2 = 10 + (a * 2)
aold = a

g.DrawLine(pen1, x1, y1, x2, y2)
g.DrawLine(pen2, x1 + 1, y1, x1, y1)
Me.Text = i + 1
Next
a = 0
End Sub

Dazu noch den Pen:


Dim pen1, pen2 As Pen

und beim Form Load den Pen definieren:

pen1 = New Pen(System.Drawing.Color.Black)
pen2 = New Pen(Color.Red)