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头文件
最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...
随机推荐
- shell 布尔运算符
布尔运算符 下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20: 运算符 说明 举例 ! 非运算,表达式为 true 则返回 false,否则返回 true. [ ! false ...
- grep -v grep
ps -ef|grep /usr/local/tomcat_coachqa/ |grep -v grep |awk '{print $2}'|xargs kill -9 grep -v grep gr ...
- 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。
仿照Rails实战:购物网站 教材:5-6 step5:计算总价,做出在nav上显示购物车内product的数量. 遇到的❌: 1. <% sum = 0 %> <% current ...
- 3-5 回顾,快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准点
快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准数 , 1] [91, 86, 42, 46, 9, 68, 77, 46, 7, 1] [91, 86, 42, 46, 9, 68 ...
- PHP函数笔记
一.函数(Function) 1.什么是函数:封装的,可以重复使用的 完成特定功能的代码段. 2.分类 (1)系统函数 (2)自定义函数 3.自定义函数 ...
- 『cs231n』视频数据处理
视频信息 和我之前的臆想不同,视频数据不仅仅是一帧一帧的图片本身,还包含个帧之间的联系,也就是还有一个时序的信息维度,包含人的动作判断之类的任务都是要依赖动作的时序信息的 视频数据处理的两种基本方法 ...
- python-day17--迭代器
1.迭代: 迭代就是一个一个一个挨着的取值 2.可迭代类型: str ,列表,元组,集合,字典 3.判断迭代器和可迭代的方法 #第一种:判断内部是不是实现了 __next__#'__next__' ...
- 使用UTL_SMTP发送中文邮件及使用UTL_TCP从附件服务器获取中文附件
先上最重要的干货 发送邮件正文及主题的时候一定要使用convert重新编码 主题: utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(c ...
- Python学习之路day3-集合
一.概述 集合(set)是一种无序且不重复的序列. 无序不重复的特点决定它存在以下的应用场景: 去重处理 关系测试 差集.并集.交集等,下文详述. 二.创建集合 创建集合的方法与创建字典类似,但没有键 ...
- 标准库中 vector list等排序
1.list自带有排序函数sort():可以定义自己的排序规则,如: struct stTest { int count; wstring str; }; bool SortByNum(const s ...