ce4.2下串口操作问题

使用的网上的一个串口类CSerial写了一个串口通信程序,可以打开串口,设置参数也没发现错误,但是不能往串口写数据,GetLastError返回6,意思是句柄无效,感觉是在WriteFile的传的串口的句柄无效。

//// Serial.cpp: implementation of the CSerial class.

BOOL CSerial::OpenPort(HWND hpWnd,LPTSTR lpszPortName,UINT baud, BYTE parity, UINT databits, BYTE stopsbits, DWORD dwCommEvents,UINT nBufferSize)
{
DWORD /*dwError,*/dwThreadID;
TCHAR Errordes[64]={0};
if(m_hPort)
{
//先关闭已经打开的串口
ClosePort(m_hPort);
}
//打开串口
m_hPort = CreateFile(lpszPortName, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);
//如果打开端口出错, 返回FALSE
if (m_hPort == INVALID_HANDLE_VALUE)
{
//不能打开端口
wsprintf(Errordes,TEXT("打开端口%s失败, 错误代码=%d"),lpszPortName, GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
return FALSE;
}

wsprintf(Errordes,TEXT("%u"),m_hPort);
MessageBox(this->m_hWnd,Errordes,TEXT("句柄"),MB_OK);
//指定端口监测的事件集
if(!SetCommMask (m_hPort,/*dwCommEvents*/EV_RXCHAR))
{
wsprintf(Errordes,TEXT("SetCommMask失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
//分配设备缓冲区
if(!SetupComm(m_hPort,/*nBufferSize,nBufferSize*/512,512))
{
wsprintf(Errordes,TEXT("SetupComm失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
//初始化缓冲区中的信息
if(!PurgeComm(m_hPort,PURGE_TXCLEAR|PURGE_RXCLEAR))
{
wsprintf(Errordes,TEXT("PurgeComm失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
//配置串行端口
if(!InitDCB(baud,parity,databits,stopsbits))
return FALSE;
//设置端口超时值
if(!InitCommTimeouts())
return FALSE;

//设置端口上指定信号的状态
// SETDTR: 发送DTR (data-terminal-ready)信号
// SETRTS: 发送RTS (request-to-send)信号

if(!EscapeCommFunction (m_hPort, SETDTR))
{
wsprintf(Errordes,TEXT("EscapeCommFunction SETDTR失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
if(!EscapeCommFunction (m_hPort, SETRTS))
{
wsprintf(Errordes,TEXT("EscapeCommFunction SETRTS失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}

//创建一个从串口读取数据的线程

if (m_hReadThread = CreateThread (NULL, 0, ReadPortThread, this, 0,&dwThreadID))
{
m_hExtthread=CreateEvent(NULL,TRUE,FALSE,NULL);
}
else
{
//不能创建线程
//MessageBox (NULL, TEXT("不能创建串口读线程!"),TEXT("错误"), MB_OK);
//dwError = GetLastError ();
//ErrorID2Str();
wsprintf(Errordes,TEXT("CreateThread失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
return FALSE;
}
m_bConnected=TRUE;
return TRUE;
}

DWORD CSerial::WritePort(TCHAR *buf,DWORD dwCharToWrite)
{
BOOL fWriteState;
DWORD dwBytesWritten=0;
TCHAR Errordes[64]={0};
//写入数据
fWriteState=WriteFile(m_hPort,buf,/*dwCharToWrite*/dwCharToWrite*sizeof(TCHAR),&dwBytesWritten,NULL);
MessageBox(this->m_hWnd,buf,buf,MB_OK);
wsprintf(Errordes,TEXT("%d"),dwBytesWritten);
MessageBox(this->m_hWnd,Errordes,TEXT("已写字节数"),MB_OK);
wsprintf(Errordes,TEXT("%d"),GetLastError());
MessageBox(this->m_hWnd,Errordes,TEXT("错误代码"),MB_OK);
wsprintf(Errordes,TEXT("%u"),m_hPort);
MessageBox(this->m_hWnd,Errordes,TEXT("句柄"),MB_OK);
wsprintf(Errordes,TEXT("%d"),fWriteState);
MessageBox(this->m_hWnd,Errordes,TEXT("返回值"),MB_OK);
if(!fWriteState)
{
//不能写数据
//ErrorID2Str();
dwBytesWritten=0;
}
return dwBytesWritten;
}

DWORD CSerial::ReadPortThread(LPVOID lpvoid)
{ return 0;
}

BOOL CSerial::InitDCB(UINT ibaud, BYTE iparity, UINT idatabits, BYTE istopsbits)
{
DCB PortDCB;
//DWORD dwError;
TCHAR Errordes[64]={0};
memset(&PortDCB,0,sizeof(DCB));
PortDCB.DCBlength = sizeof (DCB);

//得到端口的默认设置信息
if(!GetCommState(m_hPort, &PortDCB))
{
wsprintf(Errordes,TEXT("GetCommState失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
//改变DCB结构设置

PortDCB.fBinary = TRUE; //Win32不支持非二进制串行传输模式,必须为TRUE
PortDCB.fParity = TRUE; //启用奇偶校验
PortDCB.fOutxCtsFlow = TRUE; //串行端口的输出由CTS线控制
PortDCB.fOutxDsrFlow = FALSE; //关闭串行端口的DSR流控制
PortDCB.fDtrControl = DTR_CONTROL_ENABLE; //启用DTR线
PortDCB.fDsrSensitivity = FALSE; //如果设为TRUE将忽略任何输入的字节,除非DSR线被启用
//PortDCB.fTXContinueOnXoff = TRUE; //当为TRUE时,如果接收缓冲区已满且驱动程序已传送XOFF字符,将使驱动程序停止传输字符

PortDCB.fTXContinueOnXoff = FALSE;
PortDCB.fOutX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输出
PortDCB.fInX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输入
PortDCB.fErrorChar = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段
PortDCB.fNull = FALSE; //设为TRUE将使串行驱动程序忽略收到的空字节
PortDCB.fRtsControl = RTS_CONTROL_ENABLE; //启用RTS线
PortDCB.fAbortOnError = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段

//PortDCB.StopBits = ONESTOPBIT; //每字节一位停止位
PortDCB.BaudRate = ibaud; //波特率 unsigned long 19200
PortDCB.Parity = iparity; //无奇偶校验 unsigned char NOPARITY EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY,SPACEPARITY
PortDCB.ByteSize = idatabits; //unsigned char 每字节的位数 8
PortDCB.StopBits= istopsbits;//unsigned char ONESTOPBIT ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

//根据DCB结构配置端口

if (!SetCommState (m_hPort, &PortDCB))
{
//不能配置串行端口
wsprintf(Errordes,TEXT("SetCommState失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
return FALSE;
}
return TRUE;
}

BOOL CSerial::InitCommTimeouts()
{
COMMTIMEOUTS CommTimeouts;
TCHAR Errordes[64]={0};
//DWORD dwError;

//得到超时参数
if(!GetCommTimeouts (m_hPort, &CommTimeouts))
{
wsprintf(Errordes,TEXT("GetCommTimeouts失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
}
//改变COMMTIMEOUTS结构设置

CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
CommTimeouts.ReadTotalTimeoutConstant = 1000;
CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
CommTimeouts.WriteTotalTimeoutConstant = 1000;

//设置端口超时值
if (!SetCommTimeouts (m_hPort, &CommTimeouts))
{
//不能设置超时值
//MessageBox (NULL, TEXT("设置time-out参数失败!"), TEXT("错误"), MB_OK);
//ErrorID2Str();
wsprintf(Errordes,TEXT("SetCommTimeouts失败,错误代码=%d"),GetLastError());
MessageBox (NULL, Errordes, TEXT("错误"), MB_OK);
return FALSE;
}

return TRUE;
}

void CSerial::ErrorID2Str()
{
LPVOID lpMsgBuf;
CString rtn;
HMODULE hModule = NULL;
DWORD dwFormatFlags=FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM ;
/*if(dwMessageId >= NERR_BASE && dwMessageId <= MAX_NERR)
{
hModule = LoadLibraryEx(
TEXT("netmsg.dll"),
NULL,
LOAD_LIBRARY_AS_DATAFILE
);

if(hModule != NULL)
dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}*/
DWORD dwMessageId=GetLastError();
FormatMessage(dwFormatFlags,
hModule,
dwMessageId,
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
rtn.Format(TEXT("ID:%d\nMSG:%s"),dwMessageId,(LPCTSTR)lpMsgBuf);
MessageBox(this->m_hWnd,rtn, TEXT("错误"), MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}

////////////////////////////////////////////
////////////////////////////////////////////
WritePort函数总是报错。部知道怎么回事,请高手指点。
[7908 byte] By [najzni-najzni] at [2008-1-9]
# 1
调用writeport函数时候,总是返回错误,“已写字节数”总是“0”,GetLastError()返回6
najzni-najzni at 2007-10-19 > top of Msdn China Tech,硬件/嵌入开发,嵌入开发(WinCE)...
# 2
各位高手,我也希望在我的ARM9 wince 4.2样机中增加串口信息显示功能,类似于terminal那样的软件,哪位朋友愿意帮忙或合作?另外,哪位软件朋友愿意合作开发CAN新产品?谢谢。mfotw@163.com
e32hmi at 2007-10-19 > top of Msdn China Tech,硬件/嵌入开发,嵌入开发(WinCE)...
# 3
无人问津啊?
najzni-najzni at 2007-10-19 > top of Msdn China Tech,硬件/嵌入开发,嵌入开发(WinCE)...