求助!用API函数编写的串口无法接收0x00【恢复】
最近用API函数编写了一个串口,但无法接收0x00,其它可以。是不是DCB中还要设置?请指数。 不行啊'delphiDCB结构中没有DCB.fxxxxxx之类的成员,F开头的成员只有DCB.Flags,那怎样才能打开二制模式DCB.fBinary啊! 不会吧!我的是delphi 7.0 呀!系统也是xp sp2,我想不是版本问题,是delphi和c++不一样吧! DELPHI没用过,不过用windows api的话,应该是一致的,估计你的版本太老了。 提供一个我用的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);
dcb.fDsrSensitivity = ...;
dcb.fOutxCtsFlow = ...;
dcb.fOutxDsrFlow = ...;
dcb.fOutX = ...;
dcb.fInX = ...
在delphi里沒有这样的成员,只有DCB.Flags这个。
我把DCB.Flags:=1;
DCB.Flags:=DCB.Flags+$800;
还是不行,无法接收0x00,真是纳闷. 还是不能接收0x00呀!有谁有例题供参考吗?先谢了? 呵呵!终于搞定左。 dcb.fBinary =1; //二进制模式
dcb.Parity = NOPARITY;
dcb.fParity = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fInX = FALSE;
dcb.fOutX = FALSE;
以上是C++里的设置,那Delphi应该怎样才能做到以上的设置啊! 谢谢以上各位的指点,万分感激,回去试试. 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. 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; 检查一下软件流控XON/XOFF,是否把0X00作为流控符号了。 自己顶上 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. ybx520 发表于 2008-11-25 15:38
呵呵!终于搞定左。
你好,请问你是怎么解决无法接收0x00的问题,我关闭了控制流还是无法接收。
页:
[1]