最近在编写一个数据采集程序,需要连接的设备较多,MSCOMM的串口号限制到15 怎样才能突破这个限制?
本想采用API来做串口,但是不知道怎样用API来实现MSCOMM的ONCOMM事件机制。
因为如果采用定时器轮询,由于串口数量较多,同时对于数据采集的时间要求比较严格,所以无法实现。
saxcomm控件因为要求注册,所以无论是否有注册码都无法正常使用。

解决方案 »

  1.   

    多串口卡是物理上的多串口,MOXA的多串口卡也用过。但是那个本机上还是要建立串口的。程序中一样要开启通道。
    一对多行不通,因为这里每个串口要对应一个设备,该设备的通讯层上就决定了是一对一的结构。
      

  2.   

    自己用api做个comm控件,在控件里定时查询收到的数据。这样每个控件都有专门的数据接收检查。就无需每个串口轮询了。
      

  3.   

    定时是不可行的,因为数据的接收时间是到毫秒级的。目前用mscomm控件是不考虑传输的时间间隔。同时每秒钟都有20多组数据进来。定时查询的话时间间隔太小系统撑不住,太大的话数据已经不可用了。
      

  4.   

    把缓冲区设大一点就可以了。另外参考一下mscomm的写法,也弄个触发机制,貌似要截获底层硬件中断,这个比较麻烦。
      

  5.   

    刚才找了个API的触发机制的例子看了下,总是出现问题,在第一次打开串口的时候没有问题,关闭后再打开就不行了。查看问题出错在createfile中,返回值-1
    ComNum = CreateFile(ComNumber, &HC0000000, 0, 0, 3, 0, 0)
        If ComNum = -1 Then
            MsgBox "Com Port " & ComNumber & " not available. Use Serial settings (on the main menu) to setup your ports.", 48
            InitCom = False
            Exit Function
        End If
    关闭串口的代码如下:
    这是关闭串口的函数---
    Public Function FinCom()
    On Error Resume Next
        CommTime.Enabled = False
        Set CommTime = Nothing
        FinCom = CloseHandle(ComNum)
        ComIsOpen = False
        If Err.Number <> 0 Then Err.Clear
    End Function
    调用该函数----
                ARCComm1.FinCom
                SetControllsLockStatus "CLOSE", True
                SetControllsLockStatus "OPEN", False
      

  6.   

    <marquee onstart = "javascript:Now();" direction=up width=15 scrollamount=10>up</marquee>