var
   pDcb : _DCB;
Begin
   hFile := CreateFile( 'COM1', GENERIC_READ or GENERIC_WRITE,
                                      0,
                                      nil,
                                      OPEN_EXISTING,
                                      FILE_FLAG_OVERLAPPED,
                                      0);
   GetCommState(hFile,pDcb);  //应该加上这句
   BuildCommDCB('9600,N,8,1',pDcb);
   SetCommState(hFile,pDcb);
   CloseHandle( hFile );
end;

解决方案 »

  1.   

    To hawk26(老武):
       老兄,单独运行还是要出错啊。 
      

  2.   

    你的输出缓冲太大了,用65534试试,另外一般先用GetCommState函数填充DCB结构,再用SetCommState写回才行,试试吧
      

  3.   

    to zhujianzhou():
       老兄,我在测试hawk26(老武)兄的程序同样出这个问题,他的程序没有设缓冲区啊,后来我把65536改成4096,也是一样啊,但同样的代码为什么在BCB却没事呢?
      
      

  4.   

    哥们,你把buildCommDCB去掉,改为直接操作pDcb,这样:
        pDcb.BaudRate := 9600;
        pDcb.StopBits := 1;
        pDcb.ByteSize := 8;
        pDcb.Parity := 0;
    我用过下面的方法,是为了使串口能收到null字符:   
      hFile := CreateFile( PChar(gszPort), GENERIC_READ or GENERIC_WRITE,
                                          0,
                                          nil,  //0,
                                          OPEN_EXISTING,
                                          FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
                                          0);
       GetCommState(hFile,pDcb);
        pDcb.Flags := pDcb.Flags and $FFFFF7FF;
       SetCommState(hFile,pDcb);
       CloseHandle( hFile );
    单独运行正常。
      

  5.   

    to hawk26(老武):
       老兄,谢谢你,你真是个热心人啊,我知道可以用另外的方法,但我不明白为什么BuildCommDCB就是要出错。
       我的同事用VC++测试,如果用BuildCommDCB("9600,N,8,1",&Dcb)同样运行出错,
       但如果这样;
             CString b="9600,N,8,1";
             BuildCommDCB(b,&Dcb);//代码好象是这样的
             就对啦
       准备收分吧。