MsComm传送数据时接收与发送的控制

kaput 2000-04-04 09:31:00
感谢ljunfa,我的问题如下:
1)用output="*****"发送信息后在OnComm事件中接收时收到的信息不完全,有时甚至无响应,如发送"Trans Start" & chr(5) & chr(10) &chr(13)后,接收端用myBuffer=MsComm1.Input读取数据,结果有时读完有时读不忘。
2)我设置OutBuffeuCount=512,InputBufferCount=1024,文件发送完后,接收端常常不能读完最后的数据。
3)我是用VB写程序,RThreshold设置为1。其实这个问题核心是如何使发送与接收相匹配?(我用尽了判断Inbuffercount、Outbuffercount是否=0,DSRHolding、CTSHolding是否为True等方法), 因为接收端接收的Modem缓冲区内容与发送的数据的关系似乎为随机的(如发送"ABCDEFG",用BB=BB & Mscomm1.Input接收,显示之,发现有时是"ABCD"、有时是"A".......,接收端加上约0.6秒延迟后显示似乎正常,但控制符与文件混合发送、接收时又不匹配)。
本人愚笨的大脑已经被折腾好久了,可以上问题始终未解决,请各位高手帮帮忙。
...全文
346 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vchuman 2000-04-04
  • 打赏
  • 举报
回复
接收的数据时会存在延时,需要查询接收到的数据大小,当接收到的数据的总体大小满足要求时才可以进行处理.
subzero 2000-04-04
  • 打赏
  • 举报
回复
VB编写MSCOMM比较麻烦
主要是UNICODE的问题
在VB中字是按照字元来表示的
一个汉字和一个字母都是一个字元
所以如果与控制符或ASC码大于128的字符混合发送的时候必须转换一下
sendstring=strconv(sendstring,vbfromunicode)
或者使用字符串函数的B版本
另外接收端肯定要有延时
否则字符还没有到达接收缓冲区
延时时间视情况而定
peacock 2000-04-04
  • 打赏
  • 举报
回复
Sorry!不用“If Check1.Value <> 1 Then”这句
peacock 2000-04-04
  • 打赏
  • 举报
回复
我用下面的方法还没出现问题,你不防试试:
'初始化
If MSComm1.PortOpen = False Then
MSComm1.CommPort = "2400,n,8,1"
MSComm1.Settings = 1
'以上参数由自己定义
MSComm1.InputLen = 1
MSComm1.RThreshold = 1 '设置/返回当接收到多少个字符时发生接收事件,为0时不发生接收事件
MSComm1.SThreshold = 1 '同上,用于发送事件
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
End If


'下面外部变量必须这样定义,否则不能正确接收
Dim InString As Variant '接收变量
Dim OutString() As Byte '发送变量

'在MSComm1的OnComm事件中加入以下代码
Select Case MSComm1.CommEvent
Case comEvReceive '接收事件
'接收缓冲区收到Rthreshold个字符时触发
If MSComm1.InBufferCount Then
InString = MSComm1.Input
For I = LBound(InString) To UBound(InString)
If Check1.Value <> 1 Then
'用Text1控件来显示接收的数据
Text1.Text = Text1.Text & CStr(Hex(Val(InString(I)))) & " "
End If
Next I
InString = ""
End If
Case comEvSend '发送事件
For I = LBound(OutString) To UBound(OutString)
'用Text2控件来显示接收的数据
Text2.Text = Text2.Text & CStr(Hex(Val(OutString(I)))) & " "
Next
End Select
Un1 2000-04-04
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/TopicView.asp?id=6207
Janven 2000-04-04
  • 打赏
  • 举报
回复
oh,看到你的原题了。
如果你能更改下层硬件通信协议的话,可以在发送之前加多一个成功响应标志,程序检验到这个字符,即可开始接收了。没有的话,自己以第一个信号为标志吧,得有些处理。注意监测程序是一个延时的循环,(能超时退出)我的程序中有类似的语句,你可以看看。但那是读串口的,监测的程序你自己编吧。

这是我的读写串口函数。我使用了MSCOMM控件。

dim inarr as byte()

Sub ReadMSComm(MsComm1or2, nNum As Integer)
Dim lcount
ReDim InArr(nNum - 1)

CommErr = False
' wait data return to comm port
lcount = 1
Do
DoEvents
lcount = lcount + 1
Loop Until MsComm1or2.InBufferCount >= nNum Or lcount > 5000
If lcount > 5000 Then
MsgBox "通讯出错, 复位并重新再试!", , "故障"
CommErr = True
Exit Sub
End If

'save bin data to buff
inbuf = MsComm1or2.Input

'trans data to system array
InArr = inbuf
End Sub

Sub WriteMSComm(MsComm1or2 As MSComm, byAscii As Byte)

Dim OutByArr(0) As Byte, OutBuf As Variant

OutByArr(0) = byAscii
OutBuf = OutByArr
MsComm1or2.Output = OutBuf
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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