2015-10-27 77 views
0

所以我試圖連接到一塊硬件。如果我先連接超級終端並斷開連接。然後關閉連接和程序。一切正常。如果我不收到硬件中的隨機字符。我在超級終端中使用與代碼中相同的設置。Com端口不工作,除非超級終端打開並關閉端口第一

波特= 9600

奇偶=正

數據= 8

停止= 1個

硬件流控制 「ON」:

OCTS =到上DTR = = on rts = hs

如果我然後斷開硬件和串口I將再次出現同樣的問題。

是否有反正我可以看到如何在超級終端打開和關閉端口後配置正在配置?我應該注意到我正在使用一個多產的串口轉USB適配器。

下面是我用來打開com端口的代碼。

Function OpenCom(PortNum As Integer, Baud As Long) As Long 

Dim lpDCB As DCB 
Dim ComTimeout As COMMTIMEOUTS 

com$ = "COM" + Trim(Str(PortNum)) 

'open the communications port 
hcomtemp& = CreateFile(com$, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, ByVal 0) 

'check for errors 
If hcomtemp& < 0 Then 
    OpenCom = hcomtemp& 
    Exit Function 
End If 
r& = PurgeComm(hcomtemp&, 12) ' purge the comm RX and TX (RXCLEAR=0x08 and TXCLEAR=0x04) 
' COMMAND LINE for "Hardware" flow control - mode com: baud=9600 parity=n data=8 stop=1 octs=on to=on dtr=on rts=hs 
    Build$ = "baud=" + Trim(str(Baud)) + " parity=N data=8 stop=1 octs=on to=on dtr=on rts=hs" 

'build the data communications block 
r& = BuildCommDCB(Build$, lpDCB) 

'set the communications port's parameters with the DCB 
r& = SetCommState(hcomtemp&, lpDCB) 

ComTimeout.ReadIntervalTimeout = 100  'maximum time to wait between received bytes (milliseconds) 
ComTimeout.ReadTotalTimeoutConstant = 1000 'maximum time to wait for receive data (milliseconds) 

'set the timeouts 
r& = SetCommTimeouts(hcomtemp&, ComTimeout) 

'set the input buffer size to 4096 bytes and the output buffer size to 4096 bytes 
r& = SetupComm(hcomtemp&, 4096, 4096) 

'return the handle of the newly opened communications port 
OpenCom = hcomtemp& 

End Function 

回答

1

請嘗試高級串行端口監視器 - >間諜模式。 http://www.aggsoft.com/serial-port-monitor.htm。它將顯示超級終端在端口上執行的所有操作。然後你可以重複這些設置。看來問題與硬件流量控制設置有關。

0

下面是我用來解決我的問題的代碼。我只能用這種方法來做一件裝備。

Function HandShakeBM5AS(ComPort As Integer) As Boolean 

    Dim Bm5ACom As Long 

     Dim x As Variant 
     Dim Path As String 
    comm$ = ComPort 
    Commands$ = "MODE COM" & comm$ & ": BAUD=9600 PARITY=N DATA=8 STOP=1 TO=ON XON=OFF ODSR=OFF OCTS=ON DTR=ON RTS=HS IDSR=OFF" 
    Call Shell("cmd.exe /S /C" & Commands$, vbNormalFocus) 
    'Shell (Commands$) 

    End Function 
0

如果'rts = hs'包含在控制字符串中,BuildCommDCB()將失敗。這會導致lpDCB設置不正確,並且使用錯誤的值調用SetCommState。

調用BuildCommDCB後,可以在lpDCB結構中設置RTS控制標誌。 (我會包括代碼,但我不確定基本語法)