请问 vb mscoom 通讯为题
请教 vb mscoom 通讯为题
当上位机(电脑软件)与下位机(单片机)通讯时,上位机总不能将下位机发送的数据(十六进制)全部接受,每次通讯数据量在10万以下,vb的 mscoom控件的InBufferSize属性的最大值为32767,大于此值可能会溢出,但奇怪的是当小于此值时也会丢,请问丢哪里了,期待赐教!!!
以下是电脑软件程序的部分代码:
Private Sub Comm_OnComm()
Dim IntR as integer
Static Resv As Variant '接收数据
Static DataC As Long '串口数据字节数
Static CTestData() As Byte'用于存放接受的字符
Static FactCount As Long '累计实际接收的数据
static TestFlag Boolean'实验结束标志
TestFlag = false
Comm.RThreshold = 0
FactCount = 0
DataC = Comm.InBufferCount: Resv = Comm.Input
ReDim CTestData(100000)
For IntR = 0 To DataC - 1
CTestData(IntR) = Resv(IntR)
FactCount = FactCount + 1
Next IntR
Static CurrTime As Long '等待时间
CurrTime = GetTickCount
'一直接受数据,直到接受完成为止
do
If Comm.InBufferCount >= 1000 Or Abs(GetTickCount - CurrTime) >= 100 Then
CurrTime = GetTickCount
DataC = Comm.InBufferCount: Resv = Comm.Input
For IntR = 0 To DataC - 1
CTestData(FactCount) = Resv(IntR)
FactCount = FactCount + 1
DoEvents
Next IntR
End If
DoEvents
Endif
Do While Comm.InBufferCount = 0 '无数据则测试结束
debug.print "实验结束"
TestFlag = ture
Exit Do
Loop
if TestFlag then Exit do
Exit Sub
------解决方案--------------------
嘿嘿 的确是发重了
对于通信质量要求高或者数据量偏大的应用,不建议用 Comm_OnComm()
建议:
用双Timer实现。一个管收数据,一个管发数据。建立自己的缓冲区,不间断的接收所有的数据,知道发送端发送完毕。
------解决方案--------------------
试一试这个,看看有没有丢失信息的情况,如果没有,依照这个代码写自己的程序即可。
http://download.****.net/source/1262066
------解决方案--------------------
初学串口通讯,望大家多多指教,请问用多线程解决会不会好些?
------解决方案--------------------
具体点?那就给你看一段简单的单片机串口通讯时的处理过程吧
当上位机(电脑软件)与下位机(单片机)通讯时,上位机总不能将下位机发送的数据(十六进制)全部接受,每次通讯数据量在10万以下,vb的 mscoom控件的InBufferSize属性的最大值为32767,大于此值可能会溢出,但奇怪的是当小于此值时也会丢,请问丢哪里了,期待赐教!!!
以下是电脑软件程序的部分代码:
Private Sub Comm_OnComm()
Dim IntR as integer
Static Resv As Variant '接收数据
Static DataC As Long '串口数据字节数
Static CTestData() As Byte'用于存放接受的字符
Static FactCount As Long '累计实际接收的数据
static TestFlag Boolean'实验结束标志
TestFlag = false
Comm.RThreshold = 0
FactCount = 0
DataC = Comm.InBufferCount: Resv = Comm.Input
ReDim CTestData(100000)
For IntR = 0 To DataC - 1
CTestData(IntR) = Resv(IntR)
FactCount = FactCount + 1
Next IntR
Static CurrTime As Long '等待时间
CurrTime = GetTickCount
'一直接受数据,直到接受完成为止
do
If Comm.InBufferCount >= 1000 Or Abs(GetTickCount - CurrTime) >= 100 Then
CurrTime = GetTickCount
DataC = Comm.InBufferCount: Resv = Comm.Input
For IntR = 0 To DataC - 1
CTestData(FactCount) = Resv(IntR)
FactCount = FactCount + 1
DoEvents
Next IntR
End If
DoEvents
Endif
Do While Comm.InBufferCount = 0 '无数据则测试结束
debug.print "实验结束"
TestFlag = ture
Exit Do
Loop
if TestFlag then Exit do
Exit Sub
------解决方案--------------------
嘿嘿 的确是发重了
对于通信质量要求高或者数据量偏大的应用,不建议用 Comm_OnComm()
建议:
用双Timer实现。一个管收数据,一个管发数据。建立自己的缓冲区,不间断的接收所有的数据,知道发送端发送完毕。
------解决方案--------------------
试一试这个,看看有没有丢失信息的情况,如果没有,依照这个代码写自己的程序即可。
http://download.****.net/source/1262066
------解决方案--------------------
初学串口通讯,望大家多多指教,请问用多线程解决会不会好些?
------解决方案--------------------
具体点?那就给你看一段简单的单片机串口通讯时的处理过程吧
- C/C++ code
void COM_Event () interrupt 4 { unsigned char dat = 0; unsigned char NXorData = 0; if(RI == 1){ //接收数据 SBUF 为单片机的接收发送缓冲寄存器 dat = SBUF; RI = 0; // 这里分析你收到的信息,同事可做出反应 switch(CApproach){ case 0: // 数据包头 if(dat==0xB2){ CApproach = 1; } break; case 1: // 机号 if(dat==MyNumber){ CApproach = 2; }else{ CApproach = 0; } break; case 2: // 命令 if(dat>=1&&dat<=7){ CCommand = dat; CApproach = 3; }else{ CApproach = 0; } break; case 3: // 命令参数 switch(CApproach){ case 1: // 探测设备命令,无参数 CXorCount = dat; CApproach = 255; break; case 2: // 开启通讯监视,无参数 CXorCount = dat; CApproach = 255; break; case 3: // 关闭通讯监视,无参数 CXorCount = dat; CApproach = 255; break; default: CApproach = 0; break; } break; case 255: // 接收包尾 if(dat==0xB3){ switch(CCommand){ case 1: // 探测设备命令需要进行异或校验 NXorData = 0xB2; NXorData = NXorData^MyNumber; NXorData = NXorData ^ CCommand; if(NXorData==CXorCount){ SendBufToPort("LTC-20100409A",13); }else{ CApproach = 0; } break; case 2: // 开启通讯监视命令需要进行异或校验 NXorData = 0xB2; NXorData = NXorData^MyNumber; NXorData = NXorData ^ CCommand; if(NXorData==CXorCount){ AddMinute = 0; AddSecond = 0; AddMillisecond = 0; AddMicrosecond = 0; Approach = 1; SendBufToPort("Open stakeout.",14); }else{ CApproach = 0; } break; case 3: // 关闭通讯监视命令需要进行异或校验 NXorData = 0xB2; NXorData = NXorData^MyNumber; NXorData = NXorData ^ CCommand; if(NXorData==CXorCount){ Approach = 0; AddMinute = 0; AddSecond = 0; AddMillisecond = 0; AddMicrosecond = 0; SendBufToPort("Close stakeout.",14); }else{ CApproach = 0; } break; default: CApproach = 0; break; } }else{ CApproach = 0; } break; } }else{ TI = 0; } }