Serielle Multimeter-Daten einlesen mit Excel

Hallo Wolfgang

och, ich sehe gerade, dass Du ja gar kein Problem mit COM (Component Object Model) und dem Zugriff auf Excel hast, sondern nur auf den Port zugreifen willst:

Kannst Du denn nicht auf die Windows-API zugreifen? Das läßt sich doch alles durch ganz einfache Funktionsaufrufe erledigen (CreateFile(), ReadFile(), WriteFile()) - meiner Erfahrung nach hat man die Sache dreimal selber geschrieben, bevor man bei einem fertigen Control durchsteigt und es wirklich gut läuft.

Ich kann Dir das mal als C++-Code aus einem Projekt kopiert vor die Füsse werfen, das müßte sich eigentlich leicht auf VB umsetzen lassen. Zum Einlesen brauchst Du aber einen Thread oder mußt per Timer toggeln

//--------------------------------------------------------------------------- HANDLE m_SerBus; //--------------------------------------------------------------------------- void t_crc_port::Open(string Port) { // Also z.B. Open("COM1"); if (m_SerBus!= INVALID_HANDLE_VALUE) CloseHandle(m_SerBus);

if (Port.empty()) { m_SerBus= INVALID_HANDLE_VALUE; // Keinen COM-Port benutzen } else { // mit COM-Port einrichten m_SerBus= CreateFile( Port.c_str(), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH, 0);

_DCB COM_Para; GetCommState(m_SerBus, &COM_Para); COM_Para.BaudRate= CBR_2400; COM_Para.fBinary= true; // binary mode, no EOF check COM_Para.fParity= false; // enable parity checking COM_Para.fOutxCtsFlow= false; // CTS output flow control COM_Para.fOutxDsrFlow= false; // DSR output flow control COM_Para.fDtrControl= DTR_CONTROL_DISABLE; // DTR flow control type COM_Para.fDsrSensitivity= false; // DSR sensitivity COM_Para.fTXContinueOnXoff= false; // XOFF continues Tx COM_Para.fOutX= false; // XON/XOFF out flow control COM_Para.fInX= false; // XON/XOFF in flow control COM_Para.fErrorChar= false; // enable error replacement COM_Para.fNull= false; // enable null stripping COM_Para.fRtsControl= RTS_CONTROL_DISABLE; // RTS flow control COM_Para.fAbortOnError= false; // abort reads/writes on error COM_Para.ByteSize= 8; // number of bits/byte, 4-8 COM_Para.Parity= NOPARITY; // 0-4=no,odd,even,mark,space COM_Para.StopBits= ONESTOPBIT; // 0,1,2 = 1, 1.5, 2

SetCommState(m_SerBus, &COM_Para); // Port konfigurieren _COMMTIMEOUTS NoTime={ MAXDWORD, MAXDWORD, 25, 5, 5}; // Beim Lesen max 25 ms auf Empfang warten, bzw. sofort zurückkehren, // wenn Empfang vorhanden // Timeout beim Schreiben mit 5 ms pro Byte berechnen ( bei 2400 Baud) // und mit Schreibzeit für ein Byte als Sicherheitskonstante SetCommTimeouts(m_SerBus, &NoTime); SetCommMask(m_SerBus, EV_TXEMPTY); } //--------------------------------------------------------------------------- // Schreiben: unsigned long ULen; if (!WriteFile(m_SerBus, &m_SendePuffer[0], S_Len, &ULen, NULL) || ULen!= S_Len) { RetVal= false; }

//--------------------------------------------------------------------------- // Lesen: uint32 Gelesen; // Referenz für Anzahl der gelesenen Bytes uint8 Zeichen; // Referenz für gelesenes Byte

if (ReadFile(m_SerBus, &Zeichen, 1, &Gelesen, 0) && Gelesen) { // Empfangene Bytes nacheinander aus Schnittstelle lesen

//--------------------------------------------------------------------------- Lesen kann man natürlich auch blockweise in einen Puffer - ich lese das nur byteweise, weil das meine Auswertungschleife stark vereinfacht.

HTH,

Ed

Reply to
Edzard Egberts
Loading thread data ...

Edzard Egberts schrieb:

genau

Sorry - ich bin kein Windowsprogrammierer. Meine Stärken liegen/lagen in DOS (Turbo-/Powerbasic, ASM etc.)

Unter Windows habe ich bisher nur relativ einfache Makros für Excel zur Datenaufbereitung geschrieben. Alles mit Onboardfunktionen. Oder ein paar VB-Sachen - meist ebenfalls für Datenaufbereitung/Konvertierung. Mit Schnittstellen hatte ich unter WIN noch nie was am Hut.

Sicher einfach - wenn man es kann

Sorry - ich suche was ganz simples. Unter Powerbasic sind das etwa 6-8 Zeilen. (Com öffnen, Byte senden, String abholen, speichern und wiederholen bis ESC)

Leider nein.

Aber danke trotzdem

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

Wolfgang Gerber wrote:

Mit ein wenig Phantasie entsteht dann (nur Rumpf, dumpf kopiert und getrimmt aus einem Sheet) eine an einem Timer hängende Pollerei des Ports:

Option Explicit

'

formatting link
Dim Seriell As Object

' Variablen für die Behandlung der seriellen Schnittstelle Dim SeriellPort As Integer Dim SeriellBaud As Long Dim SeriellSettings As String

Const SerialOcx1 As String = "XMCommVBA.XMComm" ' Reihenfolge nicht ändern ! Const SerialOcx2 As String = "XMComCRC.XMCommCRC" ' Die Einleseroutine in PollSeriell Const SerialOcx3 As String = "MSCommLib.MSComm" ' hängt an der Nummer

Dim SerialOcx(3) As String Dim SerialOcxIndex As Integer

' Variablen für die Kommunikationsdaten über die serielle Schnittstelle Dim strBuffer As String ' wird fortlaufend von Leseroutine gefüllt Dim fDiscard As Boolean Dim is_wider As Boolean Dim is_durch As Boolean Dim is_all As Boolean Dim is_loading As Boolean Dim last_worksheet As Object Dim last_filtertyp As Integer Dim is_lo

' Verarbeitung einer empfangenen Zeile (ohne Cr und ohne Lf) Private Sub DoLineInput(strinput As String) 'Debug.Print strInput Dim value As Double Dim KommaPos As Variant ' LogOutput ("DoLineInput") ' für Testzwecke: '.' durch ',' ersetzen KommaPos = InStr(1, strinput, ".") While KommaPos 0 'And KommaPos Null Mid$(strinput, KommaPos, 1) = "," KommaPos = InStr(1, strinput, ".") Wend 'Debug.Print strInput KommaPos = InStr(1, strinput, ",") While KommaPos 0 'And KommaPos Null Mid$(strinput, KommaPos, 1) = "." KommaPos = InStr(1, strinput, ",") Wend ' Untersuchung des Empfangs-strings If Left$(strinput, 1) = "!" Then If Mid$(strinput, 3, 8) = ";STATUS;" Then Call RemoteReadStatus(Mid$(strinput, 11)) ElseIf Mid$(strinput, 3, 5) = ";GET;" Then Call RemoteReadSollwert(Mid$(strinput, 8)) ElseIf Mid$(strinput, 3, 7) = ";DATEN;" Then Call RemoteReadDaten(Mid$(strinput, 9)) ElseIf Mid$(strinput, 3, 7) = ";DEFINE" Then Call AcceptedDefine Else ' Hier neue Empfangskennungen einfügen End If End If End Sub

Sub InitSeriellBuffer() ' LogOutput ("InitSeriellBuffer") strBuffer = "" fDiscard = False End Sub ' Button Start/Stop Timer Private Sub CommandButton1_Click() ' LogOutput ("Seriell CommandButton1_Click") Call ToggleTimer End Sub

' Wird jeden Timer-Tick aufgerufen Sub PollSeriell() Dim crPos As Long Dim lfPos As Long Dim buflen As Long Dim LineInputDone As Boolean ' LogOutput ("PollSeriell") LineInputDone = False If Not Seriell.PortOpen Then ' Wenn die Schnittstelle noch nicht aktiv ist, wird versucht, sie zu öffnen Call OpenPort End If If Seriell.PortOpen And Seriell.InBufferCount > 0 Then ' Wenn die Schnittstelle aktiv ist, kann versucht werden, Daten zu lesen ' Erst mal Schnittstellenpuffer auslesen und in Log-Zelle protokollieren Select Case SerialOcxIndex Case 1, 2 strBuffer = strBuffer & Seriell.InputData ' XMComm Case 3 strBuffer = strBuffer & Seriell.Input ' MSComm Case Else End Select SERIELL_Buffer = strBuffer SERIELL_BufferCount = Len(strBuffer) ' Dann den Buffer nach CR/LF trennen und in Input kopieren crPos = InStr(strBuffer, Chr$(13)) lfPos = InStr(strBuffer, Chr$(10)) buflen = Len(strBuffer) While buflen > 0 And (crPos > 0 Or lfPos > 0) If lfPos > 0 And (lfPos < crPos Or crPos = 0) Then crPos = lfPos End If If crPos > 1 Then If fDiscard Then fDiscard = False Else DoLineInput (Left$(strBuffer, crPos - 1)) 'Zeile extrahieren LineInputDone = True End If End If strBuffer = Right$(strBuffer, buflen - crPos) ' Zeilentrenner eliminieren crPos = InStr(strBuffer, Chr$(13)) lfPos = InStr(strBuffer, Chr$(10)) buflen = Len(strBuffer) Wend End If If LineInputDone Then Call StatusRequest If is_all Then ALL_Sheet.CyclicAutomaticPoll Else If is_loading Then LOAD_Sheet.CyclicAutomaticPoll Else If is_wider Then RESIS_Sheet.CyclicAutomaticPoll Else If is_durch Then DURCH_Sheet.CyclicAutomaticPoll End If End If End If End If ' Call DIAGRAMM_Sheet.ScaleDiagramm End If End Sub

Sub SeriellSend(OutString As String) ' LogOutput ("SeriellSend") If Seriell.PortOpen Then Seriell.Output = OutString End If End Sub

Private Sub UpdateActivityDisplay() ' LogOutput ("UpdateActivityDisplay") If Seriell.PortOpen Then SERIELL_PortOpen.value = "Port aktiv:" SERIELL_PortOpen.Interior.Color = MyGreen Else SERIELL_PortOpen.value = "Fehler bei Port:" SERIELL_PortOpen.Interior.Color = MyRed End If End Sub

' Bei jedem neuen Private Sub OpenPort() ' LogOutput ("OpenPort") On Error Resume Next Seriell.CommPort = SeriellPort Seriell.Settings = SeriellSettings 'Seriell.InputMode = comInputModeBinary Seriell.InputMode = 0 'comInputModeText Seriell.Handshaking = 1 'comXOnXoff ' Xon/Xoff-Handshake für RTOS-UH Seriell.RTSEnable = True ' hilft manchen Schnittstellen Seriell.DTREnable = True ' hilft manchen Schnittstellen Seriell.InputLen = 0 ' jeweils ganzen Puffer lesen Seriell.PortOpen = True ' Schnittstelle öffnen On Error GoTo 0 Call InitSeriellBuffer Call UpdateActivityDisplay End Sub

Sub ClosePort() ' LogOutput ("ClosePort") If Seriell.PortOpen Then ' LogOutput ("ClosePort -Ist Open") Seriell.PortOpen = False ' Schnittstelle schliessen End If Call InitSeriellBuffer Call UpdateActivityDisplay End Sub

Private Sub GetPortParameter() ' LogOutput ("GetPortParameter") If IsEmpty(SERIELL_Port) Or Not IsNumeric(SERIELL_Port.value) Then SERIELL_Port.value = 1 End If SeriellPort = SERIELL_Port.value If SeriellPort < 1 Or SeriellPort > 5 Then SeriellPort = 1 End If SERIELL_Port.value = SeriellPort If IsEmpty(SERIELL_Baud) Or Not IsNumeric(SERIELL_Baud.value) Then SERIELL_Baud.value = 9600 End If SeriellBaud = SERIELL_Baud.value If SeriellBaud < 50 Or SeriellBaud > 150000 Then SeriellBaud = 9600 End If SERIELL_Baud.value = SeriellBaud

SeriellSettings = SeriellBaud & ",N,8,1" End Sub

'Wird beim Öffnen des Workbooks aufgerufen Sub InitPort() ' LogOutput ("InitPort") SerialOcx(1) = SerialOcx1 SerialOcx(2) = SerialOcx2 SerialOcx(3) = SerialOcx3 Set last_worksheet = Nothing last_filtertyp = 0 Set Seriell = Nothing SerialOcxIndex = 1

While SerialOcxIndex

Reply to
Andreas Hadler

Und ich sach noch: haben kann das jeder (frei verteilbar), aber die Lizenz zur Nutzung scheint mir ein eigenes Thema zu sein. XMComm geht immer, nur muss man da halt leider die passende Version davon für das Excel haben.

In meinem Sheet (s. snipped-for-privacy@4ax.com) siehst du, dass ich ggf. mehrere OCX durchprobiere. Dann brauch ich den Code nicht ändern, nur dem Kunden das richtige OCX auf den Rechner spielen (ggf. probieren).

Andreas

--
Always wear protective clothing and approved helmet when using the
software. The software may contain small particles, so keep it out of
reach of children under age of five. The author don't assume any
responsibility for mental or social problems the software may cause.
(Pacemaker's legal)
Reply to
Andreas Hadler

Kann er natürlich. VBA ermöglicht die Benutzung sämtlicher Funktionen mit "WINAPI"-Aufrufkonvention, also auf jeden Fall aller API-Funktionen, die im gegebenen Zusammenhang in Frage kommen.

Das ist tatsächlich _sehr_ oft so. Mir scheint mittlerweile, daß es eine logische Konsequenz der OO-Abstraktion ist, auch wenn das natürlich niemals einer der OO-Prediger zugeben würde.

Auf der sicheren Seite ist man definitiv, wenn man zu jeder Klasse auch den Quelltext hat. Dann kann man im Problemfall halt die Kapselung aufbrechen und einfach "von Hand" verfolgen, was wirklich passiert.

Oder anders ausgedrückt: niemals Kohle abdrücken für irgenwelche Softwarekomponenten, die nicht mit komplettem Quelltext verfügbar sind.

Reply to
Heiko Nocon

Bist Du Dir wirklich sicher? Bei meinem Metex war das beispielsweise nicht in der Dokumentation erwähnt. Erst durch nachmessen an den Pins während die mitgelieferte Software ausgelesen hat, haben wir das rausbekommen.

------

--
Kai-Martin Knaak
http://lilalaser.de/blog
Reply to
Kai-Martin Knaak

Zugriff auf die Hardware erlauben, ist eine Kernaufgabe des Betriebssystems. Im Zweifelsfall macht man sich das Leben eher schwer, wenn man diese Hebel prinzipiell nicht benutzt.

------

--
Kai-Martin Knaak
http://lilalaser.de/blog
Reply to
Kai-Martin Knaak

Kai-Martin Knaak schrieb:

150%ig! - ich habe nur eine 3-Draht-Leitung dran.

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

Kai-Martin Knaak schrieb:

Ein sehr hilfreicher Tip

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

Andreas Hadler schrieb:

Das sieht mal gut und verständlich aus. Werde ich in den nächsten Tagen mal versuchen.

Danke!

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

"Wolfgang Gerber" schrieb

Etwas Programmiererfahrung oder der Wille zum Lernen.

Es geht um Excel 97. Irgend eine DLL? Bloß welche und

Nein, alles in der Windows Api vorhanden

Ich nicht ;-)

Ich würde für diesen Zweck ein C++ Programm schreiben, welches Excel über die Automatisierungs COM-Schnittstelle startet und die Daten in die Zellen schreibt.

Für Anregungen wie man so etwas in seiner Lieblingssprache macht guckst du hier:

formatting link

Brauchst du die Daten wirklich in "Echtzeit" ? Sonst speichere die Daten einfach als csv Datei, die kannst du dann direkt mit Excel öffnen. Allerdings kenne ich keinen Weg in eine csv Datei zu schreiben, während sie von Excel geöffnet ist.

Gruß

Hans-Georg

Reply to
Hans-Georg Lehnard

Hans-Georg Lehnard schrieb:

beides vorhanden - aber ich ich setzte mir auch Massstäbe was ich bereit bin für die Lösung eines Problemes einzuetzen.

Komisch - warum gibt es dann fast ausschliesslich Lösungen zu finden die mit zusätzlichen DLLs arbeiten?

schade

Lernst du als z.B. gelernter Maschinenbauer z.B. auch zusätlich Automechaniker nur um einmal im Jahr die Bremsbeläge an deiner Kiste zu wechseln?

Sicher nicht - wenn dein technisches Verständnis reicht, dann machst du es oder lässt es machen.

Ich werde mich um dieses Miniproblem zu lösen nicht extra mit einer anderen Programmierspache anfreuden. Da arbeite ich lieber 5 Stunden in meinem Wissenskreis und kaufe mir dafür eine fertige Lösung. Bzw. lasse sie mir von einem Studenten schreiben. Der freut sich - ich freue mich und gut ist es.

Nicht unbedingt - wäre aber praktischer

Genau so etwas mache ich seit Jahren.

Das macht nix - meine Schreibroutine wartet dann solange mit dem aktualisieren solange die Datei gelockt ist..

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

"Wolfgang Gerber" schrieb

Du musst selbst entscheiden, wie wichtig dir eine Lösung ist und wieviel du dafür investieren willst. Auch Internet Recherchen nach fertigen free Lösungen kosten Zeit

Weil die Leute immer diese bescheuerte OCX benutzen wollen ;-)

Ein Vorredner hat es bereits geschrieben .. Ein einfaches CreateFile reicht und du kannst byte oder blockweise lesen und schreiben wie in/aus einem File.

Ich bin kein Maschinenbauer und habe die Zylinderkopfdichtung meines VW-Bus trotzdem selbst gewechselt ;-)

