CSerialPort能设置为同步发送吗?
初始化函数如下:
BOOL InitPort(CWnd* pPortOwner, 
              UINT portnr = 1, 
              UINT baud = 19200, 
              char parity = 'N', 
              UINT databits = 8, 
              UINT stopbits = 1, 
              DWORD dwCommEvents = EV_RXCHAR, 
              UINT writebuffersize = 1024);
如何将它设置为同步发送?

解决方案 »

  1.   

    没用过CSerialPort,只用过API,看下里面设置打开串口的方式的代码
    HANDLE CreateFile( LPCTSTR lpFileName,
                      DWORD dwDesiredAccess,
                      DWORD dwShareMode,
                      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                      DWORD dwCreationDistribution,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile);lpFileName:将要打开的串口逻辑名,如“COM1”; 
    dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; 
    dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; 
    lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; 
    dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; 
    dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作; 
    hTemplateFile:对串口而言该参数必须置为NULL;
      

  2.   

    如果同步就没有必要用CSerialPort,write完成就read等待,如此循环就可以了
      

  3.   

    我终于明白了,这个类没有办法同步发送数据,看它的cpp文件中的初始化:
    m_hComm = CreateFile(szPort,// communication port string (COMX)
        GENERIC_READ | GENERIC_WRITE, // read/write types
        0, // comm devices must be opened with exclusive access
        NULL, // no security attributes
        OPEN_EXISTING, // comm devices must use OPEN_EXISTING
                FILE_FLAG_OVERLAPPED, // Async I/O
                        0); // template must be 0 for comm devices
    FILE_FLAG_OVERLAPPED被设置为异步,并且不能改为同步,要同步的话用其他类吧,比如:
    http://blog.chinaunix.net/u/32550/showart_365425.html
      

  4.   

    由于采用异步发送, 在它的那个线程里面, 只发送一次.
    就是说:
    m_ser.WriteToPort(chSend);
    这句话执行好之后并不是马上发送串口数据
    要等进入它的线程之后再发送.
    你可以跟踪下是什么时候进入它的线程的.
    三句writetoport都会进入这个线程
    但是只能执行一个,最后一个.
      

  5.   

    这里同步异步的概念是指:
    串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
    http://www.vckbase.com/document/viewdoc/?id=1734#%E8%AF%BB%E5%86%99%E4%B8%B2%E5%8F%A3