WINAPI串口发送不了数据

清风水岸 2009-08-22 10:20:25
程序为基于对话框的程序,使用WINAPI作为串口操作方式。查过很多资料,但是还是没搞清楚到底哪个地方出问题了,特发江湖救急令,希望各位多多帮助。具体串口部分代码如下:
串口初始化:
m_bConnected=FALSE;
m_pThread=NULL;
m_nBaud = 9600;
m_nDataBits = 8;
m_nParity = 0;
m_sPort = "COM1";
m_nStopBits = 0;
在OnInitDlg中初始化相关事件:
//为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号的
if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
return FALSE;
//初始化读写Overlapped对象
memset(&m_osRead, 0, sizeof(OVERLAPPED));
memset(&m_osWrite, 0, sizeof(OVERLAPPED));

if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;

if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
串口监听线程:
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&os, 0, sizeof(OVERLAPPED));
CDAConvertDlg *pDlg=(CDAConvertDlg*)pParam;

os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
while(pDlg->m_bConnected)
{
ClearCommError(pDlg->m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
// ÎÞÏ޵ȴýWM_COMMNOTIFYÏûÏ¢±»´¦ÀíÍê
WaitForSingleObject(pDlg->m_hPostMsgEvent, INFINITE);
ResetEvent(pDlg->m_hPostMsgEvent);
//֪ͨÖ÷´°¿Ú
PostMessage(pDlg->m_hWnd,WM_COMMNOTIFY,EV_RXCHAR,0);
continue;
}
dwMask=0;
if(!WaitCommEvent(pDlg->m_hCom, &dwMask, &os)) // Öصþ²Ù×÷
{
if(GetLastError()==ERROR_IO_PENDING)
// ÎÞÏ޵ȴýÖصþ²Ù×÷½á¹û
GetOverlappedResult(pDlg->m_hCom, &os, &dwTrans, TRUE);
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
}
CloseHandle(os.hEvent);
return 0;
}
串口打开:
BOOL CDAConvertDlg::OpenConnection()
{
COMMTIMEOUTS TimeOuts;
m_hTermWnd=GetSafeHwnd();
if(m_bConnected)
{
return FALSE;
}
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if(m_hCom==INVALID_HANDLE_VALUE)
return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
SetCommMask(m_hCom, EV_RXCHAR);

TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;

TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(ConfigConnection())
{
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED, NULL);
if(m_pThread==NULL)
{
CloseHandle(m_hCom);
return FALSE;
}
else
{
m_bConnected=TRUE;
m_pThread->ResumeThread();
}
}
else
{
CloseHandle(m_hCom);
return FALSE;
}
return TRUE;
}
写串口:
DWORD CDAConvertDlg::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;

ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);

if(!fState)
{

if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// µÈ´ý
}
else
length=0;
}
return length;
}
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2009-08-22
  • 打赏
  • 举报
回复
//开始下载时:
// set thread "Watch write" and start running
if (m_bConnected)
{
if ((m_pThreadWrite=AfxBeginThread(CommWatchWrite,this))==NULL)
{
AfxMessageBox("Create thread CommWatchWrite() failed !",MB_ICONSTOP);
m_bConnected=FALSE;
OnStop();// close dialog
return;
}
else
{
m_pThreadWrite->SetThreadPriority(THREAD_PRIORITY_NORMAL);
m_pThreadWrite->ResumeThread();
}
}
schlafenhamster 2009-08-22
  • 打赏
  • 举报
回复
// a work thread . to write bytes to comm
UINT CDload::CommWatchWrite(LPVOID lpParam)
{ // return 0=OK 1=error
CString txtout;
CDload *pDload=(CDload*)lpParam;
UINT nTxBufLen=0;
WORD BytesWritten=0;
WORD BlockCount=0;

// open file and read
CFile ArcFile;
ArcFile.Open(pDload->SelectedFileName,CFile::modeRead);
ULONG flen=ArcFile.GetLength();

// read whole file
BYTE *read_buf=new BYTE[flen];
ArcFile.Read(read_buf,flen);
ArcFile.Close();
// start down load
while (flen>0 ) //
{
if (!pDload->m_bConnected) break;
// write block after block
if (flen>=BUFLEN) nTxBufLen=BUFLEN;
else nTxBufLen=flen;// the rest
flen-=nTxBufLen;// minimun =0
BytesWritten=pDload->WriteCommBlock(&read_buf[BlockCount*BUFLEN],nTxBufLen);

if (BytesWritten>0)
{ // writting OK tell main to show
ResetEvent(pDload->m_hPostEventWrite);// first reset
BOOL posted=pDload->PostMessage(WM_COMMNOTIFY,
(WPARAM)1, // "WatchWrite"
MAKELONG(BytesWritten,BlockCount));
// wait answer
WaitForSingleObject(pDload->m_hPostEventWrite,0xFFFFFFFF);
}
else
{ // BytesWritten=0.An error
pDload->m_bLoadStop=1;// failed
if (read_buf) delete [] read_buf;
return 1;// error
}
if( flen==0) // finish
{
pDload->m_bFinish=1;
break;
}
BlockCount++;
}
if (read_buf) delete [] read_buf;
return 0;// return OK and auto-deleted
}
schlafenhamster 2009-08-22
  • 打赏
  • 举报
回复
int CDload::WriteCommBlock(BYTE *pBlock,int nBlockLen)
{ //return 0 if error
DWORD dwBytesWritten;
DWORD dwModemStat;
int WaitErr;
BOOL fWriteStat;

if (!m_bConnected) return 0;
dwBytesWritten=0;
fWriteStat=WriteFile(m_idComDev,pBlock,nBlockLen,&dwBytesWritten,&m_osWrite);
if(!fWriteStat)
{ // Writting wait
if (GetLastError()==ERROR_IO_PENDING)
{ // if writting processing
if (WaitErr=WaitForSingleObject(m_osWrite.hEvent,60000)) // 1 minute
{ // WaitErr!=0
if(WaitErr==WAIT_TIMEOUT)
{ // time out
KillTimer(1);
// if device error!
GetCommModemStatus(m_idComDev,&dwModemStat);
if(dwModemStat &= MS_CTS_ON) // if (CTS_ON && TIME_OUT) then COMM Hardware Errors.
{ // 16 "GREEN"
AfxMessageBox("COMM Device hardware errors.",MB_ICONSTOP);// don't move
m_bLoadStop=1;
dwBytesWritten=0;
}
else
{ // 0 "RED"
AfxMessageBox("CTS timer 60 seconds out!",MB_ICONSTOP);
m_bLoadStop=1;
dwBytesWritten=0;
}
}
}
else
{ // WaitErr=0.if you SetEvent(m_osWrite.hEvent) anywhere else
GetOverlappedResult(m_idComDev,&m_osWrite,&dwBytesWritten,FALSE);
m_osWrite.Offset +=dwBytesWritten;
}
}
}
return (int)dwBytesWritten;
}
清风水岸 2009-08-22
  • 打赏
  • 举报
回复
另外说一下,程序中接收是可以的。唯一的问题就是现在死活发送不了数据GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);中的length不管发多少数据都为零。利用串口工具测试硬件部分可行。
清风水岸 2009-08-22
  • 打赏
  • 举报
回复
如大家有经过测试的可使用VC++串口程序,最好是利用WINAPI编写的,而且需要利用多线程的方式来编写,利用消息驱动。请发至zhaochenglong08@126.com。急用,在线等。预先感谢大家一下。
清风水岸 2009-08-22
  • 打赏
  • 举报
回复
重新写了一下。现在搞定了。哎,郁闷,搞了两天。不过还好现在搞定了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