1. // HelloWorld.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. /*****************************************************************************
  5. * VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
  6. * 声明:
  7. * 1. 这是在《VC++ 6.0 C8051F340 USB PC侧通信 Demo》的基础上的代码;
  8. * 2. 由一可知,本文会只注释了相对重要的内容。
  9. * 3. 本文主要是通过USB获取CAN的数据,并解析出其中的数据。
    * 4. 帧格式可以参考:http://wenku.baidu.com/view/f508511d6bd97f192279e902.html
  10. *
  11. * 2015-7-11 晴 深圳 南山平山村 曾剑锋
  12. ****************************************************************************/
  13.  
  14. #include "stdafx.h"
  15. #include <windows.h>
  16. #include <time.h>
  17. #include "SiUSBXp.h"
  18. #include <string.h>
  19.  
  20. int main(int argc, char* argv[])
  21. {
  22. printf("Hello World!\n");
  23.  
  24. HANDLE m_hUSBDevice = INVALID_HANDLE_VALUE;
  25. DWORD dwNumDevices = ;
  26.  
  27. SI_GetNumDevices(&dwNumDevices);
  28. printf("zengjf debug: dwNumDevices = %d.\n", dwNumDevices);
  29. if ( dwNumDevices == )
  30. return FALSE;
  31.  
  32. if ( SI_Open(, &m_hUSBDevice) == SI_SUCCESS )
  33. printf("zengjf debug: SI_Open USBDevice success.\n");
  34. else
  35. printf("zengjf debug: SI_Open USBDevice fails.\n");
  36.  
  37. char testData[] = "zengjf";
  38. DWORD hasWritten = ;
  39. DWORD hasRead = ;
  40. DWORD timeCount = ;
  41.  
  42. while ( true ) {
  43.  
  44. Sleep();
  45.  
  46. // 接收6帧数据就退出程序,作为测试程序,这个量也就差不多了
  47. if ( timeCount++ > )
  48. break;
  49.  
  50. memset(testData, , sizeof(testData));
  51.  
  52. if ( SI_Read( m_hUSBDevice, testData, , &hasRead) == SI_SUCCESS ) {
  53. printf("zengjf debug: SI_Read USBDevice success, hasRead length = %d.\n", hasRead);
  54.  
  55. // 以16进制的形式打印出接收到的一帧数据
  56. printf("printf all data:\n\t");
  57. for ( DWORD i = ; i < hasRead; i++ )
  58. printf(" %02x ", testData[i] & 0xff);
  59. printf("\n");
  60.  
  61. // 判断接收到的数据是远程帧,还是数据帧
  62. if ( testData[] & ( << ) )
  63. printf("Frame Format: Remote Frame.\n");
  64. else
  65. printf("Frame Format: Data Frame.\n");
  66.  
  67. // 输出数据长度
  68. printf("Frame data length: %d.\n", testData[] & 0xf);
  69.  
  70. // 输出是扩展帧,还是标准帧
  71. if ( testData[] & ( << ) ) {
  72.  
  73. printf("Frame Type: Extend Frame.\n");
  74. // 解析扩展帧的ID
  75. printf("ID: %X.\n", (((testData[] & 0x0ff) << ) | \
  76. ((testData[] & 0x0ff) << ) | \
  77. ((testData[] & 0x0ff) << ) | \
  78. ((testData[] >> ) & 0x1f)));
  79.  
  80. // 将二进制数值转换成字符数字
  81. for ( DWORD i = ; i < hasRead; i++ )
  82. testData[i] += '';
  83.  
  84. // 显示所有的接收的数据
  85. printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+);
  86.  
  87. } else {
  88.  
  89. printf("Frame Type: Standard Frame.\n");
  90. // 解析标准帧的ID
  91. printf("ID: %X.\n", (((testData[] & 0x0ff) << ) | ((testData[] >> ) & 0x7)));
  92.  
  93. // 将二进制数值转换成字符数字
  94. for ( DWORD i = ; i < hasRead; i++ )
  95. testData[i] += '';
  96.  
  97. // 显示所有的接收的数据
  98. printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+);
  99.  
  100. }
  101.  
  102. } else {
  103. printf("zengjf debug: SI_Read USBDevice fails.\n");
  104. break;
  105. }
  106. }
  107.  
  108. if ( SI_Close(m_hUSBDevice) == SI_SUCCESS )
  109. printf("zengjf debug: SI_Close USBDevice success.\n");
  110. else
  111. printf("zengjf debug: SI_Close USBDevice fails.\n");
  112.  
  113. return ;
  114. }

