10  OPEN"cOMM2:4800,N,8,1,CD0,DS0,CS0" FOR RANDOM AS #1
100 'MAIN LOOP
110 PRINT #1,"SERS=AUTO"
130 PRINT #1, "UN=C"
120 K$=INKEY$:IF K$>CHR$(34) GOTO 300
220 LINE INPUT #1,A$
230 PRINT A$
240 K$=INKEY$:IF K$>CHR$(34) GOTO 300
250 GOTO 100
300 'END PROGRAM
310 CLOSE
320 ENDVB 代码
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'Dim cl As String
'初始化
Private Sub Form_Load()
   'Dim cl As String
    MSComm1.CommPort = 1
    MSComm1.Settings = "4800,n,8,1"    MSComm1.InputLen = 0
    MSComm1.PortOpen = True             '打开串口
    MSComm1.InBufferCount = 0           '清除发送缓冲区数据
    MSComm1.OutBufferCount = 0          '清除接收缓冲区数据
    MSComm1.InputMode = 0
    MSComm1.RThreshold = 1
   
    MSComm1.Output = "SERS=AUTO"                  '发送控制命令
    MSComm1.Output = "UN=C"
    
End Sub'串口中断处理
Private Sub MSComm1_OnComm()
    
    Dim in_data As String
    Dim chanel As String
    
     
    Select Case MSComm1.CommEvent       '判断MSComml通讯事件
        Case comEvReceive               '收到Rthreshold个字节产生的接收事件
             
            Sleep (100)
            Buffer = MSComm1.Input
            Text1.Text = Buffer
        Case Else
    
            MsgBox "出错啦!"
           
     End Select
  
End Sub在QB中运行正确,而VB运行没有反应呢?

