Я использую модуль VB для связи через последовательный порт с thescarms.com (http://www.thescarms.com/VBasic/commio.aspx) в MS Access 2016. Я пытаюсь воспроизвести последовательность, которая успешно получает данные от портативного портативного устройства через соединение через последовательный портИспользуя термит (терминал RS232), я мог общаться с устройством следующим образом:
[CSV] 'sent
[CSV]APR500 V.2.8 Mar 18 2014/20.04.08 14.01.14 'received
[CSVOK] 'received
[CCD|1] 'sent
[CCD|1][CCDOK] 'received
[CSW] 'sent
[CSW][12022019|1333|WG|9.09||||NT||1.2|||M|1] 'received
[CSWOK] 'received
В VBA я пытался повторить это с помощью модуля и процедур CommRead и CommWrite.
Private Sub Command14_Click()
Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
Dim lngStatus As Long
Dim strError As String
Dim strData As String
Dim strAnswer As String
intPortID = 4
strData = "[CSV]"
' Initialize Communications
lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
"baud=9600 parity=N data=8 stop=1")
If lngStatus <> 0 Then
' Handle error.
lngStatus = CommGetError(strError)
MsgBox "COM Error: " & strError
End If
' Set modem control lines.
lngStatus = CommSetLine(intPortID, LINE_RTS, True)
lngStatus = CommSetLine(intPortID, LINE_DTR, True)
' Write data to serial port.
lngSize = Len(strData)
lngStatus = CommWrite(intPortID, strData)
Me.Text1 = strData 'CHECK StrData
If lngStatus <> lngSize Then
' Handle error.
End If
' Read maximum of 64 bytes from serial port.
lngStatus = CommRead(intPortID, strData, 64)
Me.Text2 = strData
strData = "[CCD|1]" 'send next command
' Set modem control lines.
lngStatus = CommSetLine(intPortID, LINE_RTS, True)
lngStatus = CommSetLine(intPortID, LINE_DTR, True)
' Write data to serial port.
lngSize = Len(strData)
lngStatus = CommWrite(intPortID, strData)
Me.Text3 = strData
If lngStatus <> lngSize Then
' Handle error.
End If
' Read maximum of 64 bytes from serial port.
lngStatus = CommRead(intPortID, strData, 64)
Me.Text4 = strData
If lngStatus > 0 Then
ElseIf lngStatus < 0 Then
' Handle error.
End If
' Reset modem control lines.
lngStatus = CommSetLine(intPortID, LINE_RTS, False)
lngStatus = CommSetLine(intPortID, LINE_DTR, False)
strData = "[CSW]" 'send THIRD command
' Set modem control lines.
lngStatus = CommSetLine(intPortID, LINE_RTS, True)
lngStatus = CommSetLine(intPortID, LINE_DTR, True)
' Write data to serial port.
lngSize = Len(strData)
lngStatus = CommWrite(intPortID, strData)
Me.Text5 = strData
If lngStatus <> lngSize Then
' Handle error.
End If
' Read maximum of 64 bytes from serial port.
lngStatus = CommRead(intPortID, strData, 64)
Me.Text6 = strData
If lngStatus > 0 Then
ElseIf lngStatus < 0 Then
' Handle error.
End If
' Reset modem control lines.
lngStatus = CommSetLine(intPortID, LINE_RTS, False)
lngStatus = CommSetLine(intPortID, LINE_DTR, False)
' Close communications.
Call CommClose(intPortID)
End Sub
Кажется, что он работает правильно, но я не получаю данные с моего устройства и вместо этого получаю следующее взаимодействие:
[CSV] 'sent
[CSV]APR500 V.2.8 Mar 18 2014/20.04.08 14.01.14 'recieved
[CSVOK] 'recieved
[CCD|1] 'sent
[CCD|1][CCDOK] 'recieved
[CSW] 'sent
[CSW] 'recieved
Я не понимаю, почемуЯ не получаю такой же ответ, как в случае с термитом. У меня на устройстве меньше 64 байт тестовых данных, и я уже пытался увеличить размер байта в подпрограмме CommRead. Я был бы очень признателен, если бы кто-нибудь смог предоставитьлюбой на сайте, почему это может быть. Надеюсь, это не слишком конкретный и кто-то с большим опытом, чем я, яВ этом может помочь связь VBA или последовательного порта.
Используемое мной устройство - APR 500 (https://agrident.com/products/portable-readers/apr500/)
).