我在Form_load时,加载MSComm控件的基本属性:端口号,setting,缓存区大小等等
在点击Command按钮时,打开端口,发送数据
在CommEvent=2时,接收数据
请教,我不想再用一个command来关闭端口,想在一次通讯完成后,或者通讯故障时关闭端口,并清空缓存区里的数据。我该怎么做?也就是说,什么事件或者什么标志了通讯完成或通讯错误,可以关闭端口、清空缓存取得数据了?请指点,谢谢!

解决方案 »

  1.   

    判断CommEvent属性,具体请参阅http://www.360doc.com/content/10/0602/23/339365_30956352.shtml
      

  2.   

    那LZ所指一次通信完成是发送完成?接收完成?哪类通信故障?按我的理解可以在打开端口发送数据后使用Sleep延迟(适当),直接读接收缓冲区后关闭端口就行了.
    上述可在同一按钮click事件中执行.
      

  3.   

    自己设置协议,比如收到theEnd则可以关闭。
    如果处理错误,则用on error goto 来处理。
      

  4.   

    还有就是关闭的时候,除了端口关闭,还要做点什么,请说得具体一点。因为我才开始接触MSComm控件,谢谢!
      

  5.   

    COM 口就像电视机的信号线一样,只要硬件连上、通电就一直在工作。MSComm控件只要加载了,就一直在和硬件进行交互,并不存在关闭端口的功能、也没这个必要。
    当发生通讯错误时,通常是硬件故障,并不能通过软件进行排除,所以程序只需要等待硬件故障的排除。
    最多将当前已收到的不完整数据清除,你可以设置 InBufferCount = 0 直接清除接收缓冲区。
    必要时用 OutBufferCount = 0 将输出缓冲区也清一下。
      

  6.   

    Winsock.Close即清理了所有。如果不放心,就做8楼老鸟说的那些
      

  7.   

    我整理了自己的思路:再请各位高手帮我看一下,我的思路有没有问题,谢谢!
    设备情况是:计算机通过串口和一台很老式打印机通讯,我按照打印机的命令格式给他发指令和打印内容。打印机接收数据后返回几种不同的数据,有的表示接收成功,有的表示接受失败。
    我的vb程序设计是:(发帖子的目的就是不清楚自己什么时候关闭端口,和关闭端口的时候要做点什么)
    1、界面:text1作为发送文本框。Command1作为发送按钮。text2作为接收文本框。再加上MSComm控件。2、Form_load事件,加载:
    MSComm1.CommPort=4
    MSComm1.Setting="9600,e,8,1"
    MSComm1.InputMode=0
    MSComm1.InBufferSize=1024
    MSComm1.InBufferCount=0
    MSComm1.RThreshold=1
    MSComm1.OutBufferSize=512
    MSComm1.OutBufferCount=0
    MSComm1.Sthreshold=1

    End Sub3、Command_click事件:
    If MSComm1.PortOPen Then
    MSComm1.Output=text1  (假设text1已经做过了数据处理,满足喷印机要求的格式,以及偶校验)
    Else
    MSComm1.PortOPen=True
    MSComm1.Output=text1.text 
    End Sub4、MSComm1_OnComm事件:问题主要在这里
    Select Case MSComm1.CommEvent
    Case comEvSend  (由于前面MSComm1.Sthreshold=1)
         MsgBox"发送数据完毕"
    Case comEvReceive(由于前面MSComm1.Rthreshold=1)
         MSComm1.InputLen=0
         abc=MSComm1.Input
         a()=abc
         做一些处理,将接收内容放进text2中
    MSComm1.PortOPen=False  (参考3楼的意见,接收成功或者失败都关闭端口)
    MSComm1.InBufferCount=0
    MSComm1.OutBufferCount=0 (关闭端口时,是不是要清空缓存区数据,还要做其他事情吗?)
    Case 其他错误省略
         MsgBox"失败"
    MSComm1.PortOPen=False  (参考3楼的意见,接收成功或者失败都关闭端口)
    MSComm1.InBufferCount=0
    MSComm1.OutBufferCount=0 (关闭端口时,是不是要清空缓存区数据,还要做其他事情吗?)
    End Select
    End Sub这样设计可不可以?请大家指点一下,初次使用这个空间,看了一些资料了但是心里没把握。
      

  8.   

    提醒LZ
    1)OnComm事件中不要使用MsgBox消息,会干扰串口通信.
    2)设置 PortOpen 属性为 True 打开端口。设置为 False 关闭端口并清除接收和传输缓冲区。当应用程序终止时,MSComm 控件自动关闭串行端口。
      

  9.   

    这个通讯结束,成功与否都可以靠协议来判断啊,在每帧数据里加上CRC校验不就知道最后数据是否正确和完整了吗,然后根据判断进行你想要的操作
      

  10.   

    所谓的端口打开和关闭其实只是程序是否对硬件资源的独占。外设(打印机)其实是一直待机的。
    如果不是需要切换到其他程序进行打印机操作,不停开关端口并不能特别的任何好处。
    你只要管好两个缓冲区就行了:
    Sthreshold=1 虽然每发送一个字节都有 OnComm 事件,但是只要检查 OutBufferCount 是否为 0 就能判断是否全部发送。
    Rthreshold=1 虽然每接收一个字节都有 OnComm 事件,但是只要检查 InBufferCount 就能判断是否收到了预期长度的回复。 
      

  11.   

    明白了,谢谢!明天到现场,用打印机做实验。就用OutBufferCount和InBufferCount试试。
      

  12.   

    意思就是,做实验的时候,看看OutBufferCount和InBufferCount的变化情况