我们有一个机器人项目,电机控制器使用CANopen进行通信.我需要使用主微控制器与这些电机控制器进行通信.问题是我需要在这个微控制器中开发CANopen层,但我只知道如何在低级别(CAN)发送和接收.
我不太了解CANopen(PDO,SDO,Heartbeat,对象字典等).我试着阅读CiA规范,但它非常复杂.如果有人能指出我正确的方向,或者给我一个很好的教程来编写一个简单的CANopen层,我将不胜感激.
我正在尝试在几个LPC设备节点之间设置CAN通信.我的设置包括一些写入CAN总线的CAN节点.例如,LPC 2292 CAN控制器可以写入CAN总线,LPC1758可以接收数据.这完全没问题.现在LPC1758有2个CAN控制器,我设置了一个用于接收数据,另一个用于在总线上传输数据作为响应.我还为LPC 1758 CAN 1发送和接收以及CAN 2发送和接收设置了中断处理程序.(我没有LPC 2292的代码.它不在我的控制之下)
我的问题是在LPC1758方面.这里CAN 1接收器能够从其他CAN节点获取数据,因为我可以看到被调用的中断向量处理程序.问题是当LPC 1758 CAN 2 tranmistter写入总线时.它会出现总线错误.更具体地说"Start of Frame " error.(我使用Ulink2调试器).现在读取CAN规范,我知道CAN消息的起始帧应该从低(主导)位CAN规范开始; 见第3页
我该如何解决此错误?它不是可配置的寄存器,我可以将第一位设置为0或1.我运行KEIL附带的默认LPC 1758 CAN代码C:\Keil_v5\ARM\Boards\Keil\MCB1700\CAN我认为代码很好,因为当我在KEIL的模拟模式下运行代码时我可以看到CAN通信运行良好.
这个"框架开始"是否是我缺少的其他一些配置的副产品?
Update Code :
Run Code Online (Sandbox Code Playgroud)
我运行KEIL附带的默认LPC 1758 CAN代码C:\Keil_v5\ARM\Boards\Keil\MCB1700\CAN我认为代码很好,因为当我在KEIL的模拟模式下运行代码时,我可以看到CAN通信工作正常.除了波特率之外,我没有对代码进行任何更改.CAN设置:
/*----------------------------------------------------------------------------
setup CAN interface. CAN controller (1..2)
*----------------------------------------------------------------------------*/
void CAN_setup (uint32_t ctrl) {
LPC_CAN_TypeDef *pCAN = (ctrl == 1) ? LPC_CAN1 : LPC_CAN2;
if (ctrl == 1) {
LPC_SC->PCONP |= (1 << 13); /* Enable power to CAN1 block */
LPC_PINCON->PINSEL0 |= (1 << …Run Code Online (Sandbox Code Playgroud) 我想创建一个程序来模拟CAN端口,以便为另一个大型应用程序进行测试.程序应通过此虚拟CAN发送先前记录的数据.有人有这方面的经验吗?
我正在考虑建立虚拟COM,并通过它发送包含在CAN帧中的数据.可以吗?我怎么能在linux上建立虚拟COM?发现这个线程的虚拟串口Linux, 但遗憾的是我不知道如何将它实现到程序的源代码(linux下的初学linux用户和程序员).
很乐意阅读您的经验和建议.
我需要在笔记本电脑上创建一个Java程序来接收/发送CANopen消息.
选择RJ45作为网络的物理介质.我是CANopen和Java通信编程的新手.
请原谅我,如果我似乎不知情.事实是,我已经阅读了很多,但我仍然不知道如何开始.
我正在考虑利用Boost Asio从Socket CAN读取数据.在linux/can.h中没有任何花哨的东西,设备应该像loopback接口一样,并与原始套接字一起使用.
看一下basic_raw_socket界面,似乎我可以利用
basic_raw_socket :: assign来分配用它创建的本机套接字
socket( PF_CAN, SOCK_RAW, CAN_RAW );
Run Code Online (Sandbox Code Playgroud)
这就是我到目前为止所拥有的
namespace can {
class CanSocket {
public:
typedef boost::asio::ip::basic_endpoint<CanSocket> endpoint;
typedef boost::asio::ip::basic_resolver_query<CanSocket> resolver_query;
typedef boost::asio::ip::basic_resolver_iterator<CanSocket> resolver_iterator;
typedef boost::asio::basic_raw_socket<CanSocket> socket;
typedef boost::asio::ip::basic_resolver<CanSocket> resolver;
CanSocket()
: _protocol( CAN_RAW )
, _family( PF_CAN )
{
}
static CanSocket v4()
{
return CanSocket();
}
static CanSocket v6();
int type() const;
int protocol() const;
int family() const;
friend bool operator==(const CanSocket& p1, const …Run Code Online (Sandbox Code Playgroud) 我知道显性确认位是由另一个节点传输的消息的接收者发送的。
我无法理解的是,接收器在接收到整个消息后是否发送了单个显性位,或者接收器发送了相同的消息,其中 ACK 位字段作为显性?
或者是在发送器传输数据帧时接收器将 ACK 字段驱动到不同的电压电平?
另外,两个 CAN 节点可以确认同一消息吗?如果是,那么如何?如果不是,那为什么?
我需要澄清这一点。
我成功地对在 Beaglebone black 上运行的 Nodejs 应用程序进行了 docker 化。但现在我想从 docker 容器内访问 CAN,但它不起作用。
\n请注意,我成功地在主机中配置了 CAN 端口,并且 candump 显示它可以工作。
\n$ candump can1\n can1 18FF30D0 [8] 00 00 00 00 00 00 00 00\n can1 18FF02D0 [4] 00 00 00 00\n can1 18FF21D0 [3] 00 00 00\n can1 18FF3CD0 [4] 00 7D 28 7D\n can1 18FF30D0 [8] 00 03 00 00 00 00 00 00\n can1 18FF02D0 [4] 00 00 00 00\nRun Code Online (Sandbox Code Playgroud)\n我在 Dockerfile 中构建了 socketcan 节点模块,如下所示:
\n #If you don't …Run Code Online (Sandbox Code Playgroud) 如何创建多个虚拟套接字并将它们链接在一起以创建虚拟总线?
我想模拟一个应用程序,其中许多节点通过CAN相互通信.
我有一个结构来表示具有位字段的29位CAN标识符如下.
struct canId
{
u8 priority :3;
u8 reserved :1;
u8 dataPage :1;
u8 pduFormat :8;
u8 pduSpecific :8;
u8 sourceAddress :8;
} iD;
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我想将此结构复制到整数变量.就像是:
int newId = iD;
Run Code Online (Sandbox Code Playgroud)
但是我不确定这是否正确.有人可以对此发表评论吗?
编辑:我可以在每个字段上使用shift运算符,然后使用按位OR将它们放在正确的位置.但这首先使得位域结构的使用毫无用处.
我正在运行一个带有两个 CAN 通道的程序(使用 TowerTech CAN Cape TT3201)。
两个通道是 can0 (500k) 和 can1 (125k)。can0 通道工作正常,但 can1 运行写入:无可用缓冲区空间错误。
我正在使用 ValueCAN3/VehicleSpy 来检查消息。
这是在我运行程序之前。can0 和 can1 似乎都发送,但在 VehicleSpy 中只显示 can0。
root@cantool:~# cansend can0 100#00
root@cantool:~# cansend can1 100#20
Run Code Online (Sandbox Code Playgroud)
这是在我尝试运行程序之后
root@cantool:~# cansend can1 100#20
write: No buffer space available
root@cantool:~# cansend can0 111#10
Run Code Online (Sandbox Code Playgroud)
当我的程序正在运行时:对于要在 can1 上发送的所有消息,我收到此错误
2016-11-02 15:36:03,052 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f83018 010 1 00
2016-11-02 15:36:03,131 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 0af81118 010 6 …Run Code Online (Sandbox Code Playgroud)