Forum: PC-Programmierung Excel 2003 rsapi.dll und Messwerte


von Christian J. (elektroniker1968)


Lesenswert?

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

von John S. (student)


Lesenswert?

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

von Christian J. (elektroniker1968)


Lesenswert?

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 :-)

von Christian J. (elektroniker1968)


Lesenswert?

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? :-(((

von John S. (student)


Lesenswert?

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

von Christian J. (Gast)


Lesenswert?

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.

von Christian J. (Gast)


Lesenswert?

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.

von Christian J. (elektroniker1968)


Lesenswert?

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.

von Gerald (Gast)


Lesenswert?

wie kann ich die mscomm.dll dann verwenden?

lg

von Gerald (Gast)


Lesenswert?

woher bekomme ich die mscomm.dll ... hab schon mal gegoogelt aber in der 
dll waren keine sendefunktionen dabei...habs mit depends angeschaut!

von vikot (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.