串口初始化--不能收到终端的数据
yakai 2007-02-14 04:43:51 我需要向终端发送AT命令,然后处理终端返回的字符串。但是每次插上串口线后,需要运行一次超级终端(hyperTerminal)之后,我的程序启动,才能收到终端那边的响应。只要启动过一次超级终端,我的程序每次都可以正常收发。我怀疑是我的串口初始化代码有问题,请大家帮忙检查检查。
static OVERLAPPED Write = {0}; // For Tx channal.
static OVERLAPPED Reader = {0}; // For Rx channal.
static HANDLE hComm; // Handle to the uart port that will be operated.
#define HOST_UART_TX_BUFF_LNG 3000 // bytes.
#define HOST_UART_RX_BUFF_LNG 3000 // bytes.
BOOL HostUartOpenPort(UINT16 port_number)
{
BOOL result = TRUE;
char szPort[15];
DCB dcb;
if( port_number < 10)
wsprintf( szPort, "COM%d", port_number );
else
wsprintf( szPort, "\\\\.\\COM%d", port_number );
hComm = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
PurgeComm(hComm,PURGE_TXCLEAR |PURGE_RXCLEAR);
if (hComm == INVALID_HANDLE_VALUE){
result = FALSE;
}
/* Get the port parameters first. */
memset(&dcb,0,sizeof(dcb));
dcb.DCBlength = sizeof( DCB );
GetCommState( hComm, &dcb );
dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS_CONTROL_DISABLE, RTS_CONTROL_ENABLE, RTS_CONTROL_HANDSHAKE, RTS_CONTROL_TOGGLE
dcb.BaudRate = CBR_115200; // By default it is 115200 bps.
// dcb.Parity = NOPARITY;
// dcb.StopBits = ONESHOTBIT;
dcb.ByteSize = 8;
// dcb.EvtChar = EVENTCHAR;
// dcb.fOutxDsrFlow = FC_XONXOFF;
/* Set the dcb and the Tx/Rx buffer length. */
if( !SetCommState( hComm, &dcb ) | |
!SetupComm( hComm, HOST_UART_RX_BUFF_LNG, HOST_UART_TX_BUFF_LNG ) ) {
CloseHandle( hComm );
result = FALSE;
}
/* Create event for Tx/Rx. */
Write.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Tx event.
Reader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Rx event.
if ( (Write.hEvent == 0) | | (Reader.hEvent == 0)) {
result = FALSE;
}
// EV_BREAK, EV_RLSD, EV_RXCHAR, EV_RXFLAG
SetCommMask(hComm, EV_RXCHAR);
return result;
}