请把1改成:Public Sub TermIrq(ByVal Port As Long)*PComm.dll* <1>
Dim LenT As Long
Dim ch As Long
Dim i As Integer
InPutStr = ""
Do
  LenT = sio_iqueue(Port)
  If LenT Then
      ch = sio_getch(Port)
      InPutStr = InPutStr & Chr(ch)
      If ch = 33 Then
         XY_JX (InPutStr)
         InPutStr = ""
         Exit Sub
      End If
   End If 
Loop Until LenT = 0
另外,PComm.Dll的某个版本支持中断上是有问题的(记不得了)
在做多线程时使用Pcomm.dll不如MSComm.ocx,如果数据量较大时,
速度明显降低

解决方案 »

  1.   

    有时候Sio_Iqueue并不能正确返回,可能它的返回值为1,但是Sio_GetCh()
    的结果为-4。(实际上是没有数据了)
      

  2.   

    kensum():你好
             我的程序中 1 没有什么问题,我的问题是从 TermIrq 过程中收到数据后,交给 XY-JX
    函数处理后在利用事件触发方式通知主程序。但只要程序执行了 TermIrq 过程则 4 不会被触发。但只要不通过 TermIrq 过程比如通过 2,3 则 4 就会被触发。
      

  3.   

    跟踪一下,看你的1过程中有没有执行  XY_JX (InPutStr)
      

  4.   

    问题在于:
     1)如果你把 TermIRQ 作为PComm中断回调函数的话,可能会有问题,
        在PComm的帮助文件中有说明,不要在中断回调函数中读数据。应该
        发送消息到主程序来读数据。否则可能会出错。
     2) LenT 变量在进入循环前被赋值。在循环中没有改变他的地方,如果
        Ch=33的条件不成立(在波特率较高,没有校验,而且串口线较长的
        情况下,很容易出现错误的数据)程序是一个死循环。2,3,4根本
        不会被执行。
      

  5.   

    我把程序改为
    Public Sub TermIrq(ByVal Port As Long)*PComm.dll* <1>
    Dim LenT As Long
    if lent then mcommclass.send
    end sub
    但主程序依旧无反映