单片机采集电压和电流,把数值传给PC处理!
数据均存放在FS0-FS7中
FS1数据头
FS2数据
FS3人名
FS4人名区位
FS5车型编号通讯协议
一. 通讯格式:
起始位 命令 数据长度 数据1 数据2 数据N 效验位
0xAA 0x01 Data_Long CRC
数据长度=N
CRC=~(0xAA+Data_Long+Command+Data1+Data2+….+DataN)+6二. 命令
计算机发往单片机:
1. 0x01  请求数据  
2. 0x02  人员名单
3. 0x03  机车型号
4. 0x04  机车编号
5. 0x05  数据传输结束
6. 0x06  接收正确
7. 0x07  接收错误请求重发
8. 0x08  接收终止
9. 0x09  删除数据单片机发往计算机:
10. 0x10  是否有数据或有多少帧数据
11. 0x11  开始传输 数据头
12. 0x12  数据
13. 0x13  接收正确
14. 0x14  接收错误请求重发
15. 0x15  接收终止
16. 0x21  一组数据结束
17. 0x22  数据传输结束三. 数据格式
计算机发往单片机:
1. 0x01  请求数据  
起始位 命令 数据长度 效验位
0xAA 0x01 0 CRC2. 0x02  开始发送人员
起始位 命令 数据长度 区位码 数据0 数据31        效验位
0xAA 0x02 34 CRC
数据为点阵码3. 0x03  机车型号
起始位 命令 数据长度 数据0 数据3 台数 效验位
0xAA 0x03 5 ‘D’ CRC
数据为ASCII码4. 0x04  机车编号
起始位 命令 数据长度 机车编号 效验位
0xAA 0x03 2 低 高 CRC
数据为ASCII码5. 0x05 数据传输结束
起始位 命令 数据长度 效验位
0xAA 0x05 0x00 CRC6. 0x06  接收正确
起始位 命令 数据长度 效验位
0xAA 0x06 0x00 CRC7. 0x07  接收错误请求重发
起始位 命令 数据长度 效验位
0xAA 0x07 0x00 CRC8. 0x08  接收终止
起始位 命令 数据长度 效验位
0xAA 0x08 0x00 CRC单片机发往计算机:
9. 0x10 是否有数据或有多少帧数据
起始位 命令 数据长度 帧数 效验位
0xAA 0x10 0x01 低 高 CRC10. 0x11  一组数据头  开始传输
起始位 命令 数据长度 人员 机车型号 机车编号 年 月 日 时 分 秒 效验位
0xAA 0x02 23 CRC11. 0x12  数据
起始位 命令 数据长度 电压 电流 电压 电流 效验位
0xAA 0x02 40 低 高 低 高 CRC
12. 0x13  接收正确
起始位 命令 数据长度 效验位
0xAA 0x13 0x00 CRC13. 0x14 接收错误请求重发
起始位 命令 数据长度 效验位
0xAA 0x14 0x00 CRC14. 0x15  接收终止
起始位 命令 数据长度 效验位
0xAA 0x15 0x00 CRC15. 0x21  一组数据结束
起始位 命令 数据长度 效验位
0xAA 0x21 0x00 CRC16. 0x22  数据传输结束
起始位 命令 数据长度 效验位
0xAA 0x22 0x00 CRC
单片机编程别人已经做好,我只用VC发送或接受单片机传送数据即可.
我懂得一般VC串口编程一般方法,请问:
1."起始位 命令 数据长度 效验位
   0xAA 0x22 0x00 CRC"
中"0xAA"是16进制吗?表示成2进制是"10001000"吗?2.CRC=~(0xAA+Data_Long+Command+Data1+Data2+….+DataN)+6
是什么意思? "~"符号是什么运算? 后面怎么"+6"?3.我懂得一般VC串口编程一般方法,(比如用safearray/DWordarray保存数据,然后用mscomm控件的GetInput和GetOutput接收发送) 这些协议怎么实现??哪位好心大哥给出一条协议的原代码做例子,马上给分!!

