我的串口程序 BuildCommDCB("COM1:115200,n,8,1",&dcb);使用了这一句以后,出现
以下问题
Unhandled exception in callsu.exe (KERNEL32.DLL): 0xC0000005:Access Violation
在2k 和xp下调试均没有次错误,但是在98和me下有。 hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hCommDev!=(HANDLE)-1)
{ flagcom=TRUE; dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
// BuildCommDCB("COM1:115200,n,8,1",&dcb);
SetCommState(hCommDev,&dcb); //以上为初始化串口
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=0;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=1000;
SetCommTimeouts(hCommDev,&CommTimeOuts);
PurgeComm(hCommDev,PURGE_TXCLEAR);
PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间
bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
if(!bReturn)flagmodem=FALSE;
else flagmodem=TRUE;
} else flagcom=FALSE;
以下问题
Unhandled exception in callsu.exe (KERNEL32.DLL): 0xC0000005:Access Violation
在2k 和xp下调试均没有次错误,但是在98和me下有。 hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hCommDev!=(HANDLE)-1)
{ flagcom=TRUE; dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
// BuildCommDCB("COM1:115200,n,8,1",&dcb);
SetCommState(hCommDev,&dcb); //以上为初始化串口
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=0;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=1000;
SetCommTimeouts(hCommDev,&CommTimeOuts);
PurgeComm(hCommDev,PURGE_TXCLEAR);
PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间
bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL);
if(!bReturn)flagmodem=FALSE;
else flagmodem=TRUE;
} else flagcom=FALSE;
解决方案 »
- 如何将YUV格式视频数据流转换为MPEG4视频
- MFC标签页中组合框的索引取值问题
- 如何删除单文档工程的菜单??
- || 一个关于 Windows Media Player 9.0 控件的问题 ||
- 如何动态创建一个继承自CFormView的实例?
- 有没有像vtune一样的调优工具
- 求购visual C++ 技术内幕(第四版),我在广州,加QQ315679281,谢谢!
- ★★★请问如何通过socket编程或用API修改本机的IP地址?★★★
- 大家来 完善一下 ATL 写 COM 的不成文规范!!!
- 不知道用SDK能否实现splitter window?
- 如何使程序启动时不显示初始窗口??
- 小问题:SDI中如何防止一开始自动新建一个文件
注意在SetCommState前要调用GetCommState;
BOOL NEAR SetupConnection()
{ BOOL fRetVal;
DCB dcb;
if (!npGPSInfo) return(FALSE); dcb.DCBlength=sizeof(DCB); GetCommState(COMDEV(npGPSInfo),&dcb); dcb.BaudRate=BAUDRATE(npGPSInfo);
dcb.ByteSize=BYTESIZE(npGPSInfo);
dcb.Parity=PARITY(npGPSInfo);
dcb.StopBits=STOPBITS(npGPSInfo); dcb.fOutxDsrFlow=FALSE;
dcb.fDtrControl=DTR_CONTROL_ENABLE; dcb.fOutxCtsFlow=FALSE;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fInX=dcb.fOutX=FALSE;
dcb.fBinary=TRUE;
dcb.fParity=TRUE; fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb);
return (fRetVal);
}
void CSerialPort::Open(int nPort, DWORD dwBaud, Parity parity, BYTE DataBits, StopBits stopbits, FlowControl fc, BOOL bOverlapped)
{
//Validate our parameters
ASSERT(nPort>0 && nPort<=255); Close(); //In case we are already open //Call CreateFile to open up the comms port
CString sPort;
sPort.Format(_T("\\\\.\\COM%d"), nPort);
DWORD dwCreateProperty;
if(bOverlapped)
{
dwCreateProperty=FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED;
}
else
{
dwCreateProperty=FILE_ATTRIBUTE_NORMAL;
}
// bOverlapped ? FILE_FLAG_OVERLAPPED : 0
m_hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,dwCreateProperty, NULL);
if (m_hComm == INVALID_HANDLE_VALUE)
{
TRACE(_T("Failed to open up the comms port\n"));
AfxThrowSerialException();
} this->m_CurPortNum = nPort;
//Create the event we need for later synchronisation use
/*
if(bOverlapped)
{
m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (m_hEvent == NULL)
{
Close();
TRACE(_T("Failed in call to CreateEvent in Open\n"));
AfxThrowSerialException();
}
}
*/
m_bOverlapped = bOverlapped;
//Get the current state prior to changing it
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetState(dcb); //Setup the baud rate
dcb.BaudRate = dwBaud; //Setup the Parity
switch (parity)
{
case EvenParity: dcb.Parity = EVENPARITY; break;
case MarkParity: dcb.Parity = MARKPARITY; break;
case NoParity: dcb.Parity = NOPARITY; break;
case OddParity: dcb.Parity = ODDPARITY; break;
case SpaceParity: dcb.Parity = SPACEPARITY; break;
default: ASSERT(FALSE); break;
} //Setup the data bits
dcb.ByteSize = DataBits; //Setup the stop bits
switch (stopbits)
{
case OneStopBit: dcb.StopBits = ONESTOPBIT; break;
case OnePointFiveStopBits: dcb.StopBits = ONE5STOPBITS; break;
case TwoStopBits: dcb.StopBits = TWOSTOPBITS; break;
default: ASSERT(FALSE); break;
} //Setup the flow control
dcb.fDsrSensitivity = FALSE;
switch (fc)
{
case NoFlowControl:
{
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
}
case CtsRtsFlowControl:
{
dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
}
case CtsDtrFlowControl:
{
dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
}
case DsrRtsFlowControl:
{
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = TRUE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
}
case DsrDtrFlowControl:
{
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = TRUE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
}
case XonXoffFlowControl:
{
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutX = TRUE;
dcb.fInX = TRUE;
dcb.XonChar = 0x11;
dcb.XoffChar = 0x13;
dcb.XoffLim = 100;
dcb.XonLim = 100;
break;
}
default:
{
ASSERT(FALSE);
break;
}
}
//Now that we have all the settings in place, make the changes
SetState(dcb);
}
如果在对话框程序中使用BuildCommDCB是一切正常的,可是在D/V下就不行,而sk/xp中,对话框
和d/v中都正常,可能是microsoft的bug