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头文件
最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...
随机推荐
- Jmeter 分布式压力测试
JMeter中进行分布式测试 作为一个纯 JAVA 的GUI应用,JMeter对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心, ...
- queue_01
A.添加/移除 void queue::push(elemValue); // 尾部添加 viud queue::pop(); // 尾部移除 B.随机存取 C.数据存取 T queue::back ...
- VS2013_CodeLens
CodeLens 只有VS2013 旗舰版 (update 2及以上) 才可以用,高级版 专业版都没有. 如何打开CodeLens呢?在VS菜单栏 >> 工具 >> 选项 &g ...
- HDU 6098 Inversion
Inversion 思路:从大到小排序后,每次找到第一个下标不整出i的输出. 代码: #include<bits/stdc++.h> using namespace std; #defin ...
- 20170612xlVBA含方框文档填表
Sub mainProc() Application.ScreenUpdating = False Application.DisplayAlerts = wdAlertsNone 'Dim xlAp ...
- 『PyTorch』第十三弹_torch.nn.init参数初始化
初始化参数的方法 nn.Module模块对于参数进行了内置的较为合理的初始化方式,当我们使用nn.Parameter时,初始化就很重要,而且我们也可以指定代替内置初始化的方式对nn.Module模块进 ...
- CoderForce 140C-New Year Snowmen(贪心)
题目大意:有n个已知半径的雪球.堆一个雪人需要三个尺寸不同的雪球,问用这些雪球最多能堆多少个雪人? 题目分析:先统计一下每种尺寸的球的个数,从三种最多的种类中各取出一个堆成雪人,这样贪心能保证的到的数 ...
- javascript primise本质——为了简化异步编码而针对异步操作的代理
概述 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 语法 new Promise(executor); new Promise(functio ...
- 守护进程的创建(syslog函数)
守护进程(daemon)是指在后台运行的,没有控制终端与之相连的进程.它独立于控制终端,通常周期性的执行某种任务. 守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程的方式实现的,如I ...
- linux create a process
When the system starts up it is running in kernel mode and there is, in a sense, only one process, t ...