Unterschätze solche "MiniProbleme" nicht.

so auf die schnelle :

1.) Schnittstelle öffnen und evtl Initialisierungs Kommandos an dein Multimeter schicken. 2.) Zellenzähler Initialisieren 3.) Einen Timer starten und in jedem Timer-Event Befehl an Messgerät senden "gib Daten" Leseroutine starten und warten auf Rückkehr. Entscheiden ob Daten und wieviel empfangen wurden oder Time out zugeschlagen hat. Was tun bei nichts gelesen (Wiederholen und wie oft) Was tun bei halb gelesen ( Schleife bis gesamtes Messergebnis gelesen) Daten empfangen und Interpretieren/wandeln (Zahlenformat, Sprachabhängiges dezimal Trennzeichen usw.) Daten in Zelle schreiben evtl. Excell Neuberechnung starten Zellenzähler erhöhen 4.) Irgendwie einen Zeitpunkt bestimmen das du jetzt gerne aufhören würdest. 5.) Den Timer anhalten 6.) Schnittstelle schließen und für andere Anwendungen freigeben

Und jetzt wünschen wir uns noch in jedem beliebigen Zustand eine einwandfrei Fehlerbehandlung und Datenintegrität.

Ich arbeite zur Zeit für einen Kunden in der Medizin Technik und dir würde es bestimmt auch nicht gefallen, wenn dein Arzt eine falsche Diagnose stellt, weil der Programmierer eines Diagnosegerätes das Problem unterschätzt hat;-)

