|
发表于 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. |
|