读书人

请问 vb mscoom 通讯为题

发布时间: 2012-01-03 22:16:06 作者: rapoo

请教 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.csdn.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;    }} 

读书人网 >VB

热点推荐