我自己用API写了一个串口类,这个类在台式机的window2000,windowXP系统和笔记本的window2000系统下能正常运行,但是在笔记本上的XP系统就不能正常运行。大概原因:串口数据是能读取到,但是感觉好像数据丢失了。前提是硬件串口没有任何问题,我用MSCOMM读取串口数据没有问题,但是就是太费系统资源了。请教大侠如何解决这个问题,谢谢先
我的串口设置是这样的:
DCB dcb;
COMMTIMEOUTS timeouts;
// 打开COM1
CString strPort;
strPort.Format("COM%d",nPort);
m_hComDev = CreateFile(strPort, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
m_bOpen = FALSE;
if(m_hComDev == INVALID_HANDLE_VALUE)
{
//     MessageBox(NULL, _T("端口被占用,打印程序不能继续运行!"), _T("TRACE"), MB_OK);
return FALSE;                    // 打开端口失败
} //得到超时参数
GetCommTimeouts (m_hComDev, &timeouts);
//改变COMMTIMEOUTS结构设置
timeouts.ReadIntervalTimeout = 0;  
timeouts.ReadTotalTimeoutMultiplier = 0;  
timeouts.ReadTotalTimeoutConstant = 10;   
timeouts.WriteTotalTimeoutMultiplier = 10;  
timeouts.WriteTotalTimeoutConstant = 1000;  
// 设置超时控制
SetCommTimeouts(m_hComDev, &timeouts);
// 设置接收缓冲区和输出缓冲区的大小
SetupComm(m_hComDev, 1024, 512);
// 获取缺省的DCB结构的值
dcb.DCBlength = sizeof (DCB);  
//得到端口的默认设置信息
GetCommState(m_hComDev, &dcb);
//改变DCB结构设置
dcb.fBinary = TRUE;                 //Win32不支持非二进制串行传输模式,必须为TRUE 
dcb.fOutxCtsFlow = TRUE;            //串行端口的输出由CTS线控制
dcb.fOutxDsrFlow = FALSE;           //关闭串行端口的DSR流控制 
dcb.fDtrControl = DTR_CONTROL_ENABLE;   //启用DTR线
dcb.fDsrSensitivity = FALSE;        //如果设为TRUE将忽略任何输入的字节,除非DSR线被启用 
dcb.fTXContinueOnXoff = FALSE;       //当为TRUE时,如果接收缓冲区已满且驱动程序已传送XOFF字符,将使驱动程序停止传输字符
dcb.fOutX = FALSE;                  //设为TRUE指定XON/XOFF控制被用于控制串行输出 
dcb.fInX = FALSE;                   //设为TRUE指定XON/XOFF控制被用于控制串行输入 
dcb.fErrorChar = FALSE;             //WINCE串行驱动程序的默认执行将忽略这个字段 
dcb.fNull = FALSE;                  //设为TRUE将使串行驱动程序忽略收到的空字节 
dcb.fRtsControl = RTS_CONTROL_ENABLE;   //启用RTS线 
dcb.fAbortOnError = FALSE;          //WINCE串行驱动程序的默认执行将忽略这个字段
dcb.Parity = NOPARITY;              //无奇偶校验 
dcb.ByteSize = byByteSize;            //每字节的位数 
dcb.StopBits = byStopBits;          //每字节一位停止位
dcb.BaudRate = dwBaudRate;               //波特率 
dcb.fParity = dwParity;                 //启用奇偶校验 
// 设置串行设备控制参数
SetCommState(m_hComDev, &dcb);
// 设定相应监视串口的错误和接收到字符两种事件响应
SetCommMask(m_hComDev, EV_ERR|EV_RXCHAR);

解决方案 »

  1.   

    如果是在台式机的window2000,windowXP系统和笔记本的window2000系统下能正常运行,我想不应该是程序的问题,是不是笔记本上的XP系统版本与其他机器不一样,造成传输错误?
      

  2.   

    我现在查到的原因是:那里面读取端口的方法是用ReadFile函数读的,但是MSDN上面说这个函数对有些设备不支持.后来我改用ReadFileEx函数来读,发现还是不行,MSDN上头没有说不支持设备之类的,会不会是我那个ReadFileEx函数用错了,帮忙指点一下,谢谢
      

  3.   

    那你在ReadFileEx()之后,使用GetLastError(),看看有什么错误。