TX2平台下can总线收发功能的实现(一)

转载: http://blog.csdn.net/hhlenergystory/article/details/79531905




某UAES面试题1,大笑,如何在TX2平台下实现can总线收发功能。

TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,去官网看了一看,TX1好像没有can bus功能,TX2才有,作为汽车零配件商必然选择TX2。

英伟达官方为TX2制作了专门的SDK,即jetPack。网站:https://developer.nvidia.com/embedded/jetpack

肯定是Linux系统,自带各种库,谷歌的TensorFlow,opencv啥的还有一些API比如比较重要的图像获取接口V4L2接口,等等。

好了,正题:如何实现can bus收发功能。

本来的思路是can bus作为外设,和串口还有i2c什么的一样是个字符设备或者平台设备什么的步骤应该是:

(1)找到TX2平台下的canbus驱动,insmod后找到设备文件(英伟达作为大公司应该已经写好了canbus的驱动并集成到了SDK中)。

(2)通常的外设一般有open打开设备,close关闭设备,read用来接收,write用来发送,ioctl用来配置设备,用这些函数进行应用编程即可。

由于没有TX2硬件,因此百度搜索一下看看是不是和我想的一样。。。但是好像并不是这样的。。。

百度搜索:TX2 can总线通讯,第一篇文章:http://blog.csdn.net/lybhit/article/details/78661584

得知:(1)首先canbus确实有驱动,但是用modprobe进行安装,modprobe大体上是一个insmod的升级版也是将模块载入内核,并且其驱动不止一个。同时TX2有两个canbus外设,为can0和can1。

(2)Linux下的canbus好像并不是通过设备文件进行操作的,而是通过socket!

(3)上述文章大体是采用:安装驱动->安装一个开源canbus通信app->将can0和can1的CANH和CANL相接(看出TX2并没有自带canbus收发器)->测试canbus。

由于上述文章内容及少,同时注意到文章中有一段诡异的英文:


因此可以联想到应该有技术文档或者外国文章早已对can总线的通讯已经做过讨论。因此Google搜索:TX2 can bus



果然有,只不过是在英伟达官方论坛中,继续深入查找,在网址:https://devtalk.nvidia.com/default/topic/1006762/jetson-tx2/how-can-i-use-can-bus-in-tx2-/3中,有以为英伟达官方人员给出了正确方法


看看,和之前CSDN中看的英文一模一样,哈哈。

则得出步骤:(1)首先想要使能canbus必须在tegra18_defconfig配置文件中配置CONFIG_MTTCAN = m 之后重新编译内核才能使用。

(2)安装canbus模块(Linux将不常用的模块做成.ko文件,在需要使用时可以将其进行载入内核,降低系统的开销)

modprobe can

modprobe can_raw

modprobe mttcan

(3)配置canbus属性,和串口的波特率设置类似,同驱动编程中的ioctl

ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
ip link set up can0
ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
ip link set up can1

ip link set up can0
ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

ip link set up can1

(4)安装第三方开源app can-utils 测试canbus

sudo apt-get install can-utils

(5)使用应用程序进行测试

发送程序:

cansend <can_interface> <can_frame>

e.g. cansend can0 123#abcdabcd

接收程序:

candump can_interface

e.g. candump can1

检测canbus的状态:

ip -details -statistics link show can0

ip -details -statistics link show can1

OK,那么对TX2平台下的canbus通讯初探完成,但是canbus的API,应用开发函数仍然未知,但是之前官方人员给出的测试程序app:can-utils为开源程序,因此下一步:上GIT看代码!


某UAES面试题1,大笑,如何在TX2平台下实现can总线收发功能。

TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,去官网看了一看,TX1好像没有can bus功能,TX2才有,作为汽车零配件商必然选择TX2。

英伟达官方为TX2制作了专门的SDK,即jetPack。网站:https://developer.nvidia.com/embedded/jetpack

肯定是Linux系统,自带各种库,谷歌的TensorFlow,opencv啥的还有一些API比如比较重要的图像获取接口V4L2接口,等等。

好了,正题:如何实现can bus收发功能。

本来的思路是can bus作为外设,和串口还有i2c什么的一样是个字符设备或者平台设备什么的步骤应该是:

(1)找到TX2平台下的canbus驱动,insmod后找到设备文件(英伟达作为大公司应该已经写好了canbus的驱动并集成到了SDK中)。

(2)通常的外设一般有open打开设备,close关闭设备,read用来接收,write用来发送,ioctl用来配置设备,用这些函数进行应用编程即可。

由于没有TX2硬件,因此百度搜索一下看看是不是和我想的一样。。。但是好像并不是这样的。。。

百度搜索:TX2 can总线通讯,第一篇文章:http://blog.csdn.net/lybhit/article/details/78661584

得知:(1)首先canbus确实有驱动,但是用modprobe进行安装,modprobe大体上是一个insmod的升级版也是将模块载入内核,并且其驱动不止一个。同时TX2有两个canbus外设,为can0和can1。

(2)Linux下的canbus好像并不是通过设备文件进行操作的,而是通过socket!

(3)上述文章大体是采用:安装驱动->安装一个开源canbus通信app->将can0和can1的CANH和CANL相接(看出TX2并没有自带canbus收发器)->测试canbus。

由于上述文章内容及少,同时注意到文章中有一段诡异的英文:


因此可以联想到应该有技术文档或者外国文章早已对can总线的通讯已经做过讨论。因此Google搜索:TX2 can bus



果然有,只不过是在英伟达官方论坛中,继续深入查找,在网址:https://devtalk.nvidia.com/default/topic/1006762/jetson-tx2/how-can-i-use-can-bus-in-tx2-/3中,有以为英伟达官方人员给出了正确方法


看看,和之前CSDN中看的英文一模一样,哈哈。

则得出步骤:(1)首先想要使能canbus必须在tegra18_defconfig配置文件中配置CONFIG_MTTCAN = m 之后重新编译内核才能使用。

(2)安装canbus模块(Linux将不常用的模块做成.ko文件,在需要使用时可以将其进行载入内核,降低系统的开销)

modprobe can

modprobe can_raw

modprobe mttcan

(3)配置canbus属性,和串口的波特率设置类似,同驱动编程中的ioctl

ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
ip link set up can0
ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
ip link set up can1

ip link set up can0
ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

ip link set up can1

(4)安装第三方开源app can-utils 测试canbus

sudo apt-get install can-utils

(5)使用应用程序进行测试

发送程序:

cansend <can_interface> <can_frame>

e.g. cansend can0 123#abcdabcd

接收程序:

candump can_interface

e.g. candump can1

检测canbus的状态:

ip -details -statistics link show can0

ip -details -statistics link show can1

OK,那么对TX2平台下的canbus通讯初探完成,但是canbus的API,应用开发函数仍然未知,但是之前官方人员给出的测试程序app:can-utils为开源程序,因此下一步:上GIT看代码!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是一个基本的C++代码示例,用于在TX2和STM32之间进行串口通信。需要注意的是,串口通信的具体参数可能因设备而异,需要根据实际情况进行调整。 ```c++ #include <iostream> #include <unistd.h> #include <fcntl.h> #include <termios.h> using namespace std; int main() { int fd; struct termios options; fd = open("/dev/ttyTHS1", O_RDWR | O_NOCTTY | O_NDELAY); // 打开TX2串口设备文件 if (fd == -1) { cout << "无法打开串口设备文件!" << endl; return -1; } tcgetattr(fd, &options); // 获取串口参数 cfsetispeed(&options, B115200); // 设置波特率 cfsetospeed(&options, B115200); // 设置波特率 options.c_cflag |= (CLOCAL | CREAD); // 本地连接,接收使能 options.c_cflag &= ~PARENB; // 没有校验位 options.c_cflag &= ~CSTOPB; // 1个停止位 options.c_cflag &= ~CSIZE; // 字符长度掩码 options.c_cflag |= CS8; // 8位数据长度 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 非规范模式 options.c_oflag &= ~OPOST; // 原始输出 options.c_cc[VTIME] = 0; // 等待时间 options.c_cc[VMIN] = 1; // 最小字符数 tcsetattr(fd, TCSANOW, &options); // 设置串口参数 // 以下代码用于向STM32发送数据 char send_buf[] = "Hello, STM32!\n"; int send_len = write(fd, send_buf, sizeof(send_buf)); // 以下代码用于接收STM32发送的数据 char recv_buf[1024]; int recv_len = read(fd, recv_buf, sizeof(recv_buf)); // 打印接收到的数据 if (recv_len > 0) { cout << "接收到的数据:" << recv_buf << endl; } close(fd); // 关闭串口设备文件 return 0; } ``` 需要注意的是,以上代码仅供参考,具体的串口通信实现可能因设备而异,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值