大虾好:
我在做一个项目,现在牵扯到PC端的串口数据提取,遇到了麻烦,具体是这样的:
我用MCSComm控件做了接收的程序(为了省事),我需要把串口接受到的GPS定位信息的经纬度提取出来,于是定义了
CString m_strReceived;//存储串口接收的数据
当接收到数据后再调用提取经纬度的子程序
void AnalyseGPRMC();//分析接收到的语句
问题是,当执行AnalyseGPRMC()时,串口仍然在接收数据,
void CTaskView::OnComm()
{
//定义变量
if(m_MSComm.GetCommEvent()==2) //触发
{
//字符存入m_strReceived
}
AnalyseGPRMC();//分析数据
}
程序的结构时这样的,没次运行都会死掉。我想可能是线程的问题(猜的),看资料发现许多人都在用自己编写的串口类作程序,但是我看不懂(VC学的不好),来到CSDN把问题贴出来,请大家帮忙....
1.我用MSComm控件继续编程呢还是也去学习用串口类?
2.如何解决程序要实时接收串口数据,而程序又要完成GPS数据的处理?
3.我发现串口没次接收14个字符,而要完成GPS数据的处理至少需要很多条GPS信息才行,怎么样才能等到有足够的数据后再处理数据?
我在做一个项目,现在牵扯到PC端的串口数据提取,遇到了麻烦,具体是这样的:
我用MCSComm控件做了接收的程序(为了省事),我需要把串口接受到的GPS定位信息的经纬度提取出来,于是定义了
CString m_strReceived;//存储串口接收的数据
当接收到数据后再调用提取经纬度的子程序
void AnalyseGPRMC();//分析接收到的语句
问题是,当执行AnalyseGPRMC()时,串口仍然在接收数据,
void CTaskView::OnComm()
{
//定义变量
if(m_MSComm.GetCommEvent()==2) //触发
{
//字符存入m_strReceived
}
AnalyseGPRMC();//分析数据
}
程序的结构时这样的,没次运行都会死掉。我想可能是线程的问题(猜的),看资料发现许多人都在用自己编写的串口类作程序,但是我看不懂(VC学的不好),来到CSDN把问题贴出来,请大家帮忙....
1.我用MSComm控件继续编程呢还是也去学习用串口类?
2.如何解决程序要实时接收串口数据,而程序又要完成GPS数据的处理?
3.我发现串口没次接收14个字符,而要完成GPS数据的处理至少需要很多条GPS信息才行,怎么样才能等到有足够的数据后再处理数据?
我以前写过用MSCOMM的控件进行串口通讯的软件.先进行如下初始化:
if(!m_cCommData.get_PortOpen()) //读取端口的状态,判断是否打开...
{
m_cCommData.put_CommPort(2); //设置串口编号为2.即COM2,其中之一编号的大小是com1~com16
m_cCommData.put_PortOpen(TRUE); //打开端口TRUE--->打开,FALSE--->关闭
}m_cCommData.put_DTREnable(FALSE); //设置数据终端与其它设备通信时状态为FALSE表示计算机尚未准备好..
m_cCommData.put_InputMode(1); //设置从输入缓冲区中读取数据的方法.0为表示以文本方式,1表示是以二进制方式..
m_cCommData.put_Settings("9600,n,8,1");//设置串口通信通信参数采集数据的串口波特率为9600,'n'奇偶较验位中的偶较验,8表示数据位.1为S位停止位.m_cCommData.put_RThreshold(1); //设置阈值,当缓冲区的的字符数为1时,产生了一个ONCOMMmscom2的事件.
m_cCommData.put_InputLen(0); //读取整个缓冲区的里的内容.
m_cCommData.get_Input(); //从输入缓冲区中的读取数据,该函数执行后将删除缓冲区中的数据..
然后才能在ONMSCOMM里面进行数据的采集处理...