请问有没用delphi 做过脚踏开发的?我想用spcom控件来做,如何来做,我了解下好像是通过检测com口的cts信号,单不成功,望各位给个意见

解决方案 »

  1.   

    spcom可以做,他有一个ReceiveData事件用于接收数据,参数是Sender: TObject; Buffer: Pointer;
      BufferLength: Word软件和硬件间要把握手协议指定好,有的需要应答后才发有效数据,和硬件工程师确定一下握手协议先
      

  2.   

    http://topic.csdn.net/u/20090225/13/72941ca8-c089-4ebb-9c9e-172580d68aed.html
    看看有帮助吗?
      

  3.   

    Rss订阅
    首页 »网络及通讯开发 » 串口的api函数:串口通讯类程序的主要Windows API函数 »正文
    串口的api函数:串口通讯类程序的主要Windows API函数 
    来源: 发布时间:星期三, 2008年7月16日 浏览:81次 评论:0
    编写串口通讯类程序涉及的主要Windows API函数,目前仅做索引而已: 
    1. 打开串口:用CreateFile函数打开。 
    2. 配置串口:用GetCommState (hComm , &dcb) 函数可读取串口设置的当前DCB结构;用GetCommProperties(hComm,lpCommProp)可知端口允许哪些设置;进行相关设置后用SetCommState (hComm , &dcb) 函数保存DCB设置。 
    3. 超时设置:用GetCommTimeouts (hComm , &timeouts) 可得到超时设置的 COMMTIMEOUT结构,作相关超时参数设置后用SetCommTimeouts (hComm , &timeouts) 保存设置。 
    4. 串口读写:用ReadFile函数读取串口数据,如果是异步读取则还需要用GetOverlappedResult函数来完成读取;WriteFile函数向串口写数据;PurgeComm ( hComm,PURGE_TXCLEAR)用于清除串口缓冲区(另参数PURGE_TXABORT中止所有后台写,PURGE_RXABORT中止任何后台读,PURGE_TXCLEAR清除发送缓冲区)。 
    5. 事件驱动I/O:用GetCommMask(hComm,&dwMask)返回可以报告给应用程序的事件(这些事件反映为串口针脚上电平高低的变化);用SetCommMask(hComm,dwMask)设置要等待的一个或多个事件的掩码(比如EV_RING表示测到振铃);用WaitCommEvent(hComm,&dwEvent,&Overlapped)来等待事件发生;额外的EscapeCommFunction函数可直接操纵串口针脚信号(DTR、RTS等) 
    6. 错误处理:用 ClearCommError (hComm,&dwErrorMask,&comstat) 来确定发生的故障,第二个参数包含所发生错误的掩码,第三个参数指向COMSTAT结构,该结构保存端口当前状态的一些有用信息,比如当前接收缓冲区有多少字节数据等等。 
    7. 关闭串口:用CloseHandle (hComm) 关闭。 欢迎大家更正、补充!
    ________________________________________
    嗯,不错 
    ________________________________________
    帮你顶顶 
    ________________________________________
    继续—— 
    关于串口超时的设置,用GetCommTimeouts(hComm,&timeouts)可得到超时设置的COMMTIMEOUT结构,该结构内包括: 
        ReadIntervalTimeout(读区间超时) 
        ReadTotalTimeoutMultiplier(读总超时因子) 
        ReadTotalTimeoutConstant(读总超时常数) 
        WriteTotalTimeoutMultiplier(写总超时因子) 
        WriteTotalTimeoutConstant(写总超时常数)。 总超时时间=总超时因子*要读写的字节数+总超时常数, 
    若设置总超时因子为0,则总超时时间只由总超时常数决定。 区间超时为读取两个字符间的超时设置。 若要使读函数只检测接收队列中处于等待状态的字节数,无字节处于等待则返回,方法是将ReadIntervalTimeout置为MAXDWORD,并将读超时因子和常数设为0 
    ________________________________________
    WaitForSingleObject函数 
    DWORD WaitForSingleObject( 
        HANDLE hHandle, // handle of object to wait for 
        DWORD dwMilliseconds // time-out interval in milliseconds  
      ); 参数说明: 
        hHandle 指定等待的对象。 
        DwMilliseconds 等待的超时时长(ms)。若设置为0,函数检测对象状态并立即返回;若为INFINITE, 则超时时长无限,一直等待对象为有信号状态再返回。 返回值: 
        若函数调用成功,返回以下值: 
          WAIT_ABANDONED  指定对象是一个mutex互斥对象,并且没有被它的宿主线程释放掉(宿主线程已经结束)。此时该互斥对象的所有权将交予调用该等待函数的线程,并且其状态将被设为无信号(nonsignaled)。 
          WAIT_OBJECT_0 指定对象的状态变为有信号(Signaled) 
          WAIT_TIMEOUT 超时. 
        若调用失败,返回WAIT_FAILED。调用GetLastError.可获得错误信息。 WaitForSingleObject函数可用于以下对象: 
    Change notification  由 FindFirstChangeNotification函数返回其对应句柄handle,当指定目录或目录树中发生指定类型的改变时,其状态变为有信号。 
    Console input     当 CreateFile 函数的 CONIN$ 值被指定时返回其句柄(或GetStdHandle函数的返回),当控制台输入缓冲区中有还未读取的内容时其状态为有信号,当输入缓冲区为空时,状态为无信号。 
    Event            CreateEvent 或 OpenEvent 返回其句柄,当调用SetEvent 或 PulseEvent 函数时变为有信号,对manual-reset event(手动复位)对象其状态重置为nonsignaled 通过 ResetEvent 函数,对 auto-reset event(自动复位)对象则在等待函数返回前自动重置为nonsignaled。 Event 对象也用于overlapped 操作中,其状态由系统设定。 
    Mutex         CreateMutex or OpenMutex 返回其句柄,当互斥对象不被任何线程拥有时为有信号状态。等待函数为调用线程申请互斥对象的所有权,当获取时自动设互斥对象的状态为nonsignaled 。 
    Process         CreateProcess or OpenProcess 返回其句柄,当进程结束时其状态变为有信号。 
    Semaphore     CreateSemaphore or OpenSemaphore返回其句柄, semaphore 对象保持一个计数count(范围在0和设定的最大值间),当计数值大于0时其状态为有信号,为0时其状态为nonsignaled 。若当前状态为有信号,等待函数将计数值减1。ReleaseSemaphore可增加计数。 
    Thread         CreateProcess, CreateThread或 CreateRemoteThread 返回其句柄,线程结束时状态变为有信号。 
    Timer         CreateWaitableTimer or OpenWaitableTimer 返回其句柄,调用SetWaitableTimer 启动定时器,当到达预定时间时其状态变为有信号, CancelWaitableTimer 函数可关闭定时器(deactivate)。 
    ________________________________________
    调用ReadFile函数时,要读取的字节数如何确定: 
    用ClearCommError函数确定端口状态(缓冲区中处于等待的字节数可由其第三个参数即COMSTAT结构的成员cbInQue、cbOutQue确定): 
            COMSTAT comstat; 
          ……………………… 
          ClearCommError (hComm,&dwErrorMask,&comstat); 
          if (comstat.cbInQue>0) 
          { 
              ………………………          // 读取comstat.cbInQue字节数据 
            } 
    ________________________________________
    按照串方式接收时有一点需要注意的: 
    void ComWin32::SetEventCharacter(char evChar) 

    GetCommState(comHandle, &comDCB); 
    comDCB.EvtChar = evChar; 
    SetCommState(comHandle, &comDCB); 
    } // ComWin32::SetEventCharacter() comWin32->SetEventCharacter(0xCC); // 设置串标记字符 
    comWin32->SetEventMask(EV_RXFLAG); // 设置串方式接收,有 0xCC 字符或者时间到返回消息 在每次调用WaitForSingleObject 或者 WaitForMultipleObjects 之后必须重新设置 串方式接收 
    comWin32->SetEventMask(EV_RXFLAG); 
    否则每次都是返回 WAIT_TIMEOUT 
    ________________________________________
    漏了一个函数的代码: 
    DWORD ComWin32::SetEventMask(DWORD eventMask) 

    if (!SetCommMask(comHandle, eventMask)) 

    comLastError = GetLastError(); 
    return comLastError; 
    } /* end of if */ //  DWORD    evWait = eventMask; 
    DWORD    count  = 0; comEventMask = 0; 
    WaitCommEvent(comHandle, &comEventMask, &ovComEvent); /* 
    We expect ERROR_IO_PENDING returned from WaitCommEvent 
    because we are waiting with an overlapped structure. 
    */ 
    if ((comLastError = GetLastError()) == ERROR_IO_PENDING) 

    // Perform overlapped operation 
    if (GetOverlappedResult(comHandle, &ovComEvent, &count, FALSE)) 
    ovComEvent.Offset += count; comLastError = NO_ERROR; 
    } /* end of if */ return comLastError; 
    } // ComWin32::SetEventMask() 
    ________________________________________
    我觉得是这样的,如果设定了事件掩码(即comWin32->SetEventCharacter(0xCC); comWin32->SetEventMask(EV_RXFLAG); ), 
    那么可以调用WaitCommEvent来等待指定事件发生(也就是收到0xCC字符),而不必每次都重置:comWin32->SetEventMask(EV_RXFLAG); 
    ________________________________________
    7楼的函数应该是正确的,顶下! 
    欢迎更多人来补充! 
    ________________________________________
    串口DCB结构详细说明 
    成员 说明 
    DCBlength DCB结构大小,即sizeof(DCB),在调用SetCommState来更新DCB前必须作设置 
    BaudRate 指定当前采用的波特率,应与所连接的通讯设备相匹配 
    fBinary 指定是否允许二进制模式。Win32 API不支持非二进制模式传输,应设置为true 
    fParity 指定奇偶校验是否允许,在为true时具体采用何种校验看Parity 设置 
    Parity 指定端口数据传输的校验方法。以下是可取值及其意义: 
    取值 意义 
    EVENPARITY 偶校验 
    MARKPARITY 标记校验,所发信息帧第9位恒为1 
    NOPARITY 无校验 
    ODDPARITY 奇校验 
    StopBits 指定端口当前使用的停止位数,可取值: 
    取值 意义 
    ONESTOPBIT 1停止位 
    ONE5STOPBITS 1.5停止位 
    TWOSTOPBITS 2停止位 
    fErrorChar 该值为TRUE,则用ErrorChar指定的字符代替奇偶校验错误的接收字符 
    ErrorChar 指定ErrorChar字符(代替接收到的奇偶校验发生错误时的字节) 
    EvtChar 当接收到此字符时,会产生一个EV_RXFLAG事件,如果用SetCommMask函数中指定了EV_RXFLAG , 
    则可用WaitCommEvent 来监测该事件 
    EofChar 指定用于标示数据结束的字符 
    fNull 为TRUE时,接收时自动去掉空(0值)字节 
    fAbortOnError 读写操作发生错误时是否取消操作。若设置为true,则当发生读写错误时,将取消所有读写操作 
    (错误状态置为ERROR_IO_ABORTED),直到调用ClearCommError函数后才能重新进行通讯操作 
    fOutxCtsFlow 是否监控CTS(clear-to-send)信号来做输出流控。当设置为true时: 
    若CTS为低电平,则数据发送将被挂起,直至CTS变为高。 
    CTS的信号一般由DCE(通常是一个Modem)控制,DTE(通常是计算机)发送数据时监测CTS信号。 
    也就是说DCE通过把CTS置高来表明自己可以接收数据了 
    fRtsControl 设置RTS (request-to-send)流控,若为0则缺省取 RTS_CONTROL_HANDSHAKE。可取值及其意义: 
    取值 意义 
    RTS_CONTROL_DISABLE 打开设备时置RTS信号为低电平,应用程序可通过调用 
    EscapeCommFunction函数来改变RTS线电平状态 
    RTS_CONTROL_ENABLE 打开设备时置RTS信号为高电平,应用程序可通过调用 
    EscapeCommFunction函数来改变RTS线电平状态 
    RTS_CONTROL_HANDSHAKE 允许RTS信号握手,此时应用程序不能调用EscapeCommFunction函数。 
    当输入缓冲区已经有足够空间接收数据时,驱动程序置RTS为高以允许 
    DCE来发送;反之置RTS为低以阻止DCE发送数据。 
    RTS_CONTROL_TOGGLE 有字节要发送时RTS变高,当所有缓冲字节已被发送完毕后,RTS变低。 
    应用程序不能调用EscapeCommFunction函数。该值在Windows95系统忽略 
    fOutxDsrFlow 是否监控DSR (data-set-ready) 信号来做输出流控。当设置为true时: 
    若DSR为低电平,则数据发送将被挂起,直至DSR变为高。DSR的信号一般由DCE来控制 
    fDtrControl DTR (data-terminal-ready)流控,可取值如下: 
    取值 意义 
    DTR_CONTROL_DISABLE 打开设备时置DTR信号为低电平,应用程序可通过调用 
    EscapeCommFunction函数来改变DTR线电平状态 
    DTR_CONTROL_ENABLE 打开设备时置DTR信号为高电平,应用程序可通过调用 
    EscapeCommFunction函数来改变DTR线电平状态 
    DTR_CONTROL_HANDSHAKE 允许DTR信号握手,此时应用程序不能调用EscapeCommFunction函数 
    fDsrSensitivity 通讯设备是否对DSR信号敏感。若设置为TRUE,则当DSR为低时将会忽略所有接收的字节 
    fTXContinueOnXoff 当输入缓冲区满且驱动程序已发出XOFF字符时,是否停止发送。 
    当为TRUE时,XOFF被发送后发送仍然会继续;为FALSE时,则发送会停止, 
    直至输入缓冲区有XonLim字节的空余空间、驱动程序已发送XON字符之后发送继续。 
    fOutX XON/XOFF 流量控制在发送时是否可用。 
    如果为TRUE, 当 XOFF 值被收到的时候,发送停止;当 XON 值被收到的时候,发送继续 
    fInX XON/XOFF 流量控制在接收时是否可用。 
    如果为TRUE, 当 输入缓冲区已接收满XoffLim 字节时,发送XOFF字符; 
    当输入缓冲区已经有XonLim 字节的空余容量时,发送XON字符 
    XonLim 在XON字符发送前接收缓冲区内可允许的最小字节数 
    XoffLim 在XOFF字符发送前接收缓冲区内可允许的最大字节数 
    XonChar 指定XON字符 
    XoffChar 指定XOFF字符 
    fDummy2 保留,未启用 
    wReserved 未启用,必须设置为0 
    wReserved1 保留,未启用 
      

  4.   

    使用ComPort控件,Delphi园地有下
    我就是用这个控件实现的,很简单