RS232 with VBA

Didn't know whether to put this in Languages or Database, so lets start here.

I am (attempting to !) write an application which communicates with a connected instrument via RS232. The problem I am having is that I cannot find any method of using VBA to control the RS232 ports. Can anyone help me with this?

I have done extensive searching on the web and can only find various methods using mscomm.ocx which does not come as part of Access.

I am sure there is a way but don't know what it is.

Please help.
Who is Participating?
L30Connect With a Mentor Commented:
ummm, what is RS232? MS Access has a lot of features you can inlude in it. You have to look at the references. If you are looking at messing around with ports in MS Access I reccomend you look at Windows Sockets. There's a lot you can do there. The reference to the Windows sockets can be included on any MS Access forms. The name of the file is

mswinsck.ocx and usually found on C:\Windows\System32 or C:\Winnt\System32 for Pro editions

the winsock control will give you unlimited flexibility and power as far as ports go

If you need more info then provide more details
bonjour-autConnect With a Mentor Commented:
have a look at :

if you evaluate your time, you will not be cheaper off, i think
at least you can try the sofware for free

regards, Franz
lluddenConnect With a Mentor Commented:
Writing serial I/O routines is not for the faint of heart.  Check out for one of the best controls for doing serial I/O
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

nico5038Connect With a Mentor Commented:
You'll have to use the OPEN statement to get a buffer linked to the device.
When it's connected to the COM1 port you can use e.g.:
    Open "COM1" For Output As #1
    Print #1, Chr$(7)
    Close #1
Like stated in:

wheatparkAuthor Commented:
Thanks so far.
The equipment connected to the serial port is really simple. Each control string sent is only 6 bytes long. The communication format is fixed at 9600 baud, 8 data bits, 1 stop bit and no parity.

The mentioned OCX's look interesting (but perhaps a little too involved for me). The website for the gleaf variant does not work correctly (I cannot click the 'Own It Now' button).

What I need to do is as follows:-

Open the com port (COM1) with the above comm setting.

Write the 6 bytes to the com port

Read back 5 bytes from the connected equipment (the acknowledgement)

Close the COM port.

This sounds so simple and yet I am struggling to do it.

Thanks all for your help so far but this is still not solved.
wheatparkAuthor Commented:
Ok, I have found in my C:\Winnt\System32 the MSCOMM32.OCX. This seems to be a big step towards solving the problem. My code is as follows:-

Private Sub btnPSUOff_Click()
    Dim SendChar(5) As Byte
    If Not SPComms.PortOpen Then   ' Open the comm port if not already open
      SPComms.PortOpen = True
    End If
    If Not SPComms.PortOpen Then
      MsgBox "cannot open comm port "
    End If
    SendChar(0) = 6
    SendChar(1) = 1
    SendChar(2) = 31
    SendChar(3) = 14
    SendChar(4) = 1
    SendChar(5) = 105
    SPComms.Output = SendChar()

    SPComms.PortOpen = False        'Close Port
End Sub

This is called from a button press on a form which includes the Microsoft Comm Control (from the ocx file above). My intention is to send six Hex bytes to the attached instrument: #06#01#1F#0E#01#69
This works perfectly well using advanced serial port monitor.

Note also, I have another button which does the following code (although I have set these values as defaults inside the control):-

Private Sub btnInitialise_Click()
    SPComms.CommPort = 1        'Set to use COM1
    SPComms.DTREnable = True    'Don't think this matters
    SPComms.Handshaking = 0     'No Handshaking
    '0="No Handshaking"
    '1="XOn/XOff handshaking"
    '2="Request-to-send/clear-to-send handshaking."
    '3="Request-to-send, XOn/XOff handshaking."
    SPComms.Settings = "9600,n,8,1"     '9600 Baud, No Parity, 8 Data bits, 1 Stop Bit
End Sub
Sounds good, as always a lot of trail and error, but I see you did it well !
What's remaining ?

wheatparkAuthor Commented:
I'm sorry but in reading it again, my last post wasn't clear.

It should send the six bytes to COM1 to the attached instrument (which does work using 'Advance Serial Port Monitor' however, this does not give the desired result using my code above.

I am sure that once I crack this, everything else I need to do will be incredibly simple.

I appreciate your help.
Did you try to send:
    dim strSendChar as string
    strSendChar= chr(6)&chr(1)&chr(31)&chr(14)&chr(1)&chr(105)
    SPComms.Output = strSendChar

wheatparkAuthor Commented:
Unfortunately I did. Reading a reference I found at

tells me "To send text data using the Output property, you must specify a Variant that contains a string. To send binary data, you must pass a Variant which contains a byte array to the Output property."

The above code was the closest I could get to it.
wheatparkAuthor Commented:
Note, have just found some excellent help here:

But this still does not solve the problem.
Hmm, did you also look into:

In "the old days" only sending the characters to the output device was enough, but perhaps also a trailing vbCRLF is needed to generate a linefeed and show the device the data is complete...

wheatparkAuthor Commented:
Unfortunately sending vbCR or vbLF or vbCRLF has no effect.

Much information, all of little help.

I think my next check will be to connect the output of this PC to another running 'Advance Serial Port Monitor' so I can see exactly what is being put out. However, my lead is at home and I won't be able to do this until tomorrow.

I'll let you know what this tells me.

jadedataMS Access Systems CreatorCommented:
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Split: L30 {http:#9680053} & bonjour-aut {http:#9680312} & lludden {http:#9680408} & nico5038 {http:#9680879}

Please leave any comments here within the next seven days.

EE Cleanup Volunteer
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.