Paula.C
Paula.C

Reputation: 23

Fail at sending byte array through serial port excel-vba

I am trying to get information from an Excel worksheet and send it through a serial port as a byte array, using Windows API. This is just a small part of it:

lngSize = UBound(byteData) - LBound(byteData)
WriteFile(udtPorts(intPortID).lngHandle, byteData, lngSize, _lngWrSize, udtCommOverlap)

My current problem: when I am sending a byte array of length 1 (just one byte), I receive it correctly (I am using a hyperterminal to check what I'm sending), but when I send an array of length > 1, here comes the problem; instead of receiving it like this:

letter = 65
For i = 0 To 5
    dataToSend(i) = letter
    letter = letter + 1
Next

what I should receive

what I get is this:

what I receive

I really cannot figure out what could be the problem and I would be grateful if someone had a clue. Thank you!

Upvotes: 2

Views: 545

Answers (1)

A.S.H
A.S.H

Reputation: 29332

First, the correct number of elements in an array is:

lngSize = UBound(byteData) - LBound(byteData) + 1     ' <-- add 1

More importantly, your code is not applying the call convention for the WriteFile API. Namely, the second parameter should be a LPCVOID pointer to the first Byte to transfer. Passing the array's name byteData to the function wont achieve that, because the array is a complex COM data structure, not like a C array. What you should do is:

  • First get the address of the array's data structure, using VarPtrArray:

  • Then add 12 to it to get the address of the first byte.

.

Private Declare Function VarPtrArray Lib "VBE7" Alias "VarPtr" (var () As Any) As Long

...

WriteFile(udtPorts(intPortID).lngHandle, VarPtrArray(byteData()) + 12, lngSize, _lngWrSize, udtCommOverlap)
'                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For information about handling arrays' data and their pointers, excellent examples can be found [on this page].(https://www.codeproject.com/Articles/729235/VB-and-VBA-Array-Buffering)

Also make sure that you declared you array as a Byte array, like

Redim byteData(someSize) As Byte
'                        ^^^^^^^

There might be other errors in the parts of code you didn't show (possibly the settings of udtCommOverlap), but hopefully these corrections will put you on the right track.

Upvotes: 1

Related Questions