一个读Gps时间的vc程序,在调试状态下能正确执行,但是直接运行却结果不正确,请问
一个读Gps时间的vc程序,在调试状态下能正确执行,但是直接运行却结果不正确,请教
程序比较简单,就是在对话框中建立一个MSCOMM控件(利用向导),然后在对话框onInitDialog()函数中初始化串口设置,在OnCommMscom事件中记录GPS的时间。写入文件,
调试下能够正确读到数据,但是直接运行记录的数据却不正确。
代码如下:
初始化:
BOOL CComutiDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if(m_ComPort.GetPortOpen())
{
m_ComPort.SetPortOpen(FALSE);
}
m_ComPort.SetCommPort(1); //选择1号串口
m_ComPort.SetInBufferSize(1024); //接收缓冲区
m_ComPort.SetOutBufferSize(1024);//发送缓冲区
m_ComPort.SetInputMode(1); //以二进制方式输入
m_ComPort.SetSettings( "9600,n,8,1 "); //设置波特率等参数
//设置为1表示当串口接受缓冲区中有多于或等于1个字符时
//将引发一个关于comExReceive的事件
m_ComPort.SetRThreshold(1);
if(!m_ComPort.GetPortOpen())//如果串口没有打开则打开
m_ComPort.SetPortOpen(TRUE);//打开串口
else
m_ComPort.SetOutBufferCount(0);
m_ComPort.GetInput(); //预读缓冲区以清除残留数据
return TRUE; // return TRUE unless you set the focus to a
}
onCommMscom事件
void CComutiDlg::OnOnCommMscom()
{
VARIANT vResponse;
int k;
if(2 == m_ComPort.GetCommEvent())//判断comEvReceive事件是否发生
{
iCount++;
//如果是第一次记录,则记录GPS的时间
if(1 == iCount)
{
k = m_ComPort.GetInBufferCount();
if(k> 0)
{
m_ComPort.SetInputLen(k);
vResponse = m_ComPort.GetInput(); //读取接受到的数据
TCHAR szBuffer[500];
_stprintf(szBuffer,_T( "%s "),(char*)vResponse.parray-> pvData);
s "),szBuffer);
*******************************************************
FILE * myFile = 0;
myFile = fopen( "lifuqiong.dat ", "wb ");
if(myFile)
{
for(int i=0;i <500;i++)
{
if(0 > fwrite(&szBuffer[i],1,1,myFile))
{
fclose(myFile);
}
}
fclose(myFile);
}
**************************************************************
SaveData(k,(unsigned char*)vResponse.parray-> pvData);//保存接受到的数据
}
}
else
{
//DestroyWindow();
CDialog::OnOK();
}
//else
// break;
}
}
其中onCommMscom事件中iCount变量是为了记录响应事件的次数,如果响应一次则记录GPS的时间,否则不记录。两行*****之间的代码是为了测试运行时vResponse.parray-> pvData 的值,发现问题就是在这个值上,但是不知道为什么两种情况下该值不一样,请教大家了。
------解决方案--------------------
调试下能够正确读到数据,但是直接运行记录的数据却不正确。
说明是时间的问题,调试时运行的慢,数据都过来了,所以对。直接时,运行速度快,数据还没过来就读去了,所以错。
k = m_ComPort.GetInBufferCount();
if(k> 0)
这个地方,假如就来了3个数据,k就大于0,你就开始读了,但数据不完全。建议Sleep(1000);
程序比较简单,就是在对话框中建立一个MSCOMM控件(利用向导),然后在对话框onInitDialog()函数中初始化串口设置,在OnCommMscom事件中记录GPS的时间。写入文件,
调试下能够正确读到数据,但是直接运行记录的数据却不正确。
代码如下:
初始化:
BOOL CComutiDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if(m_ComPort.GetPortOpen())
{
m_ComPort.SetPortOpen(FALSE);
}
m_ComPort.SetCommPort(1); //选择1号串口
m_ComPort.SetInBufferSize(1024); //接收缓冲区
m_ComPort.SetOutBufferSize(1024);//发送缓冲区
m_ComPort.SetInputMode(1); //以二进制方式输入
m_ComPort.SetSettings( "9600,n,8,1 "); //设置波特率等参数
//设置为1表示当串口接受缓冲区中有多于或等于1个字符时
//将引发一个关于comExReceive的事件
m_ComPort.SetRThreshold(1);
if(!m_ComPort.GetPortOpen())//如果串口没有打开则打开
m_ComPort.SetPortOpen(TRUE);//打开串口
else
m_ComPort.SetOutBufferCount(0);
m_ComPort.GetInput(); //预读缓冲区以清除残留数据
return TRUE; // return TRUE unless you set the focus to a
}
onCommMscom事件
void CComutiDlg::OnOnCommMscom()
{
VARIANT vResponse;
int k;
if(2 == m_ComPort.GetCommEvent())//判断comEvReceive事件是否发生
{
iCount++;
//如果是第一次记录,则记录GPS的时间
if(1 == iCount)
{
k = m_ComPort.GetInBufferCount();
if(k> 0)
{
m_ComPort.SetInputLen(k);
vResponse = m_ComPort.GetInput(); //读取接受到的数据
TCHAR szBuffer[500];
_stprintf(szBuffer,_T( "%s "),(char*)vResponse.parray-> pvData);
s "),szBuffer);
*******************************************************
FILE * myFile = 0;
myFile = fopen( "lifuqiong.dat ", "wb ");
if(myFile)
{
for(int i=0;i <500;i++)
{
if(0 > fwrite(&szBuffer[i],1,1,myFile))
{
fclose(myFile);
}
}
fclose(myFile);
}
**************************************************************
SaveData(k,(unsigned char*)vResponse.parray-> pvData);//保存接受到的数据
}
}
else
{
//DestroyWindow();
CDialog::OnOK();
}
//else
// break;
}
}
其中onCommMscom事件中iCount变量是为了记录响应事件的次数,如果响应一次则记录GPS的时间,否则不记录。两行*****之间的代码是为了测试运行时vResponse.parray-> pvData 的值,发现问题就是在这个值上,但是不知道为什么两种情况下该值不一样,请教大家了。
------解决方案--------------------
调试下能够正确读到数据,但是直接运行记录的数据却不正确。
说明是时间的问题,调试时运行的慢,数据都过来了,所以对。直接时,运行速度快,数据还没过来就读去了,所以错。
k = m_ComPort.GetInBufferCount();
if(k> 0)
这个地方,假如就来了3个数据,k就大于0,你就开始读了,但数据不完全。建议Sleep(1000);