Oder die Abfrage der Messwerte eines ABS Systems im Auto würde ich auch nicht als mini Problem ansehen.

.. wie bereits gesagt: für deinen Privatgebrauch musst du es selbst entscheiden ..

Gruß

Hans-Georg

Reply to
Hans-Georg Lehnard

Hans-Georg Lehnard schrieb:

sehr viel "blabla" - aber kein einziger Satz Hilfe :-(

Dafür viel Offtopic - sorry

Ich weiss wie man Daten liest und vearbeitet. Das ist bzw. war mein Job. Nur eben nicht mit Excel und per serieller Schnittstelle.

Das ist hier nicht die Frage.

Mir geht es um die Lösung des seriellen Einlesens unter Excel. Und dazu habe ich nun sehr viele sinnvolle Tips erhalten. Welchen ich nun realisieren kann wird sich zeigen.

Dein Posting gehörte leider in keiner Weise dazu. Tut mir leid daß ich das so sagen muss.

Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

Wolfgang Gerber schrieb:

Self Fulfilling Prophecy - kannst Du nun eine Systemfunktion aufrufen, oder nicht?

Wenn Du bei meinem Beispiel das ganze Konfigurationsgedöns wegläßt, hast Du auch nur noch ein paar Zeilen - mit Powerbasic kann man sich also die Schnittstelle nicht vernünftig einrichten? Hier nebenan diese Dreidraht-Diskussion - bei meinem Beispiel ist die Flow-Control deaktiviert, also keine Probleme mit Handshake.

Gern geschehen, ob Du es verwendest, ist mir eigentlich auch egal, aber die Begründung für die Ablehnung hat mich nun doch verblüfft.

Gruß,

Ed

Reply to
Edzard Egberts

Hi Heiko,

nett, ein Bekannter aus der Windows-Gruppe. :o)

