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  = 0;

    SI_GetNumDevices(&dwNumDevices);
    printf("zengjf debug: dwNumDevices = %d.\n", dwNumDevices);
    if ( dwNumDevices ==0 )
        return FALSE;

    if ( SI_Open(1, &m_hUSBDevice) == SI_SUCCESS )
        printf("zengjf debug: SI_Open USBDevice success.\n");
    else
        printf("zengjf debug: SI_Open USBDevice fails.\n");

    char   testData[17]  = "zengjf";
    DWORD  hasWritten    = 0;
    DWORD  hasRead       = 0;
    DWORD  timeCount     = 0;

    while ( true ) {

        Sleep(100);

        // 接收6帧数据就退出程序,作为测试程序,这个量也就差不多了
        if ( timeCount++ > 6 )
            break;

        memset(testData, 0, sizeof(testData));

        if ( SI_Read( m_hUSBDevice, testData, 40, &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 = 0; i < hasRead; i++ )
                printf(" %02x ", testData[i] & 0xff);
            printf("\n");

            // 判断接收到的数据是远程帧,还是数据帧
            if ( testData[0] & ( 1 << 6 ) )
                printf("Frame Format: Remote Frame.\n");
            else
                printf("Frame Format: Data Frame.\n");

            // 输出数据长度
            printf("Frame data length: %d.\n", testData[0] & 0xf);

            // 输出是扩展帧,还是标准帧
            if ( testData[0] & (1 << 7) ) {

                printf("Frame Type: Extend Frame.\n");
                // 解析扩展帧的ID
                printf("ID: %X.\n", (((testData[1] & 0x0ff) << 21) | \
                                     ((testData[2] & 0x0ff) << 13) | \
                                     ((testData[3] & 0x0ff) << 5)  | \
                                     ((testData[4] >> 3) & 0x1f)));

                // 将二进制数值转换成字符数字
                for ( DWORD i = 5; i < hasRead; i++ )
                    testData[i] += '0';

                // 显示所有的接收的数据
                printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+5);

            } else { 

                printf("Frame Type: Standard Frame.\n");
                // 解析标准帧的ID
                printf("ID: %X.\n", (((testData[1] & 0x0ff) << 3 ) | ((testData[2] >> 5) & 0x7)));

                // 将二进制数值转换成字符数字
                for ( DWORD i = 3; i < hasRead; i++ )
                    testData[i] += '0';

                // 显示所有的接收的数据
                printf("zengjf debug: show data from C8051F340 -- testData[ %s ].\n", testData+3);

            }

        } 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 0;
}

 

时间: 2024-10-26 06:12:16

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 USB 通信 Demo * 声明: * 1. 本程序另外需要C8051F340单片机程序配合: * 2. 本程序是在拥有SiUSBXp.h.SiUSBX

VC++ 6.0 C8051F340 MFC programming note

/************************************************************************************** * VC++ 6.0 C8051F340 MFC programming note * 声明: * 本文主要在使用VC++ 6.0 MFC的时候,对一些之前不知道的东西进行记录. * * 2015-10-16 晴 深圳 南山平山村 曾剑锋 ******************************************

arm与FPGA通信如何定义SPI通信的数据解析协议

问题描述 arm与FPGA通信如何定义SPI通信的数据解析协议 用arm自带的spi驱动与FPGA进行通信,arm端做主机每次发送一字节8位,需要往FPGA里发送一些参数和数据, ,其中发送的数据内容在0x00到0xFF都会出现,求解如何定义协议进行解析才能把参数跟数据分开来.求大神解答 解决方案 Raspberry pi通过SPI与FPGA通信串行通信_SPI通讯协议 解决方案二: 定义数据格式 比如开始两字节命令+数据长度+数据+crc 解决方案三: http://www.openedv.c

C# 基于串口通信的 数据解析?

问题描述 我现在已经串口的数据传输功能,但现在的问题是,我如何才能把收到的数据进行进一步的解析呢?就是比如textbox1里输入P:20,发送之后,我就可以在textbox2里面显示出压力:20Pa这种,应该怎么实现呢.??求高手来帮忙啊~~~ 解决方案 解决方案二:帮顶!求大神帮忙!!!解决方案三:顶~!!!求大神帮助啊~~~解决方案四:问题解决了么?我也是初学者,如果解决了,麻烦给我指点下啊~~!解决方案五:数据出来之后,剩下的内容你应该根据实际的情况和逻辑去处理得到的数据啊.解决方案六:

用VC++6.0实现石头剪刀布游戏的程序_C 语言

源程序是从网上看到的, geek_monkey于2015年3月3日修改了bug(输入字符非石头剪刀布都算是玩家赢) 编译环境为VC++6.0 增加"上帝模式"和数据统计,纯属娱乐. 我是C语言初学者,轻喷 复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> int exist_in(char *arr1[][2],

使用Wireshark捕捉USB通信数据

USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为"通串线",是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.USB接口支持设备的即插即用和热插拔功能,是应用在PC领域的接口技术. 现在,越来越多的人喜欢使用USB设备了.很多的设备都会选择使用USB接口来作为设备的通信端口,而这也是一种流行的趋势,这有助于不同设备之间标准的统一.那么,你对USB设备的工作方式和运行机制真的了解吗?无论你是一个硬件黑客,还是一名对外围设备感兴趣的技术爱好

VC++6.0多行数据的去重复处理

问题描述 VC++6.0多行数据的去重复处理 VC++6.0 读取文本文件中多行数据,然后去掉重复的行,提取数据到新的文件的方法是什么? 解决方案 读取到set/vector,然后去重复http://blog.csdn.net/zengraoli/article/details/39081707 解决方案二: 逐行读取文件中的数据,读出一行就和前面已经读取的数据比较,如果不重复,就保存,假设可以弄个vector 如果和前面的行都不重复,就push_back 读完以后遍历vector,将数据输出到

在VC++ 6.0下利用消息实现内部进程通讯

内部进程间通讯和数据交换有多种方式:消息.共享内存.匿名(命名)管道 .邮槽.Windows套接字等多种技术.其中利用消息机制实现IPC虽然同其他方法 相比有交换的数据量小.携带的信息少等缺点,但由于其实现方便.应用灵活而 广泛应用于无须大量.频繁数据交换的内部进程通讯系统之中,尤其是对于在上 层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能.本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0 通过消息来实现内部进程通信. 一.Windows消息机

用VC 6.0实现串行通信的三种方法

摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控. ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.依据不同的条件实现对串口的灵活编程控制是我们所需要的. ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制