游戏开发论坛

 找回密码
 立即注册
搜索
查看: 984|回复: 0

设置断点可以读,快速运行后,却读不到发送来的数据wxh zt?

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-2-10 20:36:00 | 显示全部楼层 |阅读模式
一个串口不能实时读入数据的问题
--------
我的程序中的工程为: 基于对话框的应用程序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;

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 10:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表