通过串口excel-vba发送字节数组失败

时间:2017-03-27 15:49:46

标签: vba excel-vba winapi serial-port excel

我正在尝试从Excel工作表中获取信息,并使用Windows API将其作为字节数组通过串行端口发送。这只是其中的一小部分:

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

我当前的问题:当我发送一个长度为1的字节数组(只有一个字节)时,我正确地接收它(我使用超级终端检查我发送的内容),但是当我发送一个数组时长度> 1,问题来了;而不是像这样接收它:

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

https://some.cloudfront.net/3...9-a...0-1..c-9...f/i18n/locale-en.json

我得到的是:

what I should receive

我真的无法弄清楚可能出现什么问题,如果有人有线索,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,数组中正确的元素数是:

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

更重要的是,您的代码未应用call convention for the WriteFile API。也就是说,第二个参数应该是指向要传输的第一个字节的LPCVOID指针。将数组的名称byteData传递给函数不会实现,因为数组是一个复杂的COM数据结构,而不是C数组。你应该做的是:

  • 首先使用address获取数组数据结构的VarPtrArray

  • 然后向其添加12以获取第一个字节的地址。

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

...

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

有关处理数组数据及其指针的信息,可以在[本页]中找到优秀的示例。(https://www.codeproject.com/Articles/729235/VB-and-VBA-Array-Buffering

还要确保您将数组声明为Byte数组,例如

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

您未展示的代码部分可能存在其他错误(可能是udtCommOverlap的设置),但希望这些更正会让您走上正确的轨道。