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-12-14 07:25:29

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

串口通信IN C++(适用于Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )

                 向无数拼命工作的 程序猿 及 攻城狮 致敬! 软硬件平台简介 CPU:P4 2G及以上兼容于80x86架构的中央处理器 内存:1G及以上 硬盘:80G及以上 网卡:100M及以上 操作系统:Windows XP及以上 软件:VS2010/2012/2013  Visual C++ 6.0  Keil uVision3-4   STC_ISP_V488/友善串口助手 硬件:众多.不胜数 2.总体设计思想 串口通讯把数据的字节分解成单个的二进制比特流依次传输,其

[转]Microsoft Platform SDK 选择及在vc++6.0中的配置

Windows Platform SDK Download Sites: Windows Server 2003 PSDK February 2003 Edition,可以和VC6一起使用.并支持各种目标OS的最后一个版本的SDK. This edition of the SDK supports development for the following platforms: Windows Server 2003 Windows Advanced Server, Limited Editio

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

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

VC 6.0错误类型

http://www.cnblogs.com/CBDoctor/archive/2013/01/21/2869480.html VC 6.0 常见断言错误总结 断言 所在函数 具体位置 意义 ASSERT(m_hWnd==NULL) CWnd::Attach() WINCORE.CPP文件中的第320行 这个断言通常可能是由于试图把一个已经捆绑(attach)过的窗口捆绑在其他的对象上,只能有一个MFC对象能够捆绑到一个窗口上--不然,消息映射就会不正常   ASSERT((dwStyle& W

json servlet通信 显示数据

servlet 1 //输出JSON格式的省份信息 2 @WebServlet("/ServletDemo1") 3 public class ServletDemo1 extends HttpServlet { 4 private static final long serialVersionUID = 1L; 5 6 7 public void doGet(HttpServletRequest request, HttpServletResponse response) throw

vc++6.0遗留问题

用比较老旧的VC++6.0做开发会出现不少问题,推荐用vs2008或以上版本进行开发. 如果因为某种原因坚持开发也行,但以下这些问题你要熟练掌握解决办法. 1.视图中中某些类突然找不到 解决方案:打开文件列表,找出消失类的头文件在不起眼的地方打几个空格,然后保存. 2.电击打开文件菜单,程序崩溃 解决方案:下载FileTool替换菜单项,解决方案百度很多的. 3.CStdioFile类读取文件返回false 解决方案:当文件的最后一行数据,正好是128的倍数个字符的时候,用ReadString读

VC++6.0同时打开多个窗口

背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之择.做DLL需要两个VC窗口进行测试才方便.可是VC++6.0默认只打开一个窗口,本文即介绍如何同时打开多个窗口. 正文: Xp: 控制面板 ---> 文件夹选项 ---> 文件类型 ---> 找到“DSW” ---> 高级 ---> 编辑 ---> 取消使用DDE即可. Win7: 点击键盘上的"Win&qu

VC++6.0调试:Watch窗口的使用

1 #include <stdio.h> 2 #include <windows.h> 3 4 class AutoExpand 5 { 6 public: 7 AutoExpand(int val, char* pval) 8 { 9 a = val; 10 p = pval; 11 } 12 private: 13 int a; 14 char *p; 15 }; 16 class CantExpand 17 { 18 public: 19 CantExpand(int val