我自己用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);
我的串口设置是这样的:
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);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货