|
|
一个串口不能实时读入数据的问题
--------
我的程序中的工程为: 基于对话框的应用程序player
程序的目的是
串口监视从串口发送来的数据,然后根据从串口读入的数值去打开相应的位图 问题在下面的程序的注释中
UINT CommProc(LPVOID pParam) //线程函数
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
CPlayerDlg dlg;
while(dlg.ConfigConnection ())
{
ClearCommError(dlg.m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject(dlg.m_hPostMsgEvent, INFINITE);
ResetEvent(dlg.m_hPostMsgEvent);
continue;
}
dwMask=0;
if(!WaitCommEvent(dlg.m_hCom, &dwMask, &os)) // 重叠操作
{
if(GetLastError()==ERROR_IO_PENDING)
// 无限等待重叠操作结果
GetOverlappedResult(dlg.m_hCom, &os, &dwTrans, TRUE);
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
}
CloseHandle(os.hEvent);
return 0;
}
在BOOL CPlayerDlg::OnInitDialog()中加入:
if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
return FALSE;
if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
memset(&m_osRead, 0, sizeof(OVERLAPPED));
// OpenConnection();
COMMTIMEOUTS TimeOuts;
int nLength;
char buf[6];
int k=0;
CPlayerDlg dlg;
DCB dcb;
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags,dwLength;
m_hTermWnd=GetSafeHwnd();
// if(ConfigConnection())
// return FALSE;
m_hCom=CreateFile("COM1", 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);
if(!GetCommState(m_hCom, &dcb))
return FALSE;
dcb.BaudRate=4800;
dcb.StopBits=ONESTOPBIT;
dcb.Parity=NOPARITY;
dcb.fParity=FALSE;
SetCommState(m_hCom, &dcb);
SetCommMask(m_hCom, EV_RXCHAR);//设置通讯标志 为什么EV_RXCHAR(接收到一个字符,并放入缓冲区)不能够控制串口呢?
// SetCommMask(m_hCom, EV_BREAK);
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
/* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
EscapeCommFunction ( m_hCom , CLRRTS ) ; //清除RTS信号 为什么不起控制作用呢?
FlushFileBuffers ( m_hCom ) ;为了保证缓冲中的所有数据都发送完
// if(ConfigConnection())
// {
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
if(m_pThread==NULL)
{
CloseHandle(m_hCom);
return FALSE;
}
else
{
// ConfigConnection();
m_pThread->ResumeThread(); // 恢复线程运行
}
memset(buf,0,1);
ReadComm(buf,1); //读串口函数
现在的问题是:不设断点,直接运行程序,从串口发送01到PC机串口,程序什么图都不打开,于是我跟踪了一下程序:
当我在ReadComm(buf,1)处设置断点,快速运行程序在此处停止下来,此时,我发送01到串口,程序能够读到01这个数据,而我在下面的k+=buf[0];处设置断点,同时向串口发送01数据(一次或多次发送),程序运行到断点处停止下来后,我观察buf[0]中却是空的?请问这是为什么呢? k+=buf[0];
ss.Format("%d",k);
FileChoice(ss); //根据ss值,调用fileChoice()函数,该函数是为了打开位图的,
DWORD CPlayerDlg::ReadComm(char *buf, DWORD dwLength) //读串口发送来的数据
{
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength, ComStat.cbInQue);
ReadFile(m_hCom,buf,length,&length,&m_osRead);
return length;
}
|
|