为什么打不开串口-->解决我给200分()
unsigned long n = 0;
BOOL l_bWaitingOnRead = FALSE;
OVERLAPPED l_osReader = {0};
BOOL l_bReturn = FALSE;
l_osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(l_osReader.hEvent == NULL)
{
return FAIL;
}
if(!ReadFile(this->m_hComm, p_abRespArr, 256, &n, &l_osReader))
{
if(GetLastError() != ERROR_IO_PENDING)
{
l_bReturn = FAIL;
AfxMessageBox("读失败2,ReadFile"); //测试
}
else
{
l_bWaitingOnRead = TRUE;
}
}
else
{
p_iToRead = n;
l_bReturn = SUCCESS;
}
问题点数:100、回复次数:8Top
1 楼xuweiqun(打雷啦)回复于 2004-04-01 15:01:19 得分 0
上面是ReadFile 失败,这个是WriteFile失败
OVERLAPPED l_osWrite = {0};
DWORD l_dwWritten;
DWORD l_dwRes;
BOOL l_bReturn;
l_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(l_osWrite.hEvent == NULL)
{
return FAIL;
}
if(!WriteFile(m_hComm, p_abCmdArr, p_iToWrite, &l_dwWritten, &l_osWrite))
{
if(GetLastError() != ERROR_IO_PENDING)
{
l_bReturn = FAIL;
AfxMessageBox("写失败2,WriteFile"); //测试
}
else
{
l_dwRes = WaitForSingleObject(l_osWrite.hEvent, INFINITE);
switch(l_dwRes)
{
case WAIT_OBJECT_0: // OVERLAPPED structure's event has been signaled.
if (!GetOverlappedResult(m_hComm, &l_osWrite, &l_dwWritten, FALSE))
{
l_bReturn = FAIL;
}
else
{
// Write operation completed successfully.
l_bReturn = SUCCESS;
}
break;
default:
l_bReturn = FAIL;
break;
}
}
}
else // WriteFile completed immediately.
{
l_bReturn = SUCCESS;
AfxMessageBox("传送成功"); // 测试
}
CloseHandle(l_osWrite.hEvent);
return l_bReturn;Top
2 楼hedy02(爬上岸的鱼)回复于 2004-04-02 17:50:34 得分 50
把错误提示写出来,好分析。。。
是不是每次都到“//测试”这个地方?
打开的时候CreateFile()是否用了OVERLAPPED ?
我看你write的那块没什么错啊,我都测试过了,就不知道你之前的设置那些是什么就是了
我的open()
{
DWORD dwFlags = bOverlap ? FILE_FLAG_OVERLAPPED : 0;
CString strCom;
strCom.Format("COM%d",m_nCom + 1);
// 打开指定的串口
HANDLE hCom = ::CreateFile(strCom,GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING,dwFlags,NULL);
// 获得串口的配置信息
COMMCONFIG ComCfg;
DWORD dwSize = sizeof(ComCfg);
if (!::GetCommConfig(hCom,&ComCfg,&dwSize))
{
AfxMessageBox(_T("读取串口配置失败!"));
::CloseHandle(hCom);
return NULL;
}
// 获得当前的串口配置状态
DCB dcb;
if (!GetCommState(hCom,&dcb))
{
AfxMessageBox(_T("读取串口状态失败!"));
::CloseHandle(hCom);
return NULL;
}
// 设置奇偶校验方式
switch (m_nParity)
{
case 0:
// 不校验
dcb.Parity = NOPARITY;
break;
case 1:
// 奇校验
dcb.Parity = ODDPARITY;
break;
case 2:
// 偶校验
dcb.Parity = EVENPARITY;
break;
case 3:
// MARK方式
dcb.Parity = MARKPARITY;
break;
case 4:
// SPACE方式
dcb.Parity = SPACEPARITY;
break;
}
// 设置数据位格式
dcb.ByteSize = m_nData;
// 设置波特率
dcb.BaudRate = m_dwBaud;
// 设置停止位方式
switch (m_nStop)
{
case 0:
// 停止位为1位
dcb.StopBits = ONESTOPBIT;
break;
case 1:
// 停止位为1.5位
dcb.StopBits = ONE5STOPBITS;
break;
case 2:
// 停止位为2位
dcb.StopBits = TWOSTOPBITS;
break;
}
// 设置灵敏度
dcb.fDsrSensitivity = FALSE;
// 设置流控制方式
switch (m_nShake)
{
case 0:
// 无流量控制
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
case 1:
// RTS控制,监视CTS信号
dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
case 2:
// DTR控制,监视CTS信号
dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
case 3:
// RTS控制,监视DSR信号
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = TRUE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
case 4:
// DTR控制,监视DSR信号
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = TRUE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
break;
case 5:
// XON/XOFF控制方式
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;
}
// 将设定的参数值用于该串口
if (!SetCommState(hCom, &dcb))
{
AfxMessageBox(_T("设置COM端口状态失败!"));
::CloseHandle(hCom);
return NULL;
}
return hCom;
}
Top
3 楼hell190109()回复于 2004-04-02 18:36:03 得分 10
关注Top
4 楼gunmanpan(mu)回复于 2004-04-03 15:52:00 得分 10
关注INGTop
5 楼wlpwind(robin)回复于 2004-04-03 18:34:12 得分 10
不知道你参数设置正确了没有。Top
6 楼xuweiqun(打雷啦)回复于 2004-04-05 21:15:03 得分 0
不好意思,我的问题已经解决了,
过了3天。
我竟然忘了这里错在哪里,好象是其他一个地方错了,然后就涉及到这里。
非常感谢!!!Top
7 楼hedy02(爬上岸的鱼)回复于 2004-04-09 10:59:49 得分 10
给分啊,呵呵Top
8 楼awjx(啦啦啦)回复于 2004-04-09 15:06:31 得分 10
咦!解决啦!Top