VC++ 6.0 C8051F340 USB 通信 CAN 数据解析的更多相关文章

  1. VC++ 6.0 C8051F340 USB PC侧通信 Demo

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

  2. VC++ 6.0 C8051F340 MFC programming note

    /************************************************************************************** * VC++ 6.0 C ...

  3. 使用Wireshark捕捉USB通信数据

    USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.USB接口支持设备的即插即用和热插拔功能 ...

  4. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  5. VC++ 6.0中实现三叉切分窗口与多视图 [转]

    一.引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图.应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一 ...

  6. usb通信小结

    2010-07-25 16:52:00 目前了解了usb通信层面的一些基础知识如下.如果有空还要再了解hid报告描述符及协议的数据包波形. 一,USB的一些基本概念 1. 管道(Pipe) 是主机和设 ...

  7. 基于usb4java实现的java下的usb通信

    项目地址:点击打开 使用java开发的好处就是跨平台,基本上java的开发的程序在linux.mac.MS上都可以运行,对应这java的那句经典名言:一次编写,到处运行.这个项目里面有两种包选择,一个 ...

  8. C8051F340 USB Fn hacking

    /************************************************************************************ * C8051F340 US ...

  9. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

随机推荐

  1. 《剑指offer》第三十五题(复杂链表的复制)

    // 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...

  2. C#中正确使用enum做Key的姿势

    C#中自定义enum,然后将其作为Dictionary的Key,通常的做法如下: using System; using System.Text; using System.Collections.G ...

  3. JPA、SpringData JPA 、Hibernate和Mybatis 的区别和联系

    一.JPA 概述 1. Java Persistence API(Java 持久层 API):用于对象持久化的 API 2. 作用:使得应用程序以统一的方式访问持久层 3. 前言中提到了 Hibern ...

  4. C#实现的UDP收发请求工具类实例

    本文实例讲述了C#实现的UDP收发请求工具类.分享给大家供大家参考,具体如下: 初始化: ListeningPort = int.Parse(ConfigurationManager.AppSetti ...

  5. IE6不兼容hover已解决

    新建一个csshover.htc文件,一下是csshover.htc内容 <public:attach event="ondocumentready" onevent=&qu ...

  6. stl算法:next_permutation剖析

    在标准库算法中,next_permutation应用在数列操作上比较广泛.这个函数可以计算一组数据的全排列.但是怎么用,原理如何,我做了简单的剖析. 首先查看stl中相关信息.函数原型: templa ...

  7. iframe刷新父页面

    iframe页面是内嵌到父页面的,当点击iframe页面的服务器控件时,默认只刷新iframe页面,父页面是不会刷新的.若想刷新父页面,可以使用js来实现,如 1. parent.location.r ...

  8. IOS7 UI设计的十大准则

    陈子木 iOS7 的用户界面设计比以往更卓越,并为用户提供了更具吸引力的独特体验,带来更大的机遇.在正式写代码之前,认真考虑UI设计是否符合这十条设计准则,可以提高App的可用性与吸引力.如果要更深入 ...

  9. AOJ2025 Eight Princes

    我们查看更一般的情况,设人数为m 则n < m * 2无解 然后n为奇数的情况: 我们把一个人和一个空格打包,于是剩下m个"人"和n - m个空格,随便排列这些"人 ...

  10. POJ 1128 拓扑排序 + 深搜

    /* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程.至于为什么要深搜嘛..一个月前敲得题现在全部推了重敲,于是明白了.因为题意要求如果有多个可能的解的话. * 就要输出字典序最小的那个.所以可以对2 ...