解决方案 »

  1.   

    看来楼主还要多看看书啊。问的都是基础问题:
    1、0x开头的数字都是16进制数字,但是0xAA表示成2进制是“10101010”
    2、~就是按位取反的意思,比如~0xAA=0x55(01010101),后面+6是你们自己定的纠错协议吧?
    3、你知道mscomm控件的接收和发送,那就按着上面的协议接/发数据就行了,按照收到的数据作出相应的反应。不懂的话,去www.vckbase.com或者用google找些串口例子来看看。调试的时候用“串口助手”软件来辅助调试。
      

  2.   

    同意 saliors(正在学习中) 的说法
    这还是 crc 算法吗
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=1114  使用Win32创建串口通讯程序
    http://www.vckbase.com/document/listdoc.asp?mclsid=9&sclsid=907&page=1
      

  4.   

    我看见书上写用safearray我觉得很麻烦,发送和接收的数据都是2进制吧,可以用DWordarray吗?
    好心的大哥能给出做一条协议的原代码做例子,在线等,马上给分!!
      

  5.   

    safearray不是很麻烦啊,我这里倒是有个例子,不知道怎么给你
      

  6.   

    打包附件发送到[email protected]
    有用马上给分
    我现在就不知道怎么按照协议来写代码.我把没有协议的秃的消息发/收发出来,希望高手按照
    起始位 命令 数据长度 效验位
    0xAA 0x01 0 CRC
    简单的帮我改哈//接收数据
    void CMscommDemoView::OnComm()
    {
        VARIANT m_input;
        char *str,*str1;
        int k,nEvent,i;
        CString str2,m_RcvData;
        nEvent=m_Comm.GetCommEvent();
    switch(nEvent)
    {
    case 2:
       k=m_Comm.GetInBufferCount();     //接收缓冲区的字符数目
       if(k>0)
       {
       m_input=m_Comm.GetInput();
       str=(char*)(unsigned char*)m_input.parray->pvData;
       }
       i=0;
       str1=str;
       while(i<k)
       {
       i++;
       str1++;
       }
       *str1='\0';                               
           str2=(const char*)str;             //清除字符串中的不必要字符
           m_RcvData=(const char *)str;
       }
    //数据显示处理
    }
    //发送数据
    void CMscommDemoView::SendData()
    {
    int i,Count;
    CString m_SendData;
        m_SendData="Hello!";  
    Count=m_SendData.GetLength();
    CByteArray m_Array;
    m_Array.RemoveAll();
    m_Array.SetSize(Count);
        for(i=0;i<Count;i++)
    m_Array.SetAt(i,m_SendData[i]);
        m_Comm.SetOutput(COleVariant(m_Array));
    }
      

  7.   

    void CMscommDemoView::OnComm()
    {
        VARIANT m_input;
        char *str,*str1;
        int k,nEvent,i;
        CString str2,m_RcvData;
        nEvent=m_Comm.GetCommEvent();
    switch(nEvent)
    {
    case 2:
       k=m_Comm.GetInBufferCount();     //接收缓冲区的字符数目
       if(k>0)
       {
       m_input=m_Comm.GetInput();
       str=(char*)(unsigned char*)m_input.parray->pvData;
       }
       i=0;
       str1=str;
       while(i<k)
       {
       i++;
       str1++;
       }
       *str1='\0';                               
           str2=(const char*)str;             //清除字符串中的不必要字符
           m_RcvData=(const char *)str;
       }
    //数据显示处理
    }
    //发送数据
    void CMscommDemoView::SendData()
    {
    int i,Count;
    CString m_SendData;
        m_SendData="Hello!";  
    Count=m_SendData.GetLength();
    CByteArray m_Array;
    m_Array.RemoveAll();
    m_Array.SetSize(Count);
        for(i=0;i<Count;i++)
    m_Array.SetAt(i,m_SendData[i]);
        m_Comm.SetOutput(COleVariant(m_Array));
    }