我正在使用Meteor和' socketcan' RaspberryPi上的npm包。为了定义我的CAN网络,我正在使用一个皮划艇文件' canDefinition.kcd'。这是我在服务器文件夹中的启动javascript文件的样子:
// This code is running OUTSIDE of Meteor.startup loop
"use strict";
var can = Meteor.npmRequire('socketcan');
var fs = Meteor.npmRequire('fs');
// Parse database
var network = can.parseNetworkDescription("/home/MyMeteorProject/public/canDefinition.kcd");
var channel = can.createRawChannel("can0");
var db = new can.DatabaseService(channel, network.buses["Private"]);
channel.start();
db.messages["x192_speed"].signals["motor"].onChange(function(s) {
var newValue = s.value[1] * 256 + s.value[0];
console.log("onChange successful" + newValue);
});

我按照sebi2k1/node-can的说明进行操作。
问题现在是,听众' onChange'当所选CAN消息到达时,不会调用。
已经工作的内容/我已经检查过的内容:
// This code is running in Meteor.startup loop
var old_value = 0;
//CAN bus test:
var boundFunction = Meteor.bindEnvironment(function (msg) {
if (msg.id == 0x192)
{
console.log(msg.data);
var Value = msg.data[0];
mCollection.update({Name: 'motor'}, {$set: {Value: Value}});
}
old_value = Value;
});
// Log any message
channel.addListener("onMessage", boundFunction );

有人帮忙吗?谢谢!
答案 0 :(得分:0)
现状:
我收到一些CAN消息,但不是全部。看起来我的kcd文件格式有些错误。现在我让它工作,但只是部分。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NetworkDefinition xmlns="http://kayak.2codeornot2code.org/1.0">
<Document name="CANDatabase.dbc" date="Mon Jul 13 08:46:25 UTC 2016">Converted with CANBabel (https://github.com/julietkilo/CANBabel)</Document>
<Node id="Vector__XXX" name="Vector__XXX"/>
<Bus name="Machine">
<Message id="0x219" name="x219_Diagnose_Interface" length="8">
<Signal name="hw_start" offset="32"/>
<Signal name="hw_Valid" offset="35"/>
<Signal name="hw_Stickcheck" offset="36"/>
<Signal name="hw_TT_On" offset="33"/>
</Message>
<Message id="0x128" name="x128_hw_Istwerte" length="8">
<Multiplex length="4" name="x195_hw_Currentvalue_Mux" offset="0">
<MuxGroup count="1">
<Signal name="Wire_Stick1" offset="6"/>
<Signal name="ready" offset="21"/>
<Signal length="16" name="Current" offset="48">
<Value slope="0.1" unit="A" max="6553.5"/>
</Signal>
<Signal name="E01" offset="17"/>
<Signal length="16" name="Tension" offset="32">
<Value slope="0.1" unit="V" max="6553.5"/>
</Signal>
<Signal name="E03" offset="19"/>
<Signal name="PU_ready" offset="8"/>
<Signal name="E04" offset="18"/>
<Signal name="Current_running" offset="5"/>
<Signal name="E25" offset="16"/>
</MuxGroup>
<MuxGroup count="4">
<Signal name="Wire_Stick4" offset="6"/>
<Signal name="PU_ready4" offset="8"/>
<Signal name="Current_running4" offset="5"/>
<Signal length="16" name="Current_Power" offset="32">
<Value unit="W" max="65535.0"/>
</Signal>
</MuxGroup>
</Multiplex>
</Message>
如果我只拨打多路复用信息,例如id 0x128 信号准备好比没有任何事情发生。我没有得到回调。
如果我只拨打“正常”信息,例如id 0x219 信号 hw_start 它工作正常,我收到了正确的值。
如果我和两个不同的onchangeListener一起调用它,它就不能工作了! 我已经检查过,如果我发了一些错误信息,但我都是正确的。在文档之后,sebi2k1/node-can能够处理多路复用的消息!
也许这可以帮助那些不使用多路复用消息的人。我继续尝试复制的那些。