问题一:
    在编写串口通信程序的时候,我们要写流量控制:
    常见有硬件方式RTS/CTS和DTR/DSR方式,软件方式有XON/XOFF和自定义的方式.
    (1)怎样写程序使流量控制为硬件方式RTS/CTS?
    (2)怎样写程序使流量控制为硬件方式DTR/DSR?
    (3)怎样写程序使流量控制为软件方式XON/XOFF?
    (4)书写自定义方式怎样写?
问题二:
    串口通信有异步和同步.
    (1)同步和异步程序中有什么区别?
    (2)它们分别怎样写?
      请高手解答啊,分不够,我再开个帖子,一定重分答谢.但是谢绝灌水,灌水不给分.

解决方案 »

  1.   

    http://www.newebug.com/article/cpp/2067.shtml
      

  2.   

    问题一
    看DCB struct
    fOutxCtsFlow 
    If this member is TRUE, the CTS (clear-to-send) signal is monitored for output flow control. If this member is TRUE and CTS is turned off, output is suspended until CTS is sent again. 
    fOutxDsrFlow 
    If this member is TRUE, the DSR (data-set-ready) signal is monitored for output flow control. If this member is TRUE and DSR is turned off, output is suspended until DSR is sent again. 
    问题二
    区别是软件的实现,最好用异步。
    fDtrControl 
      

  3.   

    DCB dcb;// 设置流控制为Xon/Xoff
    {
    dcb.fInX = TRUE;
    dcb.fOutX = TRUE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    }
    // 设置流控制为硬件
    {
    dcb.fInX = FALSE;
    dcb.fOutX = FALSE;
    dcb.fOutxDsrFlow = TRUE;
    dcb.fOutxCtsFlow = TRUE;
    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
    }
    // 不用流控制
    {
    dcb.fInX = FALSE;
    dcb.fOutX = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    }// 创建异步通讯的串口,加上FILE_FLAG_OVERLAPPED标识
    DWORD com = CreateFile( "COM3", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL );// 同步的写操作
    DWORD size;
    WriteFile( com, "123", 3, size, NULL );
    // 同步的读操作
    char buf[123];
    ReadFile( com, buf, 123, size, NULL );// 异步的写操作
    OVERLAPPED oa;
    oa.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    WriteFile( com, "123", 3, NULL, &oa );
    WaitForSingleObject( oa.hEvent, 0xFFFFFFFF );// 异步的读操作
    DWORD e=0;
    WaitCommEvent( com, &e, &oa );
    WaitForSingleObject( oa.hEvent, 0xFFFFFFFF );
    if( e == EV_RXCHAR )
    {
        ReadFile( com, buf, 123, NULL, &oa );
        WaitForSingleObject( oa.hEvent, 0xFFFFFFFF );
    }这些都是最基础的,剩下的自己去看MSDN!
      

  4.   

    MSDN里面有个M$提供的串口例子,非常好的!
      

  5.   

    同步和异步的区别:同步和异步在打开串口时一个将CreateFile()函数中的LPOVERLAPPED参数置空,一个会传进一个OVERLAPPED结构,在这个结构里实现异步IO;同步方式必须一直去检测串口是否有数据,而异步方式会通过OVERLAPPED给你一个事件信号.据说异步方式实质也是用同步IO线程实现的
      

  6.   

    CSDN怎么这么冷清啊,我提的问题,高手为什么不进来解决呢