2009-02-20 15 views
6

Qual è il modo migliore per accedere a una porta seriale da VBA?Qual è il modo migliore per accedere a una porta seriale da VBA?

Ho bisogno che alcuni dei nostri rappresentanti di vendita siano in grado di inviare una semplice stringa sulla porta seriale da un pulsante di azione in PowerPoint. Di solito non uso VBA, soprattutto per qualcosa di simile. Normalmente lo trasformo in un'applicazione di qualche tipo, ma in realtà non penso che l'idea sia così brutta. Sarà uno strumento utile per loro per dimostrare questo dispositivo con un proiettore e parlare con altri venditori e persone non tecniche. Inoltre, questo venditore non avrà problemi a fare piccole modifiche alla presentazione VBA o PowerPoint, ma non farebbe altrettanto bene con la ricompilazione di un'applicazione .NET.

So che potremmo farlo attraverso un file batch eseguito dalla presentazione sull'azione, ma questo non mi rende molto felice. Immagino che potremmo probabilmente accedere ad un oggetto COM ed eseguire da lì, ma di nuovo non mi rendo conto delle ultime e più grandi librerie da usare in VBA, e sarebbe anche bello avere un piccolo primer veloce su come aprire facilmente, invia e chiudi la connessione.

Dato che questo dovrà essere eseguito su computer di più persone, sarebbe bello se fosse facilmente trasportabile su altre macchine. Dovrei essere in grado di dire che deve essere eseguito su Office 2007 e Windows XP. La compatibilità con qualsiasi altra cosa sarebbe comunque un bel bonus.

Come dovrei andare a gestire questo? Qualche buon consiglio o trucco? Consigli di libreria?

risposta

11

L'API Win32 gestisce la porta seriale come un file. È possibile accedere direttamente alle porte seriali richiamando queste funzioni API da VBA. Ho dovuto farlo per una vecchia applicazione .NET ma VBA non è diverso.

Piuttosto che farlo per te su questo sito, ecco un riferimento a cui mi sono aggrappato nel corso degli anni. How to perform serial port communications in VBA

+0

+1 Per sito con un esempio funzionante. – Oorang

0
Sub Stinky() 
Dim COM_Byte As Byte 
Dim Received_Lines As Long 
Dim Input_Buffer As String 
Dim Output_Buffer As String 
Dim Chars2Send As Long 
Dim CharsRemaining As Long 
Dim lfsr As Long 
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1 
    Input_Buffer = "" 
    CharsRemaining = 0 
    Do 
    Get #1, , COM_Byte 
    If COM_Byte Then 
     If COM_Byte = 13 Then   ' look for CR line termination 
      Debug.Print Input_Buffer, Now ' print it 
      Input_Buffer = ""    ' and clear input buffer 
     ' generate some output (9 characters) 
      lfsr = &H3FFFFFFF - 2^(Received_Lines And 15) 
      Output_Buffer = "[email protected]@@@@@@@" 
      Chars2Send = 9 
      CharsRemaining = 9 
      For j = 0 To 2 
       Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr/32^(2 - j)))) 
      Next j 
      Debug.Print Output_Buffer 
     ' show what I generated 
      Received_Lines = Received_Lines + 1 ' keep track of received line count 
     Else 
      Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer 
     ' process any characters to send 
      If CharsRemaining Then 
       CharsRemaining = CharsRemaining - 1 
       COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1)) 
       Put #1, , COM_Byte 
      End If 
     End If 
    End If 
    DoEvents 
    Loop 
    Close 
End Sub 

Questo funziona per me. Non sono sicuro che l'OPEN abbia effettivamente impostato il Baud rate, come ho usato per la prima volta TeraTerm. La mia porta COM è una connessione USB a un kit di prototipazione BASYS3. Sta vomitando caratteri a 9600, record di 36 caratteri che terminano con CR. Posso inviare a caso comandi di 9 caratteri. Nel codice precedente, genero queste stringhe di comando ogni volta che ho ricevuto una nuova riga. Il modo in cui ho scelto quale personaggio inviare è un po 'goffo: forse un modo migliore è quello di avere un puntatore di caratteri e un numero di caratteri, e quando questi sono uguali per impostarli entrambi a zero.

+0

Se la porta COM è aperta come casuale, sembra che EOF ti dica quando hai un personaggio da ricevere. Ciò significa che si può ricevere un carattere Null. EOF dice che non ci sono personaggi in attesa. –

+0

L'impostazione della velocità di trasmissione nell'OPEN non sembra funzionare. Ma Shell "mode.com com7: 9600, n, 8,1" funziona, se si aspetta un secondo prima di eseguire l'OPEN "COM7:" Questo è tutto Excel 2010. –

+0

Aggiornamento su EOF con porta COM come casuale: sembra come EOF non cambia con il carattere ricevuto, ma riflette lo stato del GET. Quindi, dopo GET # 1, vByte, EOF sarà FALSE quando vByte è valido. –

Problemi correlati