求购RS232C用VBMSOMM32发送二进制度文件的代码,提示也行,价格300左右,真实!

yumeet 2003-10-30 09:48:36
如果程序有效,马上给钱
我的MAIL:yumeet1979@hotmail.com

发送端和接收端的数据要进行核对.
现在限制接收端为二进制接受的模式下,
如果单次发送ASCII文件(文本文件等),接收正常,发送接收完成后,再次发送会出现有时接收数据不正常.
如果发送非ASCII文件,接收端的数据大小总小于传送过来的数据大小,也就是有丢失.
这个原因我一直无法找到,希望能提供帮助.
我这里的环境;
硬件>两台笔记本电脑,一根9针串口线
软件>WINDOWS20000PRO,VB6
------------------------------------------------------
我现在的传送思路:
设定传送文件的大小不大于10M
发送端:
设定发送端的Input Len为5
R Threshold: 为5

发送端先发送文件名,取选择的文件名的后8位发送
然后在发送端comSend_OnComm事件进行监视,COMEVRECEIVE事件发生时,
如果收到的字符串数据为"NAMED",说明接收方已经收到文件名,然后发送文件大小.
如果收到的字符串数据为"SIZED",说明接收方已经收到文件大小,然后开始发送文件内容
如果收到的字符串数据为数字,说明接收方已经开始收到文件内容,该数字为接收方该次收到的数据大小,
然后将该数字进行累加,判断累加的结果和文件大小相等,说明接收成功.


接收端
设定发送端的S Threshold: 为5
申明接收的次数为全局变量lngReceiveCount,Long型,初始化时为1
申明收到的文件名为全局变量strFileName,String型
申明收到的整个文件大小为全局变量lngFileSize,Long型
申明每次收到的数据大小为全局变量lngReceiveSize,Long型
申明文件是否打开标志为全局变量blnFileOpenFlag,Boolean型,初始化时为FALSE
comSend_OnComm事件进行监视,COMEVRECEIVE事件发生时
判断lngReceiveCount
为1的时候,说明发送过来的是文件名,将文件名保存为全局变量strFileName,设定lngReceiveCount=2.然后EXIT SUB
为2的时候,说明发送过来的是文件大小,将文件大小保存为全局变量lngFileSize,设定lngReceiveCount=3.然后EXIT SUB
为3的时候,说明发送过来的是文件内容,
blnFileOpenFlag为FALSE时,创建新文件strFileName,设定blnFileOpenFlag为TRUE
将本次收到的数据往strFileName写入
将本次收到的数据大小lngReceiveSize进行累加
如果lngReceiveSize和lngFileSize相等,说明收到了全部的文件内容,显示消息,.然后EXIT SUB
.用一定时器事件,每次COMEVRECEIVE事件发生后过了10秒后还没再次发生COMEVRECEIVE事件,
说明数据接收错误,超时了,显示消息,然后退出,再次将各变量初始化,准备再次接收另一文件数据
程序接下:
...全文
39 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yumeet 2003-10-30
  • 打赏
  • 举报
回复
接上
---------------------------------------------
发送端的监视
Select Case comSend.CommEvent

Case comEvReceive

strInput = comSend.Input

If Len(strInput) = 0 Then
Exit Sub
End If
Timer2.Enabled = True
intTimeCount = 0
Debug.Print Str(Len(strInput)) + strInput
If IsNumeric(strInput) Then
lngReceiveCount = lngReceiveCount + CInt(strInput)
If lngReceiveCount = intLastCount Then

intBufferSize = comSend.OutBufferSize
ReDim Sendarr(1 To intBufferSize)

If lngSendSize < lngFileLen Then
'ファイル終了を判断する
If lngFileLen - Loc(iSendFilenum) < intBufferSize Then
intBufferSize = lngFileLen - Loc(iSendFilenum)
ReDim Sendarr(1 To intBufferSize)
End If
'既定ファイルから内容を取得する
Get iSendFilenum, , Sendarr
comSend.Output = Sendarr
intLastCount = intLastCount + intBufferSize
lngSendSize = lngSendSize + intBufferSize

End If
End If
Else
If strInput = "NAMED" Then
comSend.Output = CStr(lngFileLen)
Else
If strInput = "SIZED" Then
intBufferSize = comSend.OutBufferSize
ReDim Sendarr(1 To intBufferSize)
If lngSendSize < lngFileLen Then

