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

wyj2 2000-03-09 11:03:00
我使用CreateFile,ReadFile用OverLapped方式读取串口,超时设置为(MAXDWORD,0,0,50,5000),读缓冲大小为12个字节,出现下面的怪事:
从刚刚打开串口开始算起,对方发来的前12个字节无论如何也接收不到,之后则完全正常。我改为14个字节,则前14个字节也接收不到,似乎超时设置在整个缓冲区第一次填满之前根本不起作用...
哪位老师指点一下,十分感谢,十分感谢...
...全文
239 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
  • 打赏
  • 举报
回复
由于线路干扰导致的.连通后线路稳定一定时间后再通讯.
51单片机晶振的问题总结   晶振是什么?全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。   在初学51单片机的时候,总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏,是血液的是脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解。   一,为什么51单片机爱用11.0592MHZ晶振?   其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。   其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。   二,在设计51单片机系统PCB时,晶振为何被要求紧挨着单片机?   原因如下:晶振是通过电激励来产生固定频率的机械振动,而振动又会产生电流反馈给电路,电路接到反馈 后进行信号放大,再次用放大的电信号来激励晶振机械振动,晶振再将振动产生的电流反馈给电路,如此这般。当电路中的激励电信号和晶振的标称频率相同时,电 路就能输出信号强大,频率稳定的正弦波。整形电路再将正弦波变成方波送到数字电路中供其使用。   问题在于晶振的输出能力有限,它仅仅输出以毫瓦为单位的电能量。在 IC(集成电路) 内部,通过放大器将这个信号放大几百倍甚至上千倍才能正常使用。   晶振和 IC 间一般是通过铜走线相连的,这根走线可以看成一段导线或数段导线,导线在切割磁力线的时候会产生电流,导线越长,产生的电流越强。现实中,磁力线不常见,电磁波却到处都是,例如:无线广播发射、电视塔发射、手机通讯等等。晶振和IC之间的连线就变成了接收天线,它越长,接收的信号就 越强,产生的电能量

5,388

社区成员

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

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