一个古怪的串口通讯问题...

wyj2 2000-03-09 11:03:00
我使用CreateFile,ReadFile用OverLapped方式读取串口,超时设置为(MAXDWORD,0,0,50,5000),读缓冲大小为12个字节,出现下面的怪事:
从刚刚打开串口开始算起,对方发来的前12个字节无论如何也接收不到,之后则完全正常。我改为14个字节,则前14个字节也接收不到,似乎超时设置在整个缓冲区第一次填满之前根本不起作用...
哪位老师指点一下,十分感谢,十分感谢...
...全文
236 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Un1 2000-03-09
  • 打赏
  • 举报
回复
这样写行不行:

Private Function SetTimeOut() As Boolean
On Error GoTo ErrorHandle

'GetCommTimeouts m_CommID, timeouts
’此超时设置和MSComm控件相同

Dim tos As COMMTIMEOUTS
With tos
.ReadIntervalTimeout = -1
.ReadTotalTimeoutMultiplier = 0
.ReadTotalTimeoutConstant = 0 '10
.WriteTotalTimeoutMultiplier = 0
.WriteTotalTimeoutConstant = 5000
End With
SetTimeOut = SetCommTimeouts(m_CommID, tos)

ErrorHandle:
End Function

Public Property Let PortOpen(ByVal New_PortOpen As Boolean)
If New_PortOpen Then
If m_CommID < 0 Then
Dim l As Long
l = CreateFile("COM" & m_CommPort, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)
If l = INVALID_HANDLE_VALUE Then
Dim s As String
Select Case Err.LastDllError
Case IE_BADID, 2
s = "无效的端口号。"
Case IE_OPEN, 5
s = "端口已被占用。"
Case IE_MEMORY
s = "不能获取缓冲内存。"
Case IE_DEFAULT
s = "缺省参数错误。"
Case IE_HARDWARE
s = "硬件不支持。"
Case IE_BYTESIZE
s = "不支持此数据位数。"
Case IE_BAUDRATE
s = "不支持此波特率。"
Case Else 'IE_NOPEN
s = "不能打开端口。"
End Select
Err.Raise vbObjectError + ERR_INVALIDPORT, MYNAME, s
Else
m_CommID = l

#If CONBLNMULTI Then
Dim lr As Long
lr = CreateThread(0, 0, AddressOf ThreadProc, ByVal hwnd, 0, l)

#Else
tmTimer.Enabled = True
#End If

If Not SetTimeOut Or SetCommState(m_CommID, m_DCB) = 0 Or _
SetupComm(m_CommID, m_InBufferSize, m_OutBufferSize) = 0 Or _
SetCommMask(m_CommID, &H1FFF) = 0 Then
CanNotSetStateErr
End If
End If
Else
PortOpenedErr
End If
Else
If m_CommID < 0 Then
PortNotOpenErr
Else
Break = False

l = m_CommID
m_CommID = -1

#If CONBLNMULTI Then
DoEvents
#Else
tmTimer.Enabled = False
#End If

CloseHandle l

blnRead = False
blnWrite = False
blnEvents = False

m_CommEvent = 0
strIn = vbNullString
strOut = vbNullString
End If
End If
End Property
forgettor 2000-03-09
  • 打赏
  • 举报
回复
初始化时加上
EscapeCommFunction(m_hComm,SETDTR)
PurgeComm(m_hComm,PURGE_TXCLEAR and PURGE_RXCLEAR and PURGE_TXABORT and PURGE_RXABORT)
试试
Firing_Sky 2000-03-09
  • 打赏
  • 举报
回复
不会是清缓冲区清错了位置吧?
LaoZheng 2000-03-09
  • 打赏
  • 举报
回复
由于线路干扰导致的.连通后线路稳定一定时间后再通讯.

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