VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
// HelloWorld.cpp : Defines the entry point for the console application.
// /*****************************************************************************
* VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
* 声明:
* 1. 这是在《VC++ 6.0 C8051F340 USB PC侧通信 Demo》的基础上的代码;
* 2. 由一可知,本文会只注释了相对重要的内容。
* 3. 本文主要是通过USB获取CAN的数据,并解析出其中的数据。
* 4. 帧格式可以参考:http://wenku.baidu.com/view/f508511d6bd97f192279e902.html
*
* 2015-7-11 晴 深圳 南山平山村 曾剑锋
****************************************************************************/ #include "stdafx.h"
#include <windows.h>
#include <time.h>
#include "SiUSBXp.h"
#include <string.h> int main(int argc, char* argv[])
{
printf("Hello World!\n"); HANDLE m_hUSBDevice = INVALID_HANDLE_VALUE;
DWORD dwNumDevices = ; SI_GetNumDevices(&dwNumDevices);
printf("zengjf debug: dwNumDevices = %d.\n", dwNumDevices);
if ( dwNumDevices == )
return FALSE; if ( SI_Open(, &m_hUSBDevice) == SI_SUCCESS )
printf("zengjf debug: SI_Open USBDevice success.\n");
else
printf("zengjf debug: SI_Open USBDevice fails.\n"); char testData[] = "zengjf";
DWORD hasWritten = ;
DWORD hasRead = ;
DWORD timeCount = ; while ( true ) { Sleep(); // 接收6帧数据就退出程序,作为测试程序,这个量也就差不多了
if ( timeCount++ > )
break; memset(testData, , sizeof(testData)); if ( SI_Read( m_hUSBDevice, testData, , &hasRead) == SI_SUCCESS ) {
printf("zengjf debug: SI_Read USBDevice success, hasRead length = %d.\n", hasRead); // 以16进制的形式打印出接收到的一帧数据
printf("printf all data:\n\t");
for ( DWORD i = ; i < hasRead; i++ )
printf(" %02x ", testData[i] & 0xff);
printf("\n"); // 判断接收到的数据是远程帧,还是数据帧
if ( testData[] & ( << ) )
printf("Frame Format: Remote Frame.\n");
else
printf("Frame Format: Data Frame.\n"); // 输出数据长度
printf("Frame data length: %d.\n", testData[] & 0xf); // 输出是扩展帧,还是标准帧
if ( testData[] & ( << ) ) { printf("Frame Type: Extend Frame.\n");
// 解析扩展帧的ID
printf("ID: %X.\n", (((testData[] & 0x0ff) << ) | \
((testData[] & 0x0ff) << ) | \
((testData[] & 0x0ff) << ) | \
((testData[] >> ) & 0x1f))); // 将二进制数值转换成字符数字
for ( DWORD i = ; i < hasRead; i++ )
testData[i] += ''; // 显示所有的接收的数据
printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+); } else { printf("Frame Type: Standard Frame.\n");
// 解析标准帧的ID
printf("ID: %X.\n", (((testData[] & 0x0ff) << ) | ((testData[] >> ) & 0x7))); // 将二进制数值转换成字符数字
for ( DWORD i = ; i < hasRead; i++ )
testData[i] += ''; // 显示所有的接收的数据
printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+); } } else {
printf("zengjf debug: SI_Read USBDevice fails.\n");
break;
}
} if ( SI_Close(m_hUSBDevice) == SI_SUCCESS )
printf("zengjf debug: SI_Close USBDevice success.\n");
else
printf("zengjf debug: SI_Close USBDevice fails.\n"); return ;
}
VC++ 6.0 C8051F340 USB 通信 CAN 数据解析的更多相关文章
- VC++ 6.0 C8051F340 USB PC侧通信 Demo
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- VC++ 6.0 C8051F340 MFC programming note
/************************************************************************************** * VC++ 6.0 C ...
- 使用Wireshark捕捉USB通信数据
USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.USB接口支持设备的即插即用和热插拔功能 ...
- 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
- VC++ 6.0中实现三叉切分窗口与多视图 [转]
一.引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图.应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一 ...
- usb通信小结
2010-07-25 16:52:00 目前了解了usb通信层面的一些基础知识如下.如果有空还要再了解hid报告描述符及协议的数据包波形. 一,USB的一些基本概念 1. 管道(Pipe) 是主机和设 ...
- 基于usb4java实现的java下的usb通信
项目地址:点击打开 使用java开发的好处就是跨平台,基本上java的开发的程序在linux.mac.MS上都可以运行,对应这java的那句经典名言:一次编写,到处运行.这个项目里面有两种包选择,一个 ...
- C8051F340 USB Fn hacking
/************************************************************************************ * C8051F340 US ...
- Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件
最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...
随机推荐
- Could NOT find SDL_image (missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)
sudo apt-get install libsdl-image1.2-dev
- python 获取本地语言和编码的代码
#! /usr/bin/env python # encoding=utf8 import locale language, encoding = locale.getdefaultlocale() ...
- RabbitMQ入门_09_TTL
参考资料:https://www.rabbitmq.com/ttl.html A. 为队列设置消息TTL TTL 是 Time-To-Live 的缩写,指的是存活时间.RabbitMQ 可以为每一个队 ...
- lambda表达式/对象引用计数
★lambda表达式的用法例:I=[(lambda x: x*2),(lambda y: y*3)]调用:for x in I: print x(2)输出:4,6 ★获取对象的引用次数sys.getr ...
- yii第二步
yii第二步: main.php 'urlManager'=>array('urlFormat'=>'path','rules'=>array('game/guess/<g:\ ...
- AndroidStudio使用偷懒插件Butterknife和GsonFormat
1.Android ButterKnife Zelezny Android Studio上安装插件,如图: 配合ButterKnife实现注解,从此不用写findViewById,想着就爽啊.在Act ...
- Confluence 6 连接到一个 LDAP 目录
https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory
- Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)
大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其 ...
- array_unshift
<!DOCTYPE html> <html> <body> <?php $a=array(0=>"red",1=>" ...
- HDU-3507 Print Article (斜率优化)
题目大意:将n个数分成若干个区间,每个区间的代价为区间和的平方加上一个常数m,求最小代价. 题目分析:定义状态dp(i)表示前 i 个数已经分好的最小代价,则状态转移方程为 dp(i)=min(dp( ...