If lngFileLen - Loc(iSendFilenum) < intBufferSize Then
intBufferSize = lngFileLen - Loc(iSendFilenum)
ReDim Sendarr(1 To intBufferSize)
End If

Get iSendFilenum, , Sendarr
comSend.Output = Sendarr
intLastCount = intBufferSize
lngSendSize = lngSendSize + intBufferSize
End If
End If
End If
End If

If lngSendSize <> 0 Then
staInfo.Panels(3).Text = M_FILE_SENDING & Str(lngSendSize) & "B"
End If
If lngSendSize = lngFileLen Then

Close #iSendFilenum
Call ParaInitSet
staInfo.Panels(3).Text = M_FILE_SENDED
End If
If lngFileLen = lngReceiveCount Then
Call ParaInitSet
staInfo.Panels(3).Text = M_FILE_SENDED
MsgBox M_FILE_RECEIVEENDED, vbApplicationModal
Exit Sub
End If

End Select
Exit Sub
---------------------------------------
接收端的监视
Select Case comReceive.CommEvent
Case comEventBreak ' A Break was received.
ErrMsg = "Break"

Case comEventCDTO ' CD (RLSD) Timeout.
Case comEventCTSTO ' CTS Timeout.
Case comEventDSRTO ' DSR Timeout.
Case comEventFrame
ErrMsg = "Framing"

Case comEventOverrun
ErrMsg = "Overrun"

Case comEventRxOver
ErrMsg = "OverFlow"
MsgBox "ddd"

Case comEventRxParity
ErrMsg = "Parity"
Case comEventTxFull
ErrMsg = "TX Full"
Case comEventDCB
ErrMsg = "DBC"
Case comEvCD
If comReceive.CDHolding = True Then
staInfo.Panels(3).Text = M_PORT_CONNECTED
End If
Case comEvCTS
ErrMsg = "comEvCTS"
Case comEvDSR
ErrMsg = "comEvDSR"
Case comEvRing
ErrMsg = "comEvRing"
Case comEvReceive


If strReceiveTime = "" Then
strReceiveTime = Now
End If
intTimeSeconds = 0
If Timer2.Enabled = False Then
Timer2.Enabled = True
End If
'Debug.Print Str(intReceiveTime) & "___" & comReceive.InputMode
Select Case intReceiveTime

Case 1
strFileName = comReceive.Input
strFileName = strFilePath & Format(strReceiveTime, "YYYYMMDDHHMMSS") & "_" & strFileName
intReceiveTime = 2
comReceive.Output = "NAMED"
Debug.Print "name" + strFileName

Case 2
Dim strFileTempSize As String
strFileTempSize = comReceive.Input
If Not IsNumeric(strFileTempSize) Then
staInfo.Panels(3).Text = M_FILE_SENDINGERROR
MsgBox M_FILE_SENDINGERROR
Exit Sub
End If

lngReceivFileSize = CLng(strFileTempSize)
intReceiveTime = 3
comReceive.Output = "SIZED"
comReceive.InputMode = comInputModeBinary
Debug.Print "size" + CStr(lngReceivFileSize)

Case 3
Dim intBuffer As Integer

intBuffer = comReceive.InBufferCount
If blnFirstRs = True Then
iReceiveFilenum = FreeFile
Open strFileName For Binary As iReceiveFilenum
blnFirstRs = False
End If
lngFileSize = lngFileSize + CLng(intBuffer)

ReDim DataARR(1 To intBuffer)

DataARR = comReceive.Input
Put iReceiveFilenum, , DataARR
staInfo.Panels(3).Text = M_FILE_RECEIVING & lngFileSize & "B"


Dim strLenSend As String
strLenSend = Trim(CStr(intBuffer))
While Len(strLenSend) < 5
strLenSend = "0" & strLenSend
Wend

Debug.Print lngFileSize
comReceive.Output = strLenSend

If lngFileSize = lngReceivFileSize Then
staInfo.Panels(3).Text = M_FILE_RECEIVED
Call AddFileInfo

End If
Exit Sub
End Select
Case comEvSend
ErrMsg = "comEvSend"
Case comEvEOF
ErrMsg = "comEvEOF"
End Select

Exit Sub

7,789

社区成员

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

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