首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请问 vb mscoom 通讯为题

2012-01-03 
请教 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.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;    }} 

热点排行