大虾好:
     我在做一个项目,现在牵扯到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信息才行,怎么样才能等到有足够的数据后再处理数据?

解决方案 »

  1.   

    你要先对串口进行一些初始化,如设置波特率,奇偶校验..之类的东西...
    我以前写过用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里面进行数据的采集处理...