前言

最近了解了一些socket can的知识点,本文主要介绍如何将数据转换为CAN报文,前提是已经确定CAN的传输协议。

本文使用的CAN报文共有22条,这些报文共用一个can id,每条报文使用序号标志;

报文协议

转换数据程序

char* convert_buf(vector<Point>& probp, vector<Distance>& pdist, vector<int>& plabel)
{
//convert-can-frame.
char buffer[][] = { };
for (int i = ; i < ; i++)
{
double lat_factor = 0.1;
double long_factor = 0.2; unsigned int lat01 = static_cast<unsigned int>(pdist[ * i].x_dis / lat_factor);//unit-2dm-8bits.
unsigned int long01 = static_cast<unsigned int>(pdist[ * i].y_dis / long_factor);//unit-2dm-9bits.
int label01 = plabel[i*]; if (i == )
{
buffer[i][] = (((i+) & 0xFF) << ) + ((long01 & 0x1FF) >> );
buffer[i][] = ((long01 & 0x1FF) << ) + ((lat01 & 0xFF) >> );
buffer[i][] = ((lat01 & 0xFF) << ) + (label01 & 0x03);
break;
} unsigned int lat02 = static_cast<unsigned int>(pdist[ * i + ].x_dis / lat_factor);//unit-2dm-8bits.
unsigned int long02 = static_cast<unsigned int>(pdist[ * i + ].y_dis / long_factor);//unit-2dm-9bits.
int label02 = plabel[ * i + ]; unsigned int lat03 = static_cast<unsigned int>(pdist[ * i + ].x_dis / lat_factor);//unit-2dm-8bits.
unsigned int long03 = static_cast<unsigned int>(pdist[ * i + ].y_dis / long_factor);//unit-2dm-9bits.
int label03 = plabel[ * i + ]; std::cout << "long01 --- " << long01 << "-- long02 --- " << long02 << "--- long03 --- " << long03 << std::endl;
buffer[i][] = (((i + ) & 0xFF) << ) + ((long01 & 0x1FF) >> );
buffer[i][] = ((long01 & 0x1FF) << ) + ((lat01 & 0xFF) >> );
buffer[i][] = ((lat01 & 0xFF) << ) + (label01 & 0x03);
buffer[i][] = ((long02 & 0x1FF) >> );
buffer[i][] = ((long02 & 0x1FF) << ) + ((lat02 & 0xFF) >> );
buffer[i][] = ((lat02 & 0xFF) << ) + ((label02 & 0x03) << ) + ((long03 & 0x1FF) >> );
buffer[i][] = ((long03 & 0x1FF) << ) + ((lat03 & 0xFF) >> );
buffer[i][] = ((lat03 & 0xFF) << ) + ((label03 & 0x03) << ); printf("buffer[0]: --- %x\n", (byte)buffer[i][]);
printf("buffer[1]: --- %x\n", (byte)buffer[i][]);
printf("buffer[2]: --- %x\n", (byte)buffer[i][]);
printf("buffer[3]: --- %x\n", (byte)buffer[i][]);
printf("buffer[4]: --- %x\n", (byte)buffer[i][]);
printf("buffer[5]: --- %x\n", (byte)buffer[i][]);
printf("buffer[6]: --- %x\n", (byte)buffer[i][]);
printf("buffer[7]: --- %x\n", (byte)buffer[i][]); }
cout << "sizeof(buffer): " << sizeof(buffer) << " Byte..." << endl;
return buffer[]; }

注意

1.如何确定CAN协议的格式,特别是信号的范围、精度以及比特位数;

2.浮点型数据如何变换为可以进行逻辑运算和位移操作的数据类型;

3.如何按照报文格式得到每个字节的内容,特别是位移操作;

4.如何将报文内容正确输出方便查看;

5.原始数据可能越界,应该在转换为报文数据之前对原始数据进行越界处理;

6.转换为CAN报文过程中的各个操作符号的优先级;

convert CAN frame的更多相关文章

  1. UIImageWriteToSavedPhotosAlbum

    UIImageWriteToSavedPhotosAlbum: Next UIKit Function Reference Overview The UIKit framework defines a ...

  2. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

  3. DataFrame转矩阵Np-Array

    DataFrame.as_matrix(columns=None)¶ Convert the frame to its Numpy-array representation.

  4. javacv

    (看到有很多同学都来看这篇文章,说明可能是有必要的,然后这个写的比较水,所以 如果求干货的话,请移步: http://www.cnblogs.com/letben/p/5885799.html 但是 ...

  5. GMM+Kalman Filter+Blob 目标跟踪

    转 http://www.cnblogs.com/YangQiaoblog/p/5462453.html ==========图片版================================== ...

  6. Direct2D WIC绘制图片

    绘制图片需要用到WIC,WIC的功能包括: 编解码图片.也可以自定义图片解码插件. 读取图片元数据. 图像处理(最高支持每通道32位). 内置支持一些流行的格式.包括:BMP v5, GIF 89a/ ...

  7. android使用ffmpeg

    cygwin上文编译文章. 在ffmpeg/arm添加的文件夹Android.mk 的主要目的是为了宣布动态库libs下一个 LOCAL_PATH:= $(call my-dir) include $ ...

  8. Motion-Based Multiple Object Tracking

    kalman filter tracking... %% Motion-Based Multiple Object Tracking % This example shows how to perfo ...

  9. 微信支付生成带logo的二维码

    利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...

随机推荐

  1. angular5表单验证问题

    例举一个patten的列子 可能出现的问题,表单元素需要添加name属性 还有的验证如maxlength,minlength,required等 一.验证某一个表单元素如下 *ngIf="s ...

  2. vue.js 过渡&动画

    9-17 在add ,update, remove DOM时 提供多种方式的应用过度效果. 包括以下可选工具:(2大类,css和js) 在css过度和动画中自动应用class 配合使用第三方css动画 ...

  3. 库: rspec/rspec-expectations matcher匹配器常用

    https://github.com/rspec/rspec-expectations https://relishapp.com/rspec/rspec-expectations/v/3-7/doc ...

  4. Mass Change Queries CodeForces - 911G (线段树合并)

    链接 大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列 权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可 #include <iostream> ...

  5. Perfect Groups CodeForces - 980D

    链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...

  6. linux中whereis、which、find、location的区别和用法

    摘自:https://www.cnblogs.com/kex1n/p/5233821.html 1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式 ...

  7. poj2686 状压dp入门

    状压dp第一题:很多东西没看懂,慢慢来,状压dp主要运用了位运算,二进制处理 集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数 像这样,一些集合运算就可以用如下的方法来操作: ...

  8. BST(二叉排序树)的插入与删除

    值得一说的是删除操作,删除操作我们分为三种情况: 1.要删的节点有两个孩子: 找到左子树中的最大值或者右子树中的最小值所对应的节点,记为node,并把node的值赋给要删除的节点del,然后删除nod ...

  9. hdu2845_最大不连续子段和

    ---恢复内容开始--- Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  10. UVA-11584 Partitioning by Palindromes (简单线性DP)

    题目大意:给一个全是小写字母的字符串,判断最少可分为几个回文子序列.如:“aaadbccb” 最少能分为 “aaa” “d” “bccb” 共三个回文子序列,又如 “aaa” 最少能分为 1 个回文子 ...