CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

串口通讯,在接收信息时,为什么总是接收不了,并且提示:超时间 呢?

楼主David2008(阿权)2005-06-01 13:59:55 在 VB / 基础类 提问

'====================================================================================  
          '信息接收  
          '====================================================================================  
   
          '设定要接收的数据长度  
          intGetDataLen   =   5  
   
          '超时时间计算:字节数×每个字节的传输时间×10                           9600为波特率   请根据实际设定  
          sngTimeSpace   =   intGetDataLen   *   (11000#   /   9600#)   *   10#  
   
          sngTime   =   GetCurrentTime()                                                     '  
   
          Do   While   True                                                                     '数据接收  
   
                  DoEvents  
                  If   MSComm1.InBufferCount   >=   intGetDataLen   Then   Exit   Do  
   
                  '超时处理  
                  If   Abs(GetCurrentTime()   -   sngTime)   >   sngTimeSpace   Then         '超时  
                          SendData   =   1        
                          Form2.Caption   =   GetCurrentTime   'sngTime     sngTimeSpace  
                          Exit   Function  
                  End   If  
          Loop  
   
   
  为什么If   MSComm1.InBufferCount   >=   intGetDataLen   Then   Exit   Do这句总是执行不了。  
  而,                 If   Abs(GetCurrentTime()   -   sngTime)   >   sngTimeSpace   Then         '超时  
  这句总是为真,     Abs(GetCurrentTime()   -   sngTime)   值,随便就是几千,而sngTimeSpace值却为57  
   
  。。。。。。  
   
  问题点数:20、回复次数:9Top

1 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-06-01 14:51:23 得分 20

用事件驱动方式呢?mscomm_oncome事件Top

2 楼dobest1204(人生不过百年,何不放手一博)回复于 2005-06-01 15:52:01 得分 0

getcurrenttime()返回的时间以什么为单位,sngtime是什么类型的变量?Top

3 楼David2008(阿权)回复于 2005-06-01 16:12:53 得分 0

其实   是别人的原代码  
   
  如下:  
   
  '**                 :-------------------------------------------------------  
  '**                 :示例说明  
  '**                 :  
  '**                 :该示例程序模拟PC机与一终端(下位机)串口通信,PC机先向下位机发送五个字节,下位机  
  '**                 :收到数据后也返回送五个字节的确认命令  
  '**                 :  
  '**                 :                   字头     站号     副本     命令     副本  
  '**                 :帧   结   构:AC         01         01         0A         0A                       正副本校验方式  
  '**                 :  
  '**                 :返   回   帧:AC         01         01         AA         AA                       响应命令,表示终端接收到数据  
  '**                 :-------------------------------------------------------  
  '**版         本:V1.0.0  
  '*************************************************************************  
  Option   Explicit  
  Private   Declare   Function   GetCurrentTime   Lib   "kernel32"   Alias   "GetTickCount"   ()   As   Long  
   
   
  Private   Sub   cmdSend_Click()  
      Dim   bytData(10)   As   Byte  
      bytData(0)   =   &HA                                                       '数据  
      txtMsg.Text   =   SendData(1,   bytData,   1)             '发送命令  
  End   Sub  
   
  '*************************************************************************  
  '**函   数   名:Form_Load  
  '**输         入:无  
  '**输         出:无  
  '**功能描述:串口初始化  
  '**全局变量:  
  '**调用模块:  
  '**作         者:叶帆  
  '**日         期:2004-09-19  
  '**修   改   人:  
  '**日         期:  
  '**版         本:V1.0.0  
  '*************************************************************************  
  Private   Sub   Form_Load()  
        OpenPort   1                         '打开串口  
  End   Sub  
   
  '*************************************************************************  
  '**函   数   名:OpenPort  
  '**输         入:PortNo(Integer)                                               -   串口号   1,2,3...  
  '**                 :Optional   InBufferSize(Integer   =   1024)   -   接收缓冲区     默认为1024个字节  
  '**                 :Optional   OutBufferSize(Integer   =   512)   -   发送缓冲区     默认为512个字节  
  '**输         出:0   打开串口成功   1   打开串口失败  
  '**功能描述:打开串口  
  '**全局变量:  
  '**调用模块:  
  '**作         者:叶帆  
  '**日         期:2003年12月17日  
  '**修   改   人:  
  '**日         期:  
  '**版         本:V1.0  
  '*************************************************************************  
  Public   Function   OpenPort(PortNo   As   Integer,   Optional   InBufferSize   As   Integer   =   1024,   Optional   OutBufferSize   As   Integer   =   512)   As   Long  
        On   Error   GoTo   ErrExit  
          MSComm1.CommPort   =   PortNo                                       '采用COM端口  
          MSComm1.Settings   =   "9600,n,8,1"  
          MSComm1.InputMode   =   comInputModeBinary             '采用二进制传输  
          MSComm1.NullDiscard   =   False                                   'NULL字符从端口传送到接受缓冲区  
          MSComm1.DTREnable   =   False                                       'DTR线无效  
          MSComm1.EOFEnable   =   False                                       '不寻找EOF符  
          MSComm1.RTSEnable   =   False                                       'RTS线无效  
          MSComm1.InBufferCount   =   0                                       '清空接受缓冲区  
          MSComm1.OutBufferCount   =   0                                     '清空传输缓冲区  
          MSComm1.SThreshold   =   1                                             '如果传输缓冲区完全空时产生MSComm事件  
          MSComm1.RThreshold   =   0                                             '不产生MSComm事件  
          MSComm1.InBufferSize   =   InBufferSize                   '接收缓冲区     默认为1024个字节  
          MSComm1.OutBufferSize   =   OutBufferSize               '发送缓冲区     默认为512个字节  
          MSComm1.PortOpen   =   True                                           '打开端口  
          OpenPort   =   0  
        Exit   Function  
  ErrExit:  
        OpenPort   =   1  
  End   Function  
  '*************************************************************************  
  '**函   数   名:ClosePort  
  '**输         入:无  
  '**输         出:无  
  '**功能描述:关闭串口  
  '**全局变量:  
  '**调用模块:  
  '**作         者:叶帆  
  '**日         期:2003年12月15日  
  '**修   改   人:  
  '**日         期:  
  '**版         本:V1.0  
  '*************************************************************************  
  Public   Sub   ClosePort()  
        On   Error   GoTo   ErrExit  
            MSComm1.PortOpen   =   False                                             '关闭端口  
        Exit   Sub  
  ErrExit:  
         
  End   Sub  
   
  '*************************************************************************  
  '**函   数   名:SendData  
  '**输         入:bytAddr(Byte)       -   设备地址(0~255)  
  '**                 :bytData()(byte)   -   数据数组  
  '**                 :bytNum(byte)         -   数据个数(1~256/数据类型的长度)  
  '**输         出:(Long)   -   0   成功   1   -超时     2   -   接收的数据有误     3   -   其它未知错误  
  '**功能描述:发送数据  
  '**全局变量:  
  '**调用模块:  
  '**作         者:叶帆  
  '**日         期:2004年05月19日  
  '**修   改   人:  
  '**日         期:  
  '**版         本:V1.0  
  '*************************************************************************  
  Public   Function   SendData(bytAddr   As   Byte,   bytData()   As   Byte,   Optional   bytNum   As   Byte   =   1)   As   Long  
          On   Error   GoTo   ErrExit  
   
          Dim   bytSendArray()   As   Byte                                           '发送数据缓冲区  
          Dim   intGetDataLen   As   Integer                                       '要接收的数据长度  
          Dim   sngTimeSpace   As   Single                                           '延时时间  
          Dim   sngTime   As   Single  
          Dim   bytReceiveArray()   As   Byte                                     '接收的数据  
          Dim   VarReceiveData   As   Variant                                     '接收的变体数据  
   
          Dim   i   As   Long  
   
          ReDim   bytSendArray(0   To   bytNum   *   2   +   2)   As   Byte     '发送数据缓冲区  
   
          bytSendArray(0)   =   &HAC                                                   '同步字头  
          bytSendArray(1)   =   bytAddr                                             '下位机地址  
          bytSendArray(2)   =   bytAddr                                             '副本  
   
          '数据  
          For   i   =   0   To   bytNum   *   2   -   1   Step   2  
                  bytSendArray(i   +   3)   =   bytData(i   /   2)  
                  bytSendArray(i   +   4)   =   bytData(i   /   2)  
          Next  
   
          '=====================================================================================  
          '信息发送  
          '=====================================================================================  
          MSComm1.InBufferCount   =   0                                             '清空接收缓冲区  
          MSComm1.Output   =   bytSendArray                                     '发送数据  
   
          Do  
                  DoEvents  
          Loop   Until   MSComm1.OutBufferCount   =   0                     '等待,直到数据发送完毕  
   
          '=====================================================================================  
          '信息接收  
          '=====================================================================================  
   
          '设定要接收的数据长度  
          intGetDataLen   =   5  
   
          '超时时间计算:字节数×每个字节的传输时间×10                           9600为波特率   请根据实际设定  
          sngTimeSpace   =   intGetDataLen   *   (11000#   /   9600#)   *   10#  
   
          sngTime   =   GetCurrentTime()                                                     '  
   
          Do   While   True                                                                     '数据接收  
   
                  DoEvents  
                  If   MSComm1.InBufferCount   >=   intGetDataLen   Then   Exit   Do  
   
                  '超时处理  
                  If   Abs(GetCurrentTime()   -   sngTime)   >   sngTimeSpace   Then         '超时  
                          SendData   =   1  
                          Exit   Function  
                  End   If  
   
          Loop  
   
          VarReceiveData   =   MSComm1.Input  
          bytReceiveArray   =   VarReceiveData  
   
          '返回帧校验  
          SendData   =   2                                                 '先赋值接收的数据错误  
          If   bytReceiveArray(0)   =   &HAC   Then       '字头  
                  '帧数据是否正确(正副本校验)  
                  If   bytReceiveArray(1)   =   bytReceiveArray(2)   And   bytReceiveArray(3)   =   bytReceiveArray(4)   Then  
                          '站号,命令判断  
                          If   bytReceiveArray(1)   =   bytSendArray(1)   And   bytReceiveArray(3)   =   &HAA   Then  
                                  SendData   =   0                                 '命令正确  
                          End   If  
                  End   If  
          End   If  
   
  Exit   Function  
   
  ErrExit:  
          SendData   =   3  
  End   Function  
   
  '*************************************************************************  
  '**函   数   名:Form_Unload  
  '**输         入:Cancel(Integer)   -  
  '**输         出:无  
  '**功能描述:结束处理  
  '**全局变量:  
  '**调用模块:  
  '**作         者:叶帆  
  '**日         期:2004-09-19  
  '**修   改   人:  
  '**日         期:  
  '**版         本:V1.0.0  
  '*************************************************************************  
  Private   Sub   Form_Unload(Cancel   As   Integer)  
        ClosePort     '关闭串口  
  End   Sub  
  Top

4 楼dobest1204(人生不过百年,何不放手一博)回复于 2005-06-01 17:08:19 得分 0

楼主的串口有数据可以接受么,如果没有If   MSComm1.InBufferCount   >=   intGetDataLen   Then   Exit   Do这句当然不会执行到,Abs(GetCurrentTime()   -   sngTime)   的   值单位可能是毫秒吧,按说也不应该是几千啊,Top

5 楼Winters_lee(其实我真的叫迪米亚路)回复于 2005-06-01 17:11:57 得分 0

getCurrentTime   是得到当前的时间的毫秒数,也就是说从0点到现在经过的毫秒数,注意是毫秒数,楼主你可以该超时时间的,在:sngTimeSpace   =   intGetDataLen   *   (11000#   /   9600#)   *   10#这里可以直接给sngTimeSpace   赋值,sngTimeSpace   =   500,即设定超时时间为500毫秒,这是叶帆的代码,比较经典啦.你也可以像楼上   DooDu(杜霖:I   want,I   can.(MmMVP马甲))   说的,用OnComm事件,那样比较可靠.  
   
  Top

6 楼tmran(Rocky 爱瘦鱼)回复于 2005-06-01 21:26:28 得分 0

MarkTop

7 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-06-01 21:39:33 得分 0

Private   Sub   Form_Load()  
   
    MSComm1.CommPort   =   1  
    MSComm1.InputLen   =   0         '设置每次从串口缓冲区取的字节为全部  
    MSComm1.InputMode   =   comInputModeBinary  
    MSComm1.Settings   =   "9600,n,8,1"  
    MSComm1.PortOpen   =   True   '打开串口  
     
  End   Sub  
   
  Private   Sub   MSComm1_OnComm()   '串口中断  
  Dim   InData   as   String  
   
  Select   Case   MSComm1.CommEvent   '选择事件  
   
  Case   comEvReceive   '接收到字符  
   
                  Dim   InByte()   As   Byte   '定义一个二进制指针放接收到的数据  
                  InByte   =   MSComm1.Input   '数据转移到指针  
   
                  Dim   j   As   Long  
               
                    For   j   =   0   To   UBound(InByte)   '循环到指针上标  
   
                          inData   =   inData   &   Hex(InByte(j))   &   "   "   '取出一个字节换为16进制显示用  
                     
                    Next   j  
    DoEvents  
   
          Text1.Text   =   inData   '将刚收到的字符串显示出来  
          inData   =   ""  
          Text1.SelStart   =   Len(Text1.Text)   '光标置后  
   
  Case   comEventRxOver   '接收缓冲区满的处理  
      MsgBox   "接收缓冲区满了!"   '发出警告  
  End   Select  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
      MSComm1.PortOpen   =   0  
  End   SubTop

8 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-06-01 21:40:53 得分 0

这个是接收后转为十六进制显示,你可以自己改成chr()显示你发的字符  
  发送和上面的一样。  
  Top

9 楼Winters_lee(其实我真的叫迪米亚路)回复于 2005-06-02 18:07:16 得分 0

DooDu(杜霖:I   want,I   can.(MmMVP马甲))   这位大爷已经写得很清楚了,相信你不会有什么不明白的地方了!Top

相关问题

  • 急!!!!串口通讯接收数据
  • 关于串口通讯接收数据的问题
  • 一个串口通讯程序接收的问题,寻求帮助!!!
  • 关于串口通讯接收数据的一个很奇怪的问题!
  • 串口通讯
  • 串口通讯!!!
  • 串口通讯
  • 串口通讯
  • 关于串口通讯中的ComStat.cbInQue是否能正确反映的串口接收到的字节个数
  • 使用MSComm控件来串口通讯,关于接收多字节时候会截断的问题

关键词

  • 数据
  • sngtime
  • 接收
  • sngtimespace
  • getcurrenttime
  • intgetdatalen
  • 超时
  • bytdata
  • 命令
  • mscomm

得分解答快速导航

  • 帖主:David2008
  • DooDu

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo