问题标签 [can-bus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
120 浏览

c# - 从另一个 backgroundworker-thread 调用的 Timer-Backgroundworker

我目前正在 C# 中大量开发 CAN 技术,以及与消息接收和消息传输有关的内容。到目前为止,我发送的每条消息都正确地传输给了消费者,而生产者发送的每条消息都将正确地传输给(我作为)消费者。

每次,消息到达接收先进先出,_messageReceivedEvent 触发。之后,将开始处理一条或多条收到的消息。消息处理后,应重置现有计时器(单独的线程)。这意味着,如果在 5 秒内没有消息到达,定时器线程将不会被重置,如果超时,定时器线程应该发出信号,表明它已经过时并且应该将一个参数 (_isDataCommunicationStillAlive) 设置为“FALSE”。

主线程(调用 MessageReceiption-Backgroundworker):

DataCommunicationTimer(作为 Backgroundworker(从 MessageReceiption 调用)):

问题是,我的 Timer-Backgroundworker 无法理解,因为它会在一秒钟内终止。另一个问题是,我不知道如何读出关于剩余时间的特定定时器实例......

基于这些代码行,我找不到错误。:((

请你帮助我好吗?!

0 投票
1 回答
167 浏览

embedded - Infineon XMC4400 CAN 报文对象和 LIST 寄存器

我正在使用 Infineon XMC4400 控制器,并且正在将基本 CAN 功能转换为完整 CAN 功能。我在理解使用 LIST 寄存器分配消息对象时遇到困难——据我所知——

  • XMC4400 支持 64 个消息对象,每个 MO 必须分配到 LIST 寄存器之一。
  • MultiCAN 模块中有 8 个 LIST 寄存器
  • 使用 PANCTR,我们可以在列表中更新/修改/删除消息对象

(如果我错了,请纠正我。)

所以我的问题是我们可以将所有 64 个 MO 分配给单个 LIST 寄存器还是有任何限制? 我在参考手册中没有找到明确的解释。

0 投票
0 回答
243 浏览

can-bus - JSSC readBytes() - 什么进来了,我该怎么办?

我是一名学生,作为一个项目,我正在开发一些软件来与 CAN 通信,该 CAN 将通过 USB 串行接口从 CAN 读取。我对收到这些字节时会发生什么感到困惑。我以-127-128 格式接收它们,然后通过java 运算符& 0xFF 将它们转换为int。

从那里,这些字节发生了什么?我希望能够找到 STX 和 ETX 以及我收到的数据包中的数据。我怎么做?我可以找到这些字节的整数值,仅此而已。我通过 JSSC 的 readBytes 将这些数据接收到一个字节 [] 中。

STX 是 0x02,我在哪里可以找到它以及如何在我的字节数组中找到它?我只接收整数。

我是在接收端做错了什么,还是这些数据被序列化了而我对此一无所知?

请原谅我的新手。我只是想学习如何将 RX 和 TX 发送到 CAN。

谢谢

0 投票
1 回答
1613 浏览

can-bus - 缺少主心跳不会导致节点在 CANopen 系统中做出反应

我对CANopen中的心跳协议有一个奇怪的发现。也许其他人已经看到了这样的东西,也许它应该像这样工作......无论如何,这就是它的内容:

在 CANopen 中有两种基于超时的生命保护机制:第一种是节点保护,我不再赘述,因为它被认为是老生常谈了。

另一种叫做心跳。这很简单:网络上的任何参与者都会发送一条常规消息,说明其节点 ID 和状态。频率由对象 0x1017sub0 定义,称为 heartbeat-producer-time。如果设置为零,则不发送心跳。

然后任何其他参与者都可以定义它想要在网络上找到的节点数量以及两个连续心跳消息之间可能存在的最长时间。此信息作为 32 位条目存储在对象 0x1016sub1..n 中,用于该特定节点想要监听的任意数量的节点。

这些条目由节点 ID(第 22 到 16 位)和提到的心跳之间可能经过的最大时间组成,称为心跳消费者时间(在第 15..0 位中)。同样,如果该条目为零,则将被忽略。

正如您可能已经收集到的,网络主机(节点 ID 1)和从机(节点 ID 2 到 127)之间没有区别。

到目前为止的理论,现在解决我的问题:

我将网络中的一个从节点配置为主节点的心跳消费者,因此对象 0x1016sub1 中有一个条目,如下所示:0x000107D0。这意味着至少两秒钟后预计会收到来自 master 的心跳消息。

我观察到这在两个示例中有效。如果我发送主心跳一段时间然后停止,节点要么返回到预操作模式,要么发送适当的紧急消息。

如果我不发送任何主心跳消息,我希望在我启动节点(将其发送到操作模式)之后,节点最多需要两秒钟才能返回到预操作模式或发送适当的紧急消息或什至两者兼而有之。但是在我尝试的两个示例中,什么也没发生。如果我从不发送任何心跳,则节点永远不会期待一个并且只是继续运行。

这两个例子彼此非常不同。我不确定他们是否使用相同的 CANopen-stack 库。

有解释吗?

0 投票
0 回答
91 浏览

vb.net - 通过 CANcaseXL 向 ARS308 雷达传感器发送配置 MSG 时出错

我正在进行一项研究,包括通过 CANcaseXL 从 ARS308 雷达传感器发送和恢复 CAN 消息,我能够编写一个可以使用 ID 0x200 发送此配置消息的 VB.net 代码,但是突然雷达只是停止响应消息,尽管我正在监视并能够检查数据是否通过 CANcaseXL 从 PC 传输到雷达。此外,我现在从雷达接收到奇怪的消息 ID,例如这些 ID:0x478、0x271,这些 ID 在 ARS308 雷达传感器的手册中没有提到,所以我不知道其中的数据是什么。

我将不胜感激任何帮助!

0 投票
1 回答
885 浏览

embedded - CANopen SDO 正常下载

在此处输入图像描述

在像上面那样启动一个 SDO 正常(分段)下载协议之后,客户端是否可以在下载协议仍在进行中的任何时候从服务器接收到任何心跳消息或与我们的下载协议无关的CAN消息?

0 投票
0 回答
289 浏览

can-bus - CAN实现和DE9

参考下面的链接。

https://mbed.org/handbook/CAN

在此处输入图像描述

1)我可以在面包板上使用相同的图表吗?我的意思是Can bus part (connection A in pic)- 两根电线与两个 120 欧姆电阻连接?这辆公共汽车需要吗,any external voltage supply或者我可以按原样连接面包板。然后从(connection B)节点将被添加到总线。

2)我还读到DE9用于CAN总线实现。有人可以让我知道如何使用 DE9 实现 CAN 总线,即上面的 DE9 实现。

0 投票
3 回答
2036 浏览

android - 温度转换 2 字节

我很难在温度中转换两个字节。我有一个控制单元(温度传感器),我在其中得到两个字节的温度消息。

1)示例:

2)示例:

3)示例:

4)示例:

我不知道如何将消息转换为温度。

我请求你的支持。谁能给我一个解决方案,它可以在我的项目中协作(创建一个应用程序android来接收来自控制单元的消息)

0 投票
1 回答
301 浏览

c - 如何提高 LPC1788 微控制器调用 CAN IRQ 的速率?

我正在使用 IAR Embedded Workbench IDE 为 NXP LPC1788 微控制器开发一个应用程序,其中一个要求是尽快从 CAN1 端口接收 CAN 消息。我的问题是,在 CAN IRQ 的一次调用开始和下一次调用开始之间似乎存在约 270 微秒的延迟,即使微控制器似乎只需要约 30 微秒来处理中断。

除了这个中断之外,我还安排了每 50 微秒一次的定期定时器中断,该中断处理接收到 CAN 和 USB 消息。但是,如果没有要处理的 CAN 或 USB 消息,则此中断例程需要约 3 微秒,如果有则只需约 80 微秒。

正因为如此,我想知道为什么 CAN IRQ 的触发速度不能超过每 270 微秒,以及我能做些什么来解决这个问题。

USB 中断对性能的影响可以忽略不计,因为 USB 消息比 CAN 消息更不频繁地到达,而且我确定即使从未触发此中断也会出现此问题。

目前,我的应用程序似乎能够处理平均到达间隔时间约为 300 us 的 CAN 消息(测试以 1 ms 的间隔生成 3 条消息,处理了大约 500,000 条消息,丢弃率为 0%)。

此代码初始化 CAN:

这用于运行 CAN:

这是 CAN IRQ 代码:

COMMS_NotifyCANMessageReceived代码:

这是我的定时器中断代码,每 50 微秒触发一次:

以下是运行应用程序时典型事件日志的摘录,消息之间的平均到达间隔时间为 200 us:

在哪里:

  • 0xAAAAAAAA表示 CAN IRQ 的开始。
  • 0xBBBBBBBB表示 CAN IRQ 的结束。
  • 0x88888888表示interpretMessage在定时器 IRQ 内将要处理一条 CAN 报文。
  • 0x99999999表示我们已经从interpretMessage.

您可以看到,尽管消息每 200 us 到达,但 CAN IRQ 仅每约 270 us 为它们提供服务。这会导致接收队列不断增加,直到最终消息开始被丢弃。

任何帮助,将不胜感激。

编辑 1

我也许还应该提到我的 CAN 外围设备被编程为以 500 kBaud 的速率运行。此外,我的应用程序涉及回显接收到的 CAN 消息,因此任何到达端口 1 的消息都会在端口 2 上重新传输。

编辑 2

CAN 和 TIMER_0 中断例程具有相同的优先级:

编辑 3

我可以确认问题仍然存在,即使我禁用定时器中断并且让 CAN IRQ 除了将接收到的 CAN 消息复制到 RAM 并释放接收缓冲区之外什么也不做,中断之间的 ~270 us 间隔几乎没有变化。

0 投票
2 回答
598 浏览

can-bus - 如果两个同名的节点在 j1939 中声明相同的地址会发生什么?

如果两个同名的节点在 j1939 中声明相同的地址,在这种情况下会发生什么?任何一个节点都会要求地址或错误会发生吗?