Ja, ich habe gut drei Jahre gebraucht, um alle unsere Programme mit Open-Source und Win-API neu zu schreiben, aber diese Verzweiflungstat hat sich gelohnt! Wird so etwa seit März an die Kunden verteilt und ist ein echter Erfolg - keine Phänomene mehr, keine Workarounds mehr, alles genau wie ich es mir vorstelle und wenn mal ein Problem auftaucht (irgendwas finden die Kunden immer ;o), ist es auch bei kniffligen GUI-Sachen im Handumdrehen gelöst. Ich bin hellauf begeistert - nie wieder ein Framework oder MS-Geraffel! Jetzt muß ich nur noch Windows selbst loswerden, das hakt zeitlich noch etwas. :o(

Dummerweise ist ausgerechnet die Software, für die man Kohle abdrücken muß, meistens nicht mit Quelltext verfügbar. An Löhnware habe ich auf meinem PC noch WinXP und Eagle...

Gruß,

Ed

Reply to
Edzard Egberts

Edzard Egberts schrieb:

Darum geht es nicht. Irgend ein kurzes Listing verstehen und eintippen bzw. anpassen habe ich oft genug gemacht.

Wenn aber dann was nicht geht weil etwas fehlt oder falsch ist wo ein Windowsprogrammierer kein Problem mit hat stehe ich eben auf dem Schlauch.

Das hilft mir aber nicht weiter. Ich habe echt keine Lust in C++ was anzufangen.

Das habe ich nicht behauptet!

Darum geht es nicht! Da habe ich mit PB auch kein problem.

Es ist deine Art! Im Gegensatz zu dir kam von allen anderen mehr oder weniger bis sehr gute Hilfe!

Von dir nur viel OT bis hin zu dummen Geschwätz! S.o.! Solche Art "Hilfe" brauche ich nicht.

Lassen wir das also - die Chemie stimmt hier nicht. Und bevor was sauer wird....

Schönen Tag noch. Gruss Wolfgang

--
Achtung Spamfilter: Bei Mailantwort muss das Subjekt 
                    das Wort NGANTWORT enthalten.
Reply to
Wolfgang Gerber

Hallo Wolfgang,

Weil das mit den API für den Normalsterblichen Programmierer wie unsereins eben ein bischen undurchsichtig ist, unübersichtlich dokumentiert dazu :-(

Ist das ganze immer noch aktuell? Ist meine Nachricht mit dem Verweis auf elektors serial.dll mal wieder bei arcor stecken geblieben?

zur Not noch einmal: Elektor 3/2002 beschreibt den Umgang mit API, in Jahr später haben sie es eingesehen, dass deren Klientel mit API überfordert ist und haben die Serielle Schnittstelle in eine dll gepackt. Das ganze liegt im Delphi-Quelltext bei und ist spätestens dort auch für wenigprogrammierer wie mich schnell nachvollziehbar gewesen. Das enthaltete Demo (also auf elektor bei 3/2003 nachschauen, IMHO war Artikel und Zip frei herunterladbar) läuft bei mir nicht, meine Anwendung seit Jahren im 24/7 Einsatz ohne Stress.

Marte

Reply to
Marte Schwarz

Hallo Wolfgang,

Doch, genau darum geht es mir - Du verhältst Dich gerade wie der typische Windows-Programmierer (wie von MS gewollt und herangezüchtet): Irgendwelche "fertigen" Sachen suchen, zusammenklicken und hoffen, dass es funktioniert. Natürlich ist das frustrierend. Du sagst, Du bist ein Programmierer, der mit DOS, BIOS, Asm umgeht: Nicht mit fertigen Objekten herumklicken, sondern die Funktionen direkt aufrufen, ist also genau Dein Metier und Du stehst Dir gerade selber im Weg.

Die richtig fricklige Windows-Programmierung ist GUI mit den ganzen Callbacks und Objekten. Den Schnittstellenzugriff kann man mit den Overlapped-Sachen auch völlig unverständlich machen, aber was ich Dir geliefert habe, entspricht genau der gewohnten "Single-Task"-Programmierung - Funktion aufrufen und gucken, was zurück kommt. Es ist weder speziell C++, noch Windows, sondern gibt die Funktionen an, die Du brauchst und zeigt, wie die aufgerufen und konfiguriert werden.

Entschuldige WoGe, ich kenne *Deine* Art schon seit Jahren und verstehe das als Kompliment. :o)

Im Gegensatz zu mir und Hans-Georg wolltest Du sagen, ich bin ja nicht alleine mit meinem Lösungsvorschlag. Ich programmiere seit 10 Jahren Win32 und kann das mit dem dummen Geschätz von jemandem, der auch noch zugibt, dass er selber keine Ahnung hätte, nun wirklich nicht ernst nehmen:

Guck Dir doch einfach mal an, wie Du in VB die genannten Funktionen aufrufen muß und welche Parameter Du da übergibst - die Anwendung ist dann genau so, wie Du alle Deine Programme schreibst:

Erst CreateFile() zum Öffnen der Schnittstelle und um das Handle für die anderen Funktionen zu erhalten, dann mit WriteFile() die Abfrage starten und mit ReadFile() warten, oder in einer Schleife pollen (wenn Du eine Eingabe abfragen willst oder andere I/O bearbeitest) bis die Daten zurückkommen. Für ReadFile() ist da die Timeout-Konfiguration interessant, weil Du Dir Sleep() sparen und direkt im ReadFile() warten kannst. Mit CloseHandle() wird am Ende die Schnittstelle wieder freigegeben (kann man sich beim kompletten Programmende natürlich sparen).

Danke und Viel Erfolg (egal wie ;o),

Ed

Reply to
Edzard Egberts

"Edzard Egberts" schrieb im Newsbeitrag news:ehcq9j$2nm$03$ snipped-for-privacy@news.t-online.com...

Klar Mann, wenn du dieselbe Softwareentwicklungszeit&-kosten haben willst, wie vor 20 Jahren, kannst du das machen. /Eigentlich/ geht es bei der Verwendung von vorgefertigten Modulen per API (abgesehen von Hardwareabstraktion) um die Beschleunigung und Kostensenkung wegen Vereinfachung der Programmierung. Das eine Menge APIs (von Microsoft ggf. absichtlich, siehe das Buch ueber BigBlue aus dem BillyBoy seine miesen Tricks herhat) eher mehr Arbeit kosten als Arbeit sparen, sei es weil die Doku eine Frechheit ist, der Code grob fehlerhaft, das Konzept fuer'n Arsch oder die Schicht keinerlei Mehrwert sondern Einschraenkungen bringt, steht ausser Frage und ist ein Hauptgrund, warum heutige Software so teuer und so schlecht ist.

Die CreateFile/WriteFile Schnittstelle fuer das COM Port ist so eine Katastrophen-API. Die alte COMM mit WM_COMMNOTIFY war um Laengen besser.

--
Manfred Winterhoff, reply-to invalid, use mawin at gmx dot net
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.