解决方案 »

  1.   

    Sleep (100) 先注释掉,再加一句debug.print,看看内容是否发到了设备.另外,可以使用串口调试软件,看看你发出的内容与QB程序发出的内容是否一样.
      

  2.   

    发送的是控制命令吧
    MSComm1.CommPort = 1 '你确定是com1口?MSComm1.RThreshold = 1 '若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件,如果设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
    MSComm1.RTSEnable = True '确定是否使 Request To Send (RTS) 线有效。一般情况下,由计算机发送 Request To Send 信号到联接的调制解调器,以请示允许发送数据。
    '当 RTSEnable 设置为 True,端口打开时,Request To Send 线设置为高电平,端口关闭时,设置为低电平。
    'Request To Send 线用在 RTS/CTS 硬件握手。RTSEnable 属性允许手动检测 Request To Send 线以确定其状态。MSComm1.SThreshold = 1 '在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
    '若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。
    '若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
    '如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。
    'comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。
    '例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。
    '如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。'没有以上三行(默认设置)就不能收到返回的信息,也不能接收短信
    MSComm1.CommPort = 4 '设置端口号码,控件手工设置无效,必须重新指定
    MSComm1.Settings = "9600,N,8,1" '9600波特,无奇偶校验,8位数据,一个停止位,可省略
    MSComm1.PortOpen = True '打开端口,不,可省略MSComm1.Output = "AT" & vbCr '告诉MODEM发送的是AT命令
    MSComm1.Output = "SERS=AUTO" & vbCr
    MSComm1.Output = "UN=C" & vbCr
      

  3.   

    [code=VBMSComm1.Output = "AT" & vbCr '告诉MODEM发送的是AT命令
    MSComm1.Output = "SERS=AUTO & vbCr
    MSComm1.Output = "UN=C" & vbCr[/code]
      

  4.   

    VBMSComm1.Output = "AT" & vbCr '告诉MODEM发送的是AT命令 
    MSComm1.Output = "SERS=AUTO & vbCr 
    MSComm1.Output = "UN=C" & vbCr
      

  5.   

    Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    '初始化
    Private Sub Form_Load()
      'Dim cl As String
        MSComm1.CommPort = 1
        MSComm1.Settings = "4800,n,8,1"    MSComm1.InputLen = 0
        MSComm1.PortOpen = True            '打开串口
        MSComm1.InBufferCount = 0          '清除发送缓冲区数据
        MSComm1.OutBufferCount = 0          '清除接收缓冲区数据
        MSComm1.InputMode = 0
        MSComm1.RThreshold = 1
      
        MSComm1.Output = "SERS=AUTO"                  '发送控制命令
        MSComm1.Output = "UN=C"
        
    End Sub
    '串口中断处理
    Private Sub MSComm1_OnComm()
        
        Dim in_data As String
        Dim chanel As String
        Dim Buffer As String
        
        Select Case MSComm1.CommEvent      '判断MSComml通讯事件
            Case comEvReceive              '收到Rthreshold个字节产生的接收事件
                Sleep (100)
                Buffer = MSComm1.Input
                Text1.Text = Buffer
            Case Else
                MsgBox "出错啦!"
        End Select
      
    End Sub
      

  6.   

    啊?2-3短连?,我用QBasic写的时候是不短连的啊。
      

  7.   

    myjian,我用串口调试软件查看了发送的是SERS=AUTO  UN=C。但是不知道怎么看QB里是发的什么?不熟悉QB。
      

  8.   

    代码放到那段[XXX]  [/XXXX]中间就能高亮了.QB的程序写的是端口,应该也可以拦截,你使用超级单片机工具里的串口监视功能看看.如果两边发送的内容不同,则需要先将这个内容统一,再说后话.
      

  9.   

    myjian,我用超级单片机工具看了,确实发送出去的内容不一样。
    QB是这样的:
    31 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 8: SC1:  95
    32 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    33 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    34 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    35 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    36 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 8: 5.15713 
    37 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    38 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    39 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    40 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    41 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 2: C.
    42 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    43 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    44 9:19:29 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0: 
    45 9:19:29 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0    
    46 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: S
    47 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: E
    48 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: R
    49 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: S
    50 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: =
    51 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: A
    52 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: U
    53 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: T
    54 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: O
    55 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
    56 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: U
    57 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: N
    58 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: =
    59 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: C
    60 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
      

  10.   

    而VB运行后是这样的,而且只捕捉到一次发送:
    1 9:23:25 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: 
    2 9:23:25 VB6.EXE IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS  
    3 9:23:25 VB6.EXE IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
    4 9:23:25 VB6.EXE IRP_MJ_CLEANUP Serial0 SUCCESS  
    5 9:23:25 VB6.EXE IRP_MJ_CLOSE Serial0 SUCCESS  
    6 9:23:26 VB6.EXE IRP_MJ_CREATE Serial0 SUCCESS Options: Open 
    7 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    8 9:23:26 VB6.EXE IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 1024 OutSize: 512
    9 9:23:26 VB6.EXE IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
    10 9:23:26 VB6.EXE IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
    11 9:23:26 VB6.EXE IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS  
    12 9:23:26 VB6.EXE IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS  
    13 9:23:26 VB6.EXE IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS  
    14 9:23:26 VB6.EXE IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS  
    15 9:23:26 VB6.EXE IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS  
    16 9:23:26 VB6.EXE IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS  
    17 9:23:26 VB6.EXE IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS  
    18 9:23:26 VB6.EXE IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS  
    19 9:23:26 VB6.EXE IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
    20 9:23:26 VB6.EXE IOCTL_SERIAL_SET_DTR Serial0 SUCCESS  
    21 9:23:26 VB6.EXE IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
    22 9:23:26 VB6.EXE IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
    23 9:23:26 VB6.EXE IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:9 Replace:80 XonLimit:256 XoffLimit:256
    24 9:23:26 VB6.EXE IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: RXABORT RXCLEAR
    25 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    26 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    27 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    28 9:23:26 VB6.EXE IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT TXCLEAR 
    29 9:23:26 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    30 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    31 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    32 9:23:26 VB6.EXE IRP_MJ_WRITE Serial0 SUCCESS Length 9: SERS=AUTO
    33 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    34 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    35 9:23:26 VB6.EXE IOCTL_SERIAL_GET_PROPERTIES Serial0 SUCCESS  
    36 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    37 9:23:26 VB6.EXE IRP_MJ_WRITE Serial0 SUCCESS Length 6: UN = C
    38 9:23:26 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS  
    39 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    40 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    41 9:23:26 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK Serial0    
    42 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
    43 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS  
      

  11.   

    那这样试试,将发送的内容以字节形式发送:    MSComm1.Output = "SERS=AUTO"                  '发送控制命令 
        MSComm1.Output = "UN=C" 改为:dim Buff() as byte    buff()=strconv("SERS=AUTO",vbfromunicode)
        MSComm1.Output = buff()                  '发送控制命令 
        buff()=strconv("UN=C",vbfromunicode)
        MSComm1.Output = buff() 
      

  12.   

    还是不对啊,运行后没有反应,Comm还需要怎样设置吗?比如DTREnable,RTSEnable。
      

  13.   

    MSComm1.RThreshold = 1这个只要不为0,就会在收到指定数量的字节数据后触发OnComm事件.你先把发送的搞正确了再说......从串口拦截到的输出内容是否正确?
      

  14.   

    QB拦截到的是这样
    46 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: S 
    47 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: E 
    48 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: R 
    49 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: S 
    50 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: = 
    51 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: A 
    52 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: U 
    53 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: T 
    54 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: O 
    55 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: . 
    56 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: U 
    57 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: N 
    58 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: = 
    59 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: C 
    60 9:19:29 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: . 
    VB拦截到的是
    32 9:23:26 VB6.EXE IRP_MJ_WRITE Serial0 SUCCESS Length 9: SERS=AUTO 
    33 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS 
    34 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS 
    35 9:23:26 VB6.EXE IOCTL_SERIAL_GET_PROPERTIES Serial0 SUCCESS 
    36 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    37 9:23:26 VB6.EXE IRP_MJ_WRITE Serial0 SUCCESS Length 6: UN = C 
    38 9:23:26 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS 
    39 9:23:26 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS 
    40 9:23:26 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING 
    应该也是发送对了的啊。怎么不正确呢?
      

  15.   

    这个是不是不能用MSComm控件实现啊?哪位帮忙解一下啊。
      

  16.   

    LZ:你QB的代码发送的是:
    "SERS=AUTO" & Chr(13) & "UN=C" & Chr(13)
    那么VB的代码如下:
    Option Explicit
        Dim Buffer As String
    Private Sub Command1_Click()
        MSComm1.Output = "SERS=AUTO" & Chr(13) & "UN=C" & Chr(13)                  '发送控制命令
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "4800,n,8,1"
        MSComm1.InputLen = 0
        MSComm1.PortOpen = True            '打开串口
        MSComm1.InBufferCount = 0          '清除发送缓冲区数据
        MSComm1.OutBufferCount = 0          '清除接收缓冲区数据
        MSComm1.InputMode = 0
        MSComm1.RThreshold = 1
    End Sub
    '串口中断处理
    Private Sub MSComm1_OnComm()
        Dim in_data As String
        Dim chanel As String
        Select Case MSComm1.CommEvent      '判断MSComml通讯事件
            Case comEvReceive              '收到Rthreshold个字节产生的接收事件
                Buffer = Buffer & MSComm1.Input
                Text1.Text = Buffer
            'Case Else
                'MsgBox "出错啦!"
        End Select
    End Sub
      

  17.   

    我也告诉他& Chr(13)
    他不听
      

  18.   

    zdingyun你的方法可以啊。非常感谢啊。为什么要加& Chr(13)呢。getemail,你说的是加&vbcr,我试了不行的。
      

  19.   

    & vbCr是回车加换行,可能是协议规定的不一样吧
    我的代码是从我自己写的程序里抠出来的
    是AT命令
      

  20.   

    LZ:
    那是按你的代码在QBASIC下调试获得的.
    Chr(13)是回车符,也即vbCr,其ASCII值是13(16进制为0X0D)
    此外接收代码有改动.