背景 我需要在笔记本电脑上创建Java程序以接收/发送Canopen消息. rj45被选择为网络的物理介质.我是Canopen和Java Communications编程的新手. 如果我似乎没有教育,请原谅我.事实是,我已经读了很多,但我仍然不知道如何开始. 问题 除了将PC连接到Canbus网络之外,CAN-PC适配器还有什么? 是否可以在没有CAN-PC适配器的情况下将笔记本电脑连接到Canbus网络? 如果需要一个CAN-PC适配器,我应该使用哪种适配器? PCMCIA,并行,串行,USB等? 我如何开始编写Java程序来收听/写作Canopen消息? 我应该使用哪些库? 我需要创建自己的驱动程序吗? 我的程序应该处理心跳监控,错误检测等吗?还是CAN-PC适配器照顾了这些? 如何从canbus节点中检索特定信息? 如何创建EDS文件和对象字典?每个节点都需要它们吗? 如何模拟可以网络来测试我的Java程序而不购买可以硬件? 解
以下是关于 can-bus 的编程技术问答
众所周知,在CAN BUS通信协议中,发件人知道数据是否已成功发送.我按以下方式发送socketcan数据. ret = write (socket, frame, sizeof (struct can_frame)); 但是,即使断开通信电缆已断开连接,ret的返回值仍然为16(= sizeof(struct can_frame)).我查询了信息,发现问题是由于使用的网络堆栈的TX_QUEU所致由Socketcan.当写入多次时,缓冲区已满,并且RET的返回值为-1. 但这不是我期望的行为,我希望发送的每一个数据框架都会立即获得成功或失败的状态. echo 0> / sys / class / net / can0 / tx_queue_len 我想取消tx_queue,但它不起作用. 我想问的是,有没有一种方法可以取消Socketcan的TX_Queue,或者通过API(例如LibSocketcan)获得每个发送器的每个发送框架的状态. 谢谢. 解决方案
我正在使用socketcan在嵌入式设备(SOC/ARM CORE/LINUX)上测试CAN接口,我想使用有效的代码尽可能快地发送测试数据. 我可以作为BSD套接字打开CAN设备(" CAN0"),并以" Write"发送框架.这一切都很好. 我的桌面显然可以比CAN传输速率更快地生成帧(我使用的是500000 bps).为了有效地发送,我尝试在套接字文件描述符上使用"选择"等待它准备就绪,然后使用"写".但是,无论发送缓冲区的状态如何,"选择"似乎立即返回,并且"写"也没有阻止.这意味着,当缓冲区填充时,我会从"写入"(返回值-1)中获得错误,而ERRNO设置为105("无缓冲区可用空间"). 这意味着我必须等待任意时间,然后再次尝试写作,这似乎非常效率(投票!). . 这是我的代码(C,编辑为简洁): printf("CAN Data Generator\n"); int skt; // CAN raw socket struct sockad
我需要对不同的标识符进行计数,并为它们打印数字计数.信息来自看起来像这样的数据流: IDENTIFIER 7756753.940 receivetest: m s 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7756754.409 receivetest: m s 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7756754.878 receivetest: m s 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7756755.348 receivetest: m s 0x00000690 8 00 18 00 28 34 83 59 1a 7756853.908 receivetest: m s 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7756854.377 receivetest: m s 0
我有一个带有2个线程的方案: 等待来自插座的消息的线程(嵌入在C库中 - 阻止调用是" Barra.ricevi"),然后将元素放在队列上 等待从队列获取元素并做某事 的线程 示例代码 import Barra import Queue import threading posQu = Queue.Queue(maxsize=0) def threadCAN(): while True: canMsg = Barra.ricevi("can0") if canMsg[0] == 'ERR': print (canMsg) else: print ("Enqueued message"), canMsg posQu.put(canMsg) thCan = threading.Thread(target = threadCAN
我想知道是否有人熟悉任何STM32F10X微控制器? 如果是这样,我在配置CAN驱动程序时遇到了一些问题.我可以运行将设置为loop_back模式的演示代码,但是我无法使normal_mode工作. 我阅读了所有数据表,除了can_msr寄存器中的inak外,一切都正确配置了. STM32F103微控制器和CAN消息. 解决方案 您将TX PIN设置为OUT_PP,但应将其配置为替代功能.以下是我在STM32F107上使用CAN的初始代码.我从现有项目中复制并剥离了它,因此不需要一些东西(例如,并非需要启用所有GPIO).另请注意,我使用重新映射功能将CAN RX和TX引脚放在端口d. 上 使用72 MHz时钟时,此配置将总线速度设置为500 kbit/s. Int HardwareInit(void) { Int retval = 0; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitT
我想在命令上发送以在日产叶子中切换我的大灯per. 它位于ID 625 中 0x00 - OFF 0x60 - ON 0x40 - Parking lights ON 0x68 - Headlights & fog lights ON 如何通过终端发送命令来更改此命令 您可以逐步帮助吗? 解决方案 如果您的日产在说话可以(即,您的ELM 327设备将在发送AT DPN>>时6到9之间回复),则可以: AT Z AT E0 AT L1 AT SP 0 0100 AT SH 625 直到这里您有: 重置芯片组(AT Z) 阻止它回声回回您编写的内容(AT E0) 打开线结尾,因此其答复不会在temrinal(AT L1) 中覆盖您的命令 将协议设置为"自动"(AT SP 0) 初始化总线(0100)(好吧,不是真的,但这有助于芯片组确定协议) 将CAN消息头设置为625(AT SH 625) 现在,您知道您必须更改哪个字节才能打开大灯?
我在C中编写了一些代码以读取CAN总线数据.当我阅读11位CAN ID时,一切正常.一旦我尝试读取29位ID,它就会错误地显示ID. 示例: 带有29位ID的消息: 0x01f0a020 并用 打印 printf("%X\n", frame.can_id); 它打印 81F0A020 . 11位ID消息 0x7df 并用 打印 printf("%X\n", frame.can_id); 它正确打印 7df . 为什么会这样? #include #include #include #include #include #include #include #include #include #include
我正在从事一个项目,该项目需要我在主机计算机上创建虚拟CAN网络 $ sudo modprobe vcan $ sudo ip link add dev vcan0 type vcan $ sudo ip link set up vcan0 我的ifconfig: 我的问题是如何与Docker容器共享此接口. 如果它的任何用途,我在主机机上运行以下命令find / -name "vcan0" -print 2>/dev/null: /sys/class/net/vcan0 /sys/devices/virtual/net/vcan0 /proc/sys/net/ipv4/conf/vcan0 /proc/sys/net/ipv4/neigh/vcan0 我可以使用docker run --rm -it --network=host ... 运行Docker容器.唯一的问题是不再有网络隔离b/w docker主机和容器.有没有办法实现上述方法,但没有共享主机
我在两台Linux机器之间建立了UDP套接字连接,并且可以轻松发送b"Hello, World!".但是现在我需要发送以下可以框架 from can import Message send_msg = Message(data=[1, 2, 3, 4, 5]) 所以,如果我打印send_msg它显示: Timestamp: 0.000000 ID: 00000000 X DLC: 5 01 02 03 04 05 我想在接收端上打印此.我使用的发送和接收最终代码如下: 发送: import socket UDP_IP = "10.140.189.249" UDP_PORT = 5005 from can import Message send_msg = Message(data=[1, 2, 3, 4, 5]) print(send_msg) MESSAGE = send_msg pr
我想创建可以模拟可以端口的程序,以便为另一个大应用程序进行测试.程序应通过此虚拟罐发送先前记录的数据.任何人都有这种事情的经验吗? 我正在考虑建立虚拟com,并通过包装包装的数据发送.可以工作吗?我如何在Linux上建立虚拟com?找到此线程 for Linux的虚拟串行端口 但是可悲的是,我不知道该如何将其实施到程序的源代码(初学者Linux用户和Linux下的程序员)中. 很想阅读您的经验和建议. 解决方案 您需要 socketcan 驱动程序,可在Ubuntu等现代Linux发行版中获得Socketcan提供虚拟罐端口驱动程序: sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0 现在,您可以通过vcan0设备发送和接收可以接收框架. Wikipedia文章提供了有关如何使用socketcan的简单代码示例. 您还需要 can-util
我正在考虑使用 >从 socket可以读取数据. 在 linux/can.h ,设备应 表现得像环回接口,并与原始插座一起使用. 查看basic_raw_socket接口,看来我可以使用 basic_raw_socket "> basic_raw_socket用 创建的本机插座 socket( PF_CAN, SOCK_RAW, CAN_RAW ); 这就是我到目前为止的 namespace can { class CanSocket { public: typedef boost::asio::ip::basic_endpoint endpoint; typedef boost::asio::ip::basic_resolver_query resolver_query; typedef boost::as
我正在考虑使用 >从 socket可以读取数据. 在 linux/can.h ,设备应 表现得像环回接口,并与原始插座一起使用. 查看basic_raw_socket接口,看来我可以使用 basic_raw_socket "> basic_raw_socket用 创建的本机插座 socket( PF_CAN, SOCK_RAW, CAN_RAW ); 这就是我到目前为止的 namespace can { class CanSocket { public: typedef boost::asio::ip::basic_endpoint endpoint; typedef boost::asio::ip::basic_resolver_query resolver_query; typedef boost::as
我认为这是一个通用的软件范式问题,因此与嵌入式软件无关. 我有3条我在不同时间切片中收到的消息,这三个消息是 ODO,速度,GPS.每个都有20ms,1秒和1秒的时间层. 我的问题是,只有在三个已经获取时,我才能同步并获得完整的消息. 我目前的方法是要有三个足队列,并放置三个布尔变量,并检查它们是否全部同步,但是如果有20ms的ODO,则无需使用其他情况,而无需其他情况.消息. 这是我在做的: void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxMessage, RxData); static bool t1 = 0, t2=0, t3 =0; if (RxMessage.StdId == 0x098) { insertCirQueue(&q_velocity,
我有一个.asc文件,我想按照矢量格式将其转换为.blf. 我已经尝试过, from can.io import BLFWriter import can import pandas as pd #input paths path = '/home/ranjeet/Downloads/CAN/BLF_READER/input/' asc_file = '20171209_1610_15017.asc' blf_file = '20171209_1610_15017.blf' df = pd.read_table(path + asc_file) print(df) 我能读取.asc,根据矢量格式,我如何将它写入.blf文件. 解决方案 如果您已经使用python-can模块,您为什么用熊猫读取您的ASC文件? 您会发现如何在Doc 这里和有. 您应该注意的是在二进制模式下读/写BLF文件.所以在你的例子中,这应该是工作(不要忘记停止日志,否则标题将丢
我很难在温度下转换两个字节. 我有一个控制单元(温度传感器),在那里我通过两个字节获得温度的消息. 1)示例: message: [ 40 ][ 25 ] LSBYTE : [ 40 ] MSBYTE : [ 25 ] 0.03125 C/bit temperature: 25C° ( seen from the display of the control unit ) 2)示例: message: [ 40 ][ 26 ] LSBYTE : [ 40 ] MSBYTE : [ 26 ] 0.03125 C/bit temperature: 30C° ( seen from the display of the control unit ) 3)示例: message: [ 20 ][ 26 ] LSBYTE : [ 20 ] MSBYTE : [ 26 ] 0.03125 C/bit temperature: 32C° ( seen from the
可以使用Android自动(不是汽车)应用程序分享CAN总线事件吗?我的意思是OEM原始应用程序.如果是可能的,而不是有任何限制,或者可以共享任何CAN总线事件? 更新: 如在汽车应用程序库中所述 docs ,Android自动应用程序可以订阅这些信息:make ,型号,年,EV连接器类型,燃料类型,收费卡状态,收费卡类型,电池水平,燃油水平,燃油等级低,范围剩余,原始速度,显示速度,距离距离. 问题是OEM是否可以展开此列表? 解决方案 我不确定,但在理论上,它是可能的,但仅限于系统应用程序(这不是非常有用). android自动头单位在 Android汽车操作系统.汽车服务API使用Android汽车硬件抽象层(HAL)获得汽车传感器. 系统集成商可以通过将功能特定的平台HAL接口(例如HVAC)与技术特定的网络接口连接(例如CAN总线)来实现车辆HAL接口(例如,CAN总线). 在Android汽车包中有一个接口,允许编写自定义车辆硬件抽象层属
我知道可以巴士进行仲裁的方式.简而言之,在其凹痕器中具有更多" 0"的CAN节点ID赢得了仪式,以在公共汽车上传输,其余的竞争节点退回. 但我找不到任何how long备份节点等待的细节,然后重新尝试赢得公共汽车.我咨询了一些消息来源,但仍然找不到答案.有任何实验证据吗? bosch can can 控制器区域网络简介 解决方案 在赢得框架传输后,可以自由尝试,并且在罐头框架末端的"中场休息场"中没有发现主角.如果您搜索"中断字段"的规格,您可能会找到对此的正式定义,例如,请参见链接的旧(过时)Bosch规格的3.1.5. . 这里重要的部分是要意识到每个CAN控制器都会倾听每个帧,即使它对它不感兴趣.这就是您实现避免碰撞而不是碰撞检测的方式. 其他解决方案 如Bosch可以规范文档中所述,当发生闲置条件时,所有CAN节点都可以开始发送待处理的帧(在总线上找不到主要位).在间隔间隔中的中途期间,没有任何节点可以传输(可以传输过载帧,而不是数据或远程帧
我也有类似的问题. 如何编程简单的顶篷层. 我阅读了答案,但是我必须自己编程一个可以单独编程的罐头层.因此,是否有任何编写Canopen堆栈的基础知识(或我不确定差异的层)?我不知道从哪里开始.. 如果需要以下一些信息: 我的主设备是带有QNX的小猎犬骨黑色.我认为QNX有一个通用的罐头库,但不是特定于Canopen的.我的奴隶是一个军事化的无刷电动机控制器.我正在用C ++写作. 我有关于我系统的一般要求的文档. 有2个rpdos和4个TPDOS,传输是同步的,没有停止模式(因此没有心跳和节点保护),所有消息信息均已说明(大小,格式,相关节点ID等) ) 解决方案 实际上至少有4个开源项目可以实现canopen: canfestival是最古老的,可能是最成熟的解决方案.许可证:LGPLV2. Canopennode针对微型控制器.许可证:GPLV2. Liely Canopen是用于实施Canopen Masters和Slaves的图书馆.许可证:Ap