ybx520 发表于 2008-11-14 21:54:11

求助!用API函数编写的串口无法接收0x00【恢复】

最近用API函数编写了一个串口,但无法接收0x00,其它可以。是不是DCB中还要设置?请指数。

ybx520 发表于 2008-11-16 20:54:58

不行啊'delphiDCB结构中没有DCB.fxxxxxx之类的成员,F开头的成员只有DCB.Flags,那怎样才能打开二制模式DCB.fBinary啊!

ybx520 发表于 2008-11-24 21:53:08

不会吧!我的是delphi 7.0 呀!系统也是xp sp2,我想不是版本问题,是delphi和c++不一样吧!

leafboy77 发表于 2008-11-24 21:16:22

DELPHI没用过,不过用windows api的话,应该是一致的,估计你的版本太老了。

leafboy77 发表于 2008-11-24 20:59:02

提供一个我用的API代码,一定能接收00H

  首先打开串口

  hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, bOverlapped ? FILE_FLAG_OVERLAPPED : 0, NULL);

  if (m_hComm == INVALID_HANDLE_VALUE){ ... }



  获取DCB

  DCB dcb;

  dcb.DCBlength = sizeof(DCB);

  GetState(dcb);



  修改DCB

  dcb.BaudRate = ...;

  dcb.Parity = ...;

  dcb.ByteSize = ...;

  dcb.StopBits = ...

  dcb.fDsrSensitivity = ...;

  dcb.fOutxCtsFlow = ...;

  dcb.fOutxDsrFlow = ...;

  dcb.fOutX = ...;

  dcb.fInX = ...;



  重设DCB

  SetState(dcb);

  

ybx520 发表于 2008-11-24 21:05:00

dcb.fDsrSensitivity = ...;

dcb.fOutxCtsFlow = ...;

dcb.fOutxDsrFlow = ...;

dcb.fOutX = ...;

dcb.fInX = ...

在delphi里沒有这样的成员,只有DCB.Flags这个。

我把DCB.Flags:=1;

DCB.Flags:=DCB.Flags+$800;

还是不行,无法接收0x00,真是纳闷.

ybx520 发表于 2008-11-24 20:35:19

还是不能接收0x00呀!有谁有例题供参考吗?先谢了?

ybx520 发表于 2008-11-25 15:38:20

呵呵!终于搞定左。

ybx520 发表于 2008-11-17 19:30:41

dcb.fBinary =1; //二进制模式

dcb.Parity = NOPARITY;

dcb.fParity = TRUE;

dcb.fOutxCtsFlow = FALSE;

dcb.fOutxDsrFlow = FALSE;

dcb.fInX = FALSE;

dcb.fOutX = FALSE;



以上是C++里的设置,那Delphi应该怎样才能做到以上的设置啊!

ybx520 发表于 2008-11-16 10:45:07

谢谢以上各位的指点,万分感激,回去试试.

zc3909 发表于 2008-11-15 22:46:59

int CDlg::OpenComm(CString com, int baud)

{

        hCom =CreateFile( com, 

                GENERIC_READ | GENERIC_WRITE,                          // 允许读写

                0,                                                // 此项必须为0

                NULL,                                                // no security attrs

                OPEN_EXISTING,                                        //设置产生方式

                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,

                NULL );

        

        if(hCom==INVALID_HANDLE_VALUE)                                //检测打开串口操作是否成功

        {

                AfxMessageBox("serial port file create error.");

                return 0;

        }

        SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );        //设置事件驱动的类型

        SetupComm( hCom, 1024,1024) ;                //设置输入、输出缓冲区的大小

        PurgeComm( hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );        //清干净输入、输出缓冲区

        

        //设置读写操作所允许的超时

        // COMMTIMEOUTS对象

        COMMTIMEOUTS comTimeOut;

        comTimeOut.ReadIntervalTimeout = -1;                  // 接收时,两字符间最大的时延

        comTimeOut.ReadTotalTimeoutMultiplier = 0;     // 读取每字节的超时

        comTimeOut.ReadTotalTimeoutConstant = 0;       // 读串口数据的固定超时  总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant

        comTimeOut.WriteTotalTimeoutMultiplier = 0;    // 写每字节的超时

        comTimeOut.WriteTotalTimeoutConstant = 5000;   // 写串口数据的固定超时

        if(SetCommTimeouts(hCom,&comTimeOut) == 0 )    // 将超时参数写入设备控制

        {

                AfxMessageBox("serial port SetCommTimeouts error.");

                return 0;

        }

        memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );

        memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

        m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

        m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

        

        

        DCB        dcb ;                                // 定义数据控制块结构

        GetCommState(hCom, &dcb ) ;                        //读串口原来的参数设置

        dcb.BaudRate =baud; 

        dcb.ByteSize =8; 

        dcb.Parity = NOPARITY;

        dcb.StopBits = ONESTOPBIT ;

        dcb.fBinary = TRUE ;

        dcb.fParity = FALSE;

        if(SetCommState(hCom, &dcb ) == 0 )                //串口参数配置

        {

                AfxMessageBox("serial port SetCommState error.");

                return 0;

        }

        m_isopen = 1 ;

        CreateThread(NULL,0,LPTHREAD_START_ROUTINE(thread_receive_prog),this,0,NULL);

        return 1;

}



本贴被 zc3909 编辑过,最后修改时间:2008-11-15,22:49:41.

Appcat 发表于 2008-11-15 22:01:48

  typedef struct _DCB { // dcb 

        DWORD DCBlength;           // sizeof(DCB) 

        DWORD BaudRate;            // current baud rate 指定当前的波特率

        DWORD fBinary: 1;          // binary mode, no EOF check 指定是否允许二进制模式,WINDOWS 95中必须为TRUE

        DWORD fParity: 1;          // enable parity checking 指定奇偶校验是否允许

        DWORD fOutxCtsFlow:1;      // CTS output flow control 指定CTS是否用于检测发送控制.当为TRUE是CTS为OFF,发送将被挂起

        DWORD fOutxDsrFlow:1;      // DSR output flow control 指定DSR是否用于检测发送控制.当为TRUE是DSR为OFF,发送将被挂起

        DWORD fDtrControl:2;       // DTR flow control type DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",

        DWORD fDsrSensitivity:1;   // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略

        DWORD fTXContinueOnXoff:1; // XOFF continues Tx 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止.TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。

        DWORD fOutX: 1;            // XON/XOFF out flow control TRUE时,接收到XoffChar之后便停止发送.接收到XonChar之后将重新开始

        DWORD fInX: 1;             // XON/XOFF in flow control TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去.接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去

        DWORD fErrorChar: 1;       // enable error replacement 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符

        DWORD fNull: 1;            // enable null stripping TRUE时,接收时去掉空(0值)字节

        DWORD fRtsControl:2;       // RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,当接收缓冲区小于半满时RTS为ON 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF

        DWORD fAbortOnError:1;     // abort reads/writes on error TRUE时,有错误发生时中止读和写操作

        DWORD fDummy2:17;          // reserved 未使用

        WORD wReserved;            // not currently used 未使用,必须为0

        WORD XonLim;               // transmit XON threshold 指定在XON字符发送这前接收缓冲区中可允许的最小字节数

        WORD XoffLim;              // transmit XOFF threshold 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数

        BYTE ByteSize;             // number of bits/byte, 4-8 指定端口当前使用的数据位

        BYTE Parity;               // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

        BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

        char XonChar;              // Tx and Rx XON character 指定用于发送和接收字符XON的值

        char XoffChar;             // Tx and Rx XOFF character 指定用于发送和接收字符XOFF值

        char ErrorChar;            // error replacement character 本字符用来代替接收到的奇偶校验发生错误时的值

        char EofChar;              // end of input character 当没有使用二进制模式时,本字符可用来指示数据的结束

        char EvtChar;              // received event character 当接收到此字符时,会产生一个事件

        WORD wReserved1;           // reserved; do not use 未使用

    } DCB; 

Appcat 发表于 2008-11-15 21:59:54

检查一下软件流控XON/XOFF,是否把0X00作为流控符号了。

ybx520 发表于 2008-11-15 21:39:10

自己顶上

ATmega32 发表于 2008-11-16 22:47:38

s="baud=9600 parity=n data=7 stop=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off";

BuildCommDCB(s.c_str(),&dcb);

SetCommState(hComm, &dcb);

本贴被 ATmega32 编辑过,最后修改时间:2008-11-16,22:49:00.

hechuan519 发表于 2014-4-29 15:40:48

ybx520 发表于 2008-11-25 15:38
呵呵!终于搞定左。

你好,请问你是怎么解决无法接收0x00的问题,我关闭了控制流还是无法接收。
页: [1]
查看完整版本: 求助!用API函数编写的串口无法接收0x00【恢复】