未调用Socketcan注册侦听器

时间:2016-06-26 10:16:33

标签: javascript node.js meteor can-bus socketcan

我正在使用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消息到达时,不会调用。

已经工作的内容/我已经检查过的内容:

  • 通过过滤ID来接收特定的CAN消息(请参阅下面的代码)
  • 访问/阅读canDefiniton.kcd数据库



// 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 );




有人帮忙吗?谢谢!

1 个答案:

答案 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能够处理多路复用的消息!

也许这可以帮助那些不使用多路复用消息的人。我继续尝试复制的那些。