大家好,我想接收这样的数据$PMCAG,900,INI,L*4F
!AIVDM,1,1,,B,1DbAFh?P008dlSdFBjkbhrmj0000,0*4F
$GPZDA,014910.14,15,11,2004,,*6C
$GPGGA,,,,,,0,00,,,M,,M,,*66
!AIVDM,1,1,,B,168siA00008ddttFAv9o264F0<0i,0*7D
$GPVTG,,T,,,,N,,K*03
!AIVDM,1,1,,B,177lfd003W`fSa4F8?4<q:@B0l0p,0*02
!AIVDO,1,1,,,1000B<wP?w<tSF0l4Q@>4?wv0P00,0*05
$PMCAG,900,INI,L*4F
!AIVDM,1,1,,A,1696w5?P008dnitFAg=@OFl@0@6k,0*39
!AIVDM,1,1,,A,15C<o<0001`e7QLFAqW@L8tH00Sb,0*38这个是串口的数据,我想提取!AIVDM开头的数据,请问怎么接收呢?
在vc里面的。这里是不是每次接收都得不到一整条数据,要怎么做呢?请给出详细的解释,我对网络传输一点概念都没有,能给例子更好。

解决方案 »

  1.   

    我做过一个串口通讯的软件,本来要求很简单的,但是由于linux内核一直狂打印数据,所以做的后来就复杂了,但是也更加完备了,基本跟SecureCRT差不多了。 我的做法是申请一个COM缓冲区大小一样的缓存(只可以更大些。或者2倍大小)。当WaitCommEvent得到消息后,立即读取缓冲中的数据以追加的方式到缓存,并清空COM缓冲。 在缓存中,如果半条数据,如果是前半条,那就暂存数据,等后半条到达。 如果是一条半数据的话,就读取一条数据。把那半条数据放到缓存的头部,然后其他位置清空。等到后半条到达。 如果是2条半,就读取2条数据,把那半条数据放到缓存的头部,然后其他位置清空。等到后半条到达,这样,就在外部完成了数据的拼接了。分条的时候,以!AIVDM为标志
      

  2.   

    楼主首先应该先了解串口编程方面的基本识识,你才能知道在哪里获取接收到的数据,然后再从这些数据中提取自己想要的信息.
    串口通信有发送方和接收方,两者通信时,数据以字节的形式.下面我给出一段为串口控件添加的响应函数:
    void CCommPortDlg::OnOnCommMscomm() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE); //更新编辑框内容
             VARIANT variant_inp;
            COleSafeArray safearray_inp;
            LONG len,k;
            BYTE rxdata[3072]; //设置BYTE数组 An 8-bit integerthat is not signed.
            CString strtemp;
           if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
            
    variant_inp=m_ctrlComm.GetInput(); //读缓冲区
             safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
             len=safearray_inp.GetOneDimSize(); //得到有效数据长度
             for(k=0;k<len;k++)
                safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
    if(m_ctrlHexReceive.GetCheck())//如果选择十六进制接
             {
                for(k=0;k<len;k++) //将数组转换为CString型变量
        {
                    BYTE bt=*(char*)(rxdata+k); //字符型
                 
             strtemp.Format("%02x ",bt);count1++;//将字符送入临时变量strtemp存放
                 
             m_ReceiveData+=strtemp; //加入接收编辑框对应字符串 
         }
             }
     else//如果选择一般接收,即发什么接收什么.
     { 
           for(k=0;k<len;k++) //将数组转换为Cstring型变量
            {
                       BYTE bt=*(char*)(rxdata+k); //字符型
                          strtemp.Format("%c",bt);count1++;//将字符送入临时变量strtemp存放
                 
       m_ReceiveData+=strtemp; //加入接收编辑框对应字符串 
             }
       }
            }
            UpdateData(FALSE); //更新编辑框内容
    }
    这里我只是提供了一些接收数据的代码,接收到这些数据后就可以有选择地获取有用信息了.(这应该很简单,不作详细说明)
    建议楼主先了解CMSCOMM控件,以及其相关属性.
      

  3.   

    接收数据用pcom动态库就可以很容易实现了,剩下的就是字符串处理的问题吧!