Hallo, ist jetzt 7 Jahre her, dass ich das mal gemacht habe und leider habe ich die Projekte nicht mehr. Hat jemand eine Grundlage (Excel Tabelle) in der einiges an VBA Code untergebracht ist, zB die Ansteuerung von der rsapi.dll? Ich stehe etwas wie Ochs vorm Berg die ersten Schritte wieder zu machen, weil ich alles vergessen habe was mit VBA zu tun hat (nur noch C). Möchte eigentlich nur ein paar Daten über RS232 in einer Tabelle einschreiben. Die ersten Versuche mit der rsapi.dll endeten beim Aufruf von READSTRING mit einer Schutzverletzung die Excel ins Jenseits beförderte. Verwendet habe ich die 32 Bit Version von der Homepage von Burghard Kainka. Die lief vor x Jahren zumindest noch unter Windows 2000. Falls jemand ein .xls Projekt hat, was mir als Basis dienen kann bitte senden an admin@der-scirocco.de Danke ! Christian
Christian J. wrote: > Hallo, > > ist jetzt 7 Jahre her, dass ich das mal gemacht habe und leider habe ich > die Projekte nicht mehr. > > Hat jemand eine Grundlage (Excel Tabelle) in der einiges an VBA Code > untergebracht ist, zB die Ansteuerung von der rsapi.dll? Ich stehe etwas > wie Ochs vorm Berg die ersten Schritte wieder zu machen, weil ich alles > vergessen habe was mit VBA zu tun hat (nur noch C). Möchte eigentlich > nur ein paar Daten über RS232 in einer Tabelle einschreiben. Die ersten > Versuche mit der rsapi.dll endeten beim Aufruf von READSTRING mit einer > Schutzverletzung die Excel ins Jenseits beförderte. Verwendet habe ich > die 32 Bit Version von der Homepage von Burghard Kainka. Die lief vor x > Jahren zumindest noch unter Windows 2000. > > Falls jemand ein .xls Projekt hat, was mir als Basis dienen kann bitte > senden > an admin@der-scirocco.de > > Danke ! > > Christian Hallo, die folgenden VBA Zeilen (Auszug) funktionieren bei mir unter EXCEL 2003 einwandfrei. ------------------------------------------------------- Declare Sub OPENCOM Lib "RSAPI.DLL" (ByVal Parameter$) Declare Function READBYTE Lib "RSAPI.DLL" () As Integer Declare Sub TIMEOUT Lib "RSAPI.DLL" (ByVal ms%) Declare Sub CLOSECOM Lib "RSAPI.DLL" () Declare Sub SENDBYTE Lib "RSAPI.DLL" (ByVal Ibyte As Byte) Declare Sub DELAY Lib "RSAPI.DLL" (ByVal ms%) Public Sub c_control() OPENCOM "COM1:9600,N,8,1" SENDBYTE Cells(1, 6).Value TIMEOUT 1000 e1 = READBYTE If e1 < 0 Then MsgBox ("C-Control antwortet nicht -- Abbruch") GoTo ende1 End If CLOSECOM ----------------------------- Viel Erfolg
Hallo, es tut sich auch bei mir was, nur mit READSTRING geht nichts. Einzelbytelesen klappt aber. Und der Startbutton, der das Ganze aktivier kommt nicht mehr hoch,. trotz DoEvents. Idee?
1 | Dim e1 As Integer |
2 | Dim textlaenge As Integer |
3 | |
4 | OpenCOM "COM1:57600,N,8,1" |
5 | With ThisWorkbook.Sheets("Tabelle1").textfeld |
6 | .SelStart = 0 |
7 | .Text = "" |
8 | .ScrollBars = fmScrollBarsVertical |
9 | End With |
10 | |
11 | |
12 | ThisWorkbook.Sheets("Tabelle1").Activate |
13 | 'Columns("A:c").Select |
14 | 'Selection.ClearContents |
15 | 'Range("A1").Select |
16 | |
17 | timeout 10 |
18 | textlaenge = 0 |
19 | Do
|
20 | DoEvents
|
21 | IX_READSTRING 1, satz |
22 | If (satz <> "") Then |
23 | textfeld.Text = textfeld.Text + Chr(e1) |
24 | textlaenge = textlaenge + 1 |
25 | End If |
26 | Loop Until (textlaenge > 1000) |
27 | CLOSECOM
|
PS: Geht langsam wieder, einmal gelernt muss es wohl erst aus dem Hinterstübchen reaktiviert werden :-) Nur setze ich immer noch ; hintere viele Zeilen, einfach aus Gewohnheit :-)
Nachsatz: Ich habe 57600 baud eingestellt, die Sätze vom PIC trudeln auch ein und werden im Textfenster dargestellt:
1 | back = OpenCOM("COM1:57600,N,8,1") |
2 | If (back = 0) Then |
3 | MsgBox ("Fehler beim Öffnen der Schnittstelle") |
4 | End If |
5 | |
6 | 'Columns("A:c").Select |
7 | 'Selection.ClearContents |
8 | 'Range("A1").Select |
9 | |
10 | timeout 10 |
11 | textlaenge = 0 |
12 | Do
|
13 | DoEvents
|
14 | wert = READBYTE |
15 | If (wert > 0) Then |
16 | textfeld.Text = textfeld.Text + Chr(wert) |
17 | textlaenge = textlaenge + 1 |
18 | DoEvents
|
19 | End If |
20 | Loop Until (stopflag = True) |
21 | textfeld.Text = textfeld.Text + Chr(10) + "Übertragung gestoppt" |
22 | DoEvents
|
Allersdings läuft das so wie zu Zeiten eines 2400baud Akkustikkopplers, die Zeichen trudeln mehr ein als dass die schlagartig da stehen, wie als wenn ich ein normales Terminalprogramm benutze. Ist VBA echt derart langsam? :-(((
Christian J. wrote: > Hallo, > > es tut sich auch bei mir was, nur mit READSTRING geht nichts. > Einzelbytelesen klappt aber. Und der Startbutton, der das Ganze aktivier Also, READSTRING kenne ich hier gar nicht. Meiner Erinnerung geht nur BYTEserielle Verarbeitung. Ist aber doch an sich kein Problem. Bei mir ist VBA 'sauschnell'. Lese mit 115Kb/s ein ...! Weißt Du zufällig, wie ich in VBA ein asynchrones READ aufsetzen kann ? Möchte VBA nicht im Dauerloop lesen lassen, sonder nur dann hochkommen lassen, wenn ein Zeichen zur Verarbeitung anliegt. Aber das geht aus EXCEL sicher nicht ...! Geht das aus VBA ? Oder aus windows xp überhaupt ...? Grüsse
Hallo, Natürlich gibt es eine Interruptverarbeitung des UART Controllers, unter DOS war die leicht erreichbar, unter Windows 98 auch aber wie das jetzt mit XP ist weiss ich nicht. Hardware ist auf jeden Fall vorhanden. Die rsapi.dll ist da allerdings sicherlich nicht die richtige Wahl, eher die mscomm.dll, die bei VB6 mit dabei ist. Und die werde ich auch künftig verwenden. Alternative ist eine Timerstruktur, die zylisch eine Routine aufruft und den Puffer ausliest. Der Puffer kann ja recht gross eingestellt werden, so dass keine Zeichen verloren gehen. Ich weiss allerdings nicht, ob das EXCEL VBA identisch ist mit VB6, bin da nicht der Experte..... PS: Mein Empfang stürzt nach einer Weile einfach ab´.... heute morgen stand die Anwendung schon still.
Hier steht wie das asynchrone Behandeln mit der mscomm geht: http://www.vbarchiv.net/tipps/details.php?id=393 Und die werde ich mir heute abend mal aufspielen, ist im VB6 Paket mit drin, muss nur eingebunden werden, wobei ich hoffe, dass die API irgendwo steht, denn sonst sieht es bitter aus.
Nachsatz: Falls Du noch mitliest: Wirf rsapi.dll weg und nimm die mscomm.dll aus VB6. Tausendmal schneller und viel komfortabler konfigurierbar! Vor allem wird ein konfigurierbares Empfangsereignis ausgelöst, damit fällt das Pollen weg.
woher bekomme ich die mscomm.dll ... hab schon mal gegoogelt aber in der dll waren keine sendefunktionen dabei...habs mit depends angeschaut!
Das ist nicht die MSCOMM.dll sondern die MSCOMM32.OCX die du einbinden musst.
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.