如何在Winform中设置计时器以执行10+命令?
我有大约10个TX,RX命令,每个命令的时间间隔为100毫秒.因此,基本上应在每100毫秒内执行TXRX对.除非单击停止按钮.我在哪里错了? form1 btn_start 设置时间间隔以请求并接收消息 private void btn_Start_Click(object sender, EventArgs e) { Start(); } private void Start() { btn_Start.Enabled = false; btn_Stop.Enabled = true; int Interval = 100; if (CANTimer.Enabled == false) { // CAN Timer confinguration CANTimer.Enabled = true; C
22 2024-04-26
编程技术问答社区
socketcan 如何处理仲裁?
我非常了解可以协议的工作方式 - 当两个节点尝试同时使用网络时,较低的ID可以优先获得优先级,而其他节点则检测到这一点并停止. 使用Socketcan时,这似乎会被抽象出来 - 我们只是像任何文件描述符一样写和阅读.我可能会误解一些事情,但我已经浏览了大多数文档( write()块是否是最低的ID帧,或者插座缓冲框架是否准备就绪?如果是这样,在发生这种情况时是否通知用户? 解决方案 write不会阻止通道争议.它可能会阻止TCP插座write will (非常不可能). CAN外围将接收一个从内核传输的框架,并执行中型访问控制协议(MAC协议)以将其发送到电线上. Socketcan对协议的这一层一无所知. 框架被缓冲的地方是外围/驱动程序的依赖性:链内核 - 驱动器 - 外围表现为3条带有自己的控制流动机构的FIFOS,但通常,驱动程序是驱动程序(如果需要的话),则是最大的驱动程序由于外围的内存较少. 可以通过使用socketcan接口提供某些标志(请参阅链
18 2024-04-23
编程技术问答社区
STM32F103单片机的CAN信息
我想知道是否有人熟悉任何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
8 2024-04-09
编程技术问答社区
在C语言中读取CAN总线的29位CAN ID显示不正确的CAN ID
我在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
0 2024-04-09
编程技术问答社区
SocketCAN select()和write()不会阻塞。
我正在使用socketcan在嵌入式设备(SOC/ARM Core/Linux)上测试CAN接口,我想使用有效的代码尽可能快地发送数据以进行测试. 我可以作为BSD套接字打开CAN设备(" CAN0"),并以"写"发送框架.这一切都很好. 我的桌面显然可以比CAN传输速率更快地生成帧(我使用的是500000 bps).为了有效发送,我尝试在套接字文件描述符上使用"选择"等待它准备就绪,然后使用"写".但是,无论发送缓冲区的状态如何,"选择"似乎立即返回,并且"写"也没有阻止.这意味着,当缓冲区填充时,我会从"写入"(返回值-1)中获得错误,而ERRNO设置为105("无缓冲空间可用"). 这意味着我必须等待任意时间,然后再次尝试写作,这似乎很效率(投票!). 这是我的代码(C,编辑为简洁): printf("CAN Data Generator\n"); int skt; // CAN raw socket struct sockaddr_can
2 2024-04-07
编程技术问答社区
提升::ASIO over SocketCAN
我正在考虑使用 linux/can.h ,设备应 表现为环回接口,并与原始插座一起使用. 查看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::asio::ip::basic_resolver_iterator
8 2024-04-02
编程技术问答社区
Java和CANopen
背景 我需要在笔记本电脑上创建Java程序以接收/发送Canopen消息. rj45被选择为网络的物理介质.我是Canopen和Java Communications编程的新手. 如果我似乎没有教育,请原谅我.事实是,我已经读了很多,但我仍然不知道如何开始. 问题 除了将PC连接到Canbus网络之外,CAN-PC适配器还有什么? 是否可以在没有CAN-PC适配器的情况下将笔记本电脑连接到Canbus网络? 如果需要一个CAN-PC适配器,我应该使用哪种适配器? PCMCIA,并行,串行,USB等? 我如何开始编写Java程序来收听/写作Canopen消息? 我应该使用哪些库? 我需要创建自己的驱动程序吗? 我的程序应该处理心跳监控,错误检测等吗?还是CAN-PC适配器照顾了这些? 如何从canbus节点中检索特定信息? 如何创建EDS文件和对象字典?每个节点都需要它们吗? 如何模拟可以网络来测试我的Java程序而不购买可以硬件? 解
4 2024-03-21
编程技术问答社区
如何用python将CAN的.asc数据按矢量格式转换为.blf?
我有一个.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) 我能够按照向量格式阅读. 解决方案 如果您已经使用python-can模块,为什么要用大熊猫读取ASC文件? 您将找到如何与doc >分别. 您应该注意的一件事是以二进制模式读取/编写BLF文件.因此,在您的示例中,这应该有效(不要忘记停止日志,否则标题将丢失): import can w
8 2024-03-07
编程技术问答社区
丰田ECU回复0x03 0x7f 0x01 0x11至02 01 00 PID查询请求来自MCP2515和Nodemcu-32S
我正在使用NodeMCU-32S使用MCP2515,并且能够在Internet上接收诸如2C4、2C1、340之类的ID之类的消息,我看到的是2C4,我也使用了RPM,我也对此进行了验证.我的问题是,无论我用哪个库请求受支持的PID(PID查询受支持的PID查询),我都会发送这样的消息Sendmsgbuf(0x7df,0(ext),8(len),然后使用02、01、00的数据等)然后我得到一个回复​​,例如7E8,03(我假设LEN),7F(负RES),01(用于请求),11(sub函数错误).我想知道我的汽车不支持从中要求PID吗?还是我不知道的其他东西.谢谢 解决方案 因此,在搜索了很多天之后,我通过要求这样的东西得到了支持的PID: 7DF,02 21 00 ECU的回复是: 标准ID:0x7E8 DLC:8数据:0x06 0x61 0x00 0xbf 0x9f 0xa8 0x93 0x93 0x00 如果我将位转换为二进制,则可以完全匹配.为了验证,我转换了受
18 2024-03-03
编程技术问答社区
OEM是否有可能将CAN总线事件分享给Android Auto应用程序?
OEM是否可以与Android Auto(不是汽车)应用程序共享总线事件?我的意思是OEMS原始应用.如果可能的话,没有任何限制,或者可以共享任何公交事件? 更新: 如汽车应用程序库中所述 docs ,Android Auto App可以订阅以下信息: ,型号,年份,EV连接器类型,燃油类型,收费卡状态,收费卡类型,电池电平,燃油水平,燃油水平低,剩余范围,原始速度,显示速度,里程表距离. 问题是OEM是否可以扩展此列表? 解决方案 我不确定,但是从理论上讲,这是可能的,但仅限于系统应用(这不是很有用). Android Auto Head单元在 android自动动力OS 上运行.使用Android汽车硬件抽象层(HAL),汽车服务API获得了对汽车传感器的访问. 系统集成商可以通过将特定于功能的平台HAL接口(例如HVAC)与技术特定的网络接口(例如CAN BUS)连接到功能特定的平台HAL接口(例如HVAC)来实现车辆HAL模块. Androi
4 2024-02-10
编程技术问答社区
有没有一种方法可以直接从/到Android Automotive中的Can-Bus读/写入?
假设我有一辆装有连接到车辆的屏幕的车辆,并且屏幕正在使用Android汽车OS.无视Google Play商店.是否可以为Android Automotive创建第三方应用程序,可以直接读取和发送CAN包装?目的是控制连接到CAN-BUS的物理第三方插件,而不是访问加速器,发动机状态等车辆已经使用的功能. 解决方案 不可能直接访问Can-Bus. Android Automotive用途车辆hal hal a>与车辆相互作用的下层,与车载网络和其他车辆硬件进行通信. 此外,访问VHAL被限制在系统应用程序中. 从s.a.c文档复制 车辆HAL是Android汽车连接的唯一组件 到IVI系统,要么通过直接应用 处理器/微控制器连接或通过VMCU门控.使用权 对车辆HAL应限于使用的系统应用 内核接口上的Selinux规则和适当的权限. ptal 其他解决方案 虽然最后一个答案可能正确,但我不确定它是完全准确的.我的Android Radio使用CAN BU
22 2024-02-08
编程技术问答社区
从Web视图上显示telnet接口的高速数据的最佳方法?
我想在Web视图上显示从telnet接口传来的数据.我有一个守护程序运行,可以在telnet端口上读取可以加班数据,并在telnet端口上产生约500行的约40个字符.这是几条以100 Hz运行的消息,大多数其他以10或5 Hz运行的消息,因此总而言之大约是500/秒.我想在每个数据包中获取最新值,然后在网页上显示这些值.该网页在本地加载(不是通过HTTP),守护程序可能在其他主机上,因此有跨域通信. 这是我尝试的事情,也没有做过: 使用xmlhttprequest.我可以打开连接并读取数据,但是当我获得OnProgress事件时,我无法清除先前值的响应teact字段.随着它的增长很快,我无力解析最新价值的ResponseText.我还将遇到内存问题,所以这是不做的. websockets and socket.io:两者都没有证明成功地连接到telnet接口,因为它希望首先http然后转换为直接插座. 所以我的问题是,我该如何最好地完成?我看到的一些选项,但我确
12 2023-12-02
编程技术问答社区
如何在linux上创建虚拟CAN端口?(C++)
我想创建可以模拟可以端口的程序,以便为另一个大应用程序进行测试.程序应通过此虚拟罐发送先前记录的数据.任何人都有这种事情的经验吗? 我正在考虑建立虚拟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
44 2023-11-19
编程技术问答社区
在Python中通过UDP发送CAN帧
我在两台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
10 2023-11-02
编程技术问答社区
使用 Ubuntu 的 Raspberry Pi 4 B 上的 CAN-shield 与 MCP2515
我想使用连接到Raspberry Pi 4 Model B的MCP2515控制器运行CAN Shield.它已经在Raspbian下工作了,但是由于我需要ROS2,因此我想在Ubuntu(20.04)下运行它.在这里它不再起作用. 我所做的是编辑/boot/config.txt并添加以下行: dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25 dtoverlay=spi-bcm2835 但是ifconfig can给出 can: error fetching interface information: Device not found 这个问题似乎与这个: spi-bcm2835模块未显示为lsmod和dmesg的输出,具有此条目: [ 1.428843] spi-bcm2835 fe204000.spi: could not get clk: -517
12 2023-11-02
编程技术问答社区
如何使用 python 将 CAN 的 .blf 数据转换为 .csv 数据
我在BLF格式中具有vector软件中的can-data.为了进一步调查,我想使用Python将其转换为CSV格式. 到目前为止我的进度: import can filename = "test.blf" log = can.BLFReader(filename) 我不知道那是正确的.我现在无法将"日志"保存到CSV文件. 这可能帮助 解决方案 原始答案: 该对象的列表执行技巧 import can import csv filename = "test.blf" log = can.BLFReader("test.blf") log = list(log) log_output = [] for msg in log: msg = str(msg) log_output.append([msg[18:26],msg[38:40],msg[40:42],msg[46],msg[62],msg[67:90]]) with open("out
16 2023-10-30
编程技术问答社区
实现不同信息的同步化
我认为这是一个通用的软件范式问题,因此与嵌入式软件无关. 我有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_
10 2023-09-30
编程技术问答社区
了解罐过滤器
我无法理解STM32F4-DISCOVERY的罐过滤配置. CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_Filt
32 2023-09-30
编程技术问答社区
通过音频可以fd进入耳机
我正在尝试使用12位分辨率ADC录制音频,将示例缓冲区带到CAN FD到另一个设备,该设备采用此音频的示例并创建.wav并播放它.问题在于,我看到通过麦克风发送的数据可以通过FD发送到另一个设备,但是我无法正确地将这些数据转换为.wav文件,并通过麦克风听到我说的话.我只听到哔哔声. 我正在创建一个新的.wav每4个可以FD消息以进行某种实时通信并减少延迟,但我认为这是不可能的,或者如果我以正确的方式认为它是正确的. 在此线程中,我将CAN FD发送的消息并在缓冲区中串联以将其引入.wav文件中.我尝试了更大的缓冲区,但不会改变结果. 我怎么能从CAN FD中获取数据并听到它? 澄清:我知道使用CAN FD传输音频不是正确的方法,但这是针对主项目的. struct canfd_frame frame; CAN_MSG msg; int trama_can[72]; int nbytes; while (status_libreria ==
18 2023-09-30
编程技术问答社区
提升::ASIO over SocketCAN
我正在考虑使用 linux/can.h ,设备应 表现为环回接口,并与原始插座一起使用. 查看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::asio::ip::basic_resolver_iterator
56 2023-09-06
编程技术问答社区