Sophie

Sophie

distrib > Mageia > 6 > armv7hl > by-pkgid > 3214e0cac2e902da44e71b50fa86ebb6 > files > 123

qtserialbus5-doc-5.9.4-1.mga6.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- socketcan.qdoc -->
  <title>Using SocketCAN Plugin | Qt Serial Bus 5.9</title>
  <link rel="stylesheet" type="text/css" href="style/offline-simple.css" />
  <script type="text/javascript">
    document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css");
    // loading style sheet breaks anchors that were jumped to before
    // so force jumping to anchor again
    setTimeout(function() {
        var anchor = location.hash;
        // need to jump to different anchor first (e.g. none)
        location.hash = "#";
        setTimeout(function() {
            location.hash = anchor;
        }, 0);
    }, 0);
  </script>
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="main">
    <div class="main-rounded">
      <div class="navigationbar">
        <table><tr>
<td >Qt 5.9</td><td ><a href="qtserialbus-index.html">Qt Serial Bus</a></td><td >Using SocketCAN Plugin</td></tr></table><table class="buildversion"><tr>
<td id="buildversion" width="100%" align="right">Qt 5.9.4 Reference Documentation</td>
        </tr></table>
      </div>
    </div>
<div class="content">
<div class="line">
<div class="content mainContent">
<div class="sidebar">
<div class="toc">
<h3><a name="toc">Contents</a></h3>
<ul>
<li class="level1"><a href="#socketcan-usage">SocketCAN usage</a></li>
<li class="level2"><a href="#setting-up-real-can-hardware">Setting up real CAN hardware</a></li>
<li class="level2"><a href="#setting-up-a-virtual-can-bus">Setting up a virtual CAN bus</a></li>
<li class="level1"><a href="#creating-can-bus-devices">Creating CAN Bus Devices</a></li>
</ul>
</div>
<div class="sidebar-content" id="sidebar-content"></div></div>
<h1 class="title">Using SocketCAN Plugin</h1>
<span class="subtitle"></span>
<!-- $$$qtserialbus-socketcan-overview.html-description -->
<div class="descr"> <a name="details"></a>
<p>The SocketCAN plugin encapsulates the Linux sockets API for accessing the CAN devices. This API is a set of open source CAN drivers and a networking stack contributed by Volkswagen Research to the Linux kernel.</p>
<p>This plugin requires a Linux Kernel with SocketCAN support and SocketCAN device drivers for the used CAN hardware.</p>
<a name="socketcan-usage"></a>
<h2 id="socketcan-usage">SocketCAN usage</h2>
<p>To list all (including unconfigured) network interfaces, the command <code>ifconfig -a</code> can be used.</p>
<p>To use SocketCAN, the corresponding Linux Kernel modules must be loaded and the network interface must be configured.</p>
<a name="setting-up-real-can-hardware"></a>
<h3 >Setting up real CAN hardware</h3>
<p>This section assumes, that the device driver is already loaded (most likely automatically when connecting the CAN hardware).</p>
<a name="default-settings"></a>
<h4 >Default settings</h4>
<p>To set the device can0 to a bitrate of 250 kBit/s:</p>
<pre class="cpp">

  sudo ip link set up can0 type can bitrate <span class="number">250000</span>

</pre>
<p>To automatically recover from &quot;bus off&quot; errors after 100 milliseconds, the following command can be used:</p>
<pre class="cpp">

  sudo ip link set up can0 type can bitrate <span class="number">250000</span> restart<span class="operator">-</span>ms <span class="number">100</span>

</pre>
<a name="can-fd-settings"></a>
<h4 >CAN FD settings</h4>
<p>To set the device can0 to an arbitration bitrate of 500 kBit/s and a data bitrate of 4 MBit/s (for frames with bitrate switch flag):</p>
<pre class="cpp">

  sudo ip link set can0 up type can bitrate <span class="number">500000</span> dbitrate <span class="number">4000000</span> fd on

</pre>
<a name="setting-up-a-virtual-can-bus"></a>
<h3 >Setting up a virtual CAN bus</h3>
<p><b>Note: </b>For CAN FD usage, the MTU (Maximum Transmission Unit) has to be set to 72 byte.</p><pre class="cpp">

  sudo modprobe vcan
  sudo ip link add dev vcan0 type vcan
  sudo ip link set up vcan0 mtu <span class="number">72</span>

</pre>
<p>The command line test programs used in the following are from the <a href="https://github.com/linux-can/can-utils">can-utils</a> package:</p>
<pre class="cpp">

  <span class="preprocessor"># Display received CAN messages with absolute timestamps and flags</span>
  candump <span class="operator">-</span>ta <span class="operator">-</span>x vcan0

  <span class="preprocessor"># Send a CAN FD message with flags BRS and EFI set</span>
  cansend vcan0 <span class="number">123</span><span class="preprocessor">##3112233445566778899aabbccddeeff</span>

  <span class="preprocessor"># Generate random CAN messages</span>
  cangen vcan0

</pre>
<a name="creating-can-bus-devices"></a>
<h2 id="creating-can-bus-devices">Creating CAN Bus Devices</h2>
<p>At first it is necessary to check that <a href="qcanbus.html">QCanBus</a> provides the desired plugin:</p>
<pre class="cpp">

  <span class="keyword">if</span> (<span class="type"><a href="qcanbus.html">QCanBus</a></span><span class="operator">::</span>instance()<span class="operator">-</span><span class="operator">&gt;</span>plugins()<span class="operator">.</span>contains(<span class="type">QStringLiteral</span>(<span class="string">&quot;socketcan&quot;</span>))) {
      <span class="comment">// plugin available</span>
  }

</pre>
<p>Where <i>socketcan</i> is the plugin name.</p>
<p>Next, a connection to a specific interface can be established:</p>
<pre class="cpp">

  <span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span> <span class="operator">*</span>device <span class="operator">=</span> <span class="type"><a href="qcanbus.html">QCanBus</a></span><span class="operator">::</span>instance()<span class="operator">-</span><span class="operator">&gt;</span>createDevice(
      <span class="type">QStringLiteral</span>(<span class="string">&quot;socketcan&quot;</span>)<span class="operator">,</span> <span class="type">QStringLiteral</span>(<span class="string">&quot;can0&quot;</span>));
  device<span class="operator">-</span><span class="operator">&gt;</span>connectDevice();

</pre>
<p>Where <i>can0</i> is the active CAN interface name. CAN interfaces act like regular network interfaces on Linux systems and can be discovered using <code>ifconfig</code>.</p>
<p>The device is now open for writing and reading CAN frames:</p>
<pre class="cpp">

  <span class="type"><a href="qcanbusframe.html">QCanBusFrame</a></span> frame;
  frame<span class="operator">.</span>setFrameId(<span class="number">8</span>);
  <span class="type">QByteArray</span> payload(<span class="string">&quot;A36E&quot;</span>);
  frame<span class="operator">.</span>setPayload(payload);
  device<span class="operator">-</span><span class="operator">&gt;</span>writeFrame(frame);

</pre>
<p>The reading can be done using the <a href="qcanbusdevice.html#readFrame">readFrame()</a> method. The <a href="qcanbusdevice.html#framesReceived">framesReceived()</a> signal is emitted when at least one new frame is available for reading:</p>
<pre class="cpp">

  <span class="type"><a href="qcanbusframe.html">QCanBusFrame</a></span> frame <span class="operator">=</span> device<span class="operator">-</span><span class="operator">&gt;</span>readFrame();

</pre>
<p>SocketCAN supports the following configurations that can be controlled through <a href="qcanbusdevice.html#setConfigurationParameter">setConfigurationParameter()</a>:</p>
<div class="table"><table class="generic">
 <thead><tr class="qt-style"><th >Configuration parameter key</th><th >Description</th></tr></thead>
<tr valign="top" class="odd"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::LoopbackKey</a></td><td >To meet the multiple-user needs, the local loopback is enabled by default. This means, whenever a CAN frame is transmitted on the CAN bus, a local echo of this frame is sent to all applications connected to this CAN device.</td></tr>
<tr valign="top" class="even"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::ReceiveOwnKey</a></td><td >The reception of the CAN frames on the same socket that was sending the CAN frame is disabled by default. When enabling this option, all CAN frames sent to the CAN bus immediately appear in the receive buffer. This can be used to check if sending was successful.</td></tr>
<tr valign="top" class="odd"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::ErrorFilterKey</a></td><td >A CAN interface driver can generate so called <i>Error Message Frames</i> that can optionally be passed to the user application in the same way as other CAN frames. The possible errors are divided into different error classes that may be filtered using the appropriate error mask. The values for the error mask are defined in <code>linux/can/error.h</code>.</td></tr>
<tr valign="top" class="even"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::RawFilterKey</a></td><td >This configuration can contain multiple filters of type <a href="qcanbusdevice-filter.html">QCanBusDevice::Filter</a>. By default, the connection is configured to accept any CAN bus message.</td></tr>
<tr valign="top" class="odd"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::BitRateKey</a></td><td >This configuration is not supported by the socketcan plugin. However it is possible to set the rate when configuring the CAN network interface using the <code>ip link</code> command.</td></tr>
<tr valign="top" class="even"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::CanFdKey</a></td><td >This configuration option determines whether CANFD frames may be sent or received. By default, this option is disabled. It controls the CAN_RAW_FD_FRAMES option of the CAN socket.</td></tr>
<tr valign="top" class="odd"><td ><a href="qcanbusdevice.html#ConfigurationKey-enum">QCanBusDevice::DataBitRateKey</a></td><td >This configuration is not supported by the socketcan plugin. However it is possible to set the data rate when configuring the CAN network interface using the <code>ip link</code> command.</td></tr>
</table></div>
<p>For example:</p>
<pre class="cpp">

  <span class="type">QList</span><span class="operator">&lt;</span><span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span><span class="operator">::</span>Filter<span class="operator">&gt;</span> list;
  <span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span><span class="operator">::</span>Filter f;

  <span class="comment">// only accept odd numbered frame id of type remote request</span>
  <span class="comment">// frame can utilize extended or base format</span>
  f<span class="operator">.</span>frameId <span class="operator">=</span> <span class="number">0x1</span>;
  f<span class="operator">.</span>frameIdMask <span class="operator">=</span> <span class="number">0x1</span>;
  f<span class="operator">.</span>format <span class="operator">=</span> <span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span><span class="operator">::</span>Filter<span class="operator">::</span>MatchBaseAndExtendedFormat;
  f<span class="operator">.</span>type <span class="operator">=</span> <span class="type"><a href="qcanbusframe.html">QCanBusFrame</a></span><span class="operator">::</span>RemoteRequestFrame;
  list<span class="operator">.</span>append(f);

  device<span class="operator">-</span><span class="operator">&gt;</span>setConfigurationParameter(<span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span><span class="operator">::</span>RawFilterKey<span class="operator">,</span> <span class="type">QVariant</span><span class="operator">::</span>fromValue(list));
  device<span class="operator">-</span><span class="operator">&gt;</span>setConfigurationParameter(<span class="type"><a href="qcanbusdevice.html">QCanBusDevice</a></span><span class="operator">::</span>ErrorFilterKey<span class="operator">,</span>
                                    <span class="type">QVariant</span><span class="operator">::</span>fromValue(<span class="type"><a href="qcanbusframe.html">QCanBusFrame</a></span><span class="operator">::</span>FrameErrors(<span class="type"><a href="qcanbusframe.html">QCanBusFrame</a></span><span class="operator">::</span>AnyError)));

</pre>
<p>Extended frame format and flexible data-rate are supported in SocketCAN.</p>
</div>
<!-- @@@qtserialbus-socketcan-overview.html -->
        </div>
       </div>
   </div>
   </div>
</div>
<div class="footer">
   <p>
   <acronym title="Copyright">&copy;</acronym> 2017 The Qt Company Ltd.
   Documentation contributions included herein are the copyrights of
   their respective owners.<br>    The documentation provided herein is licensed under the terms of the    <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation    License version 1.3</a> as published by the Free Software Foundation.<br>    Qt and respective logos are trademarks of The Qt Company Ltd.     in Finland and/or other countries worldwide. All other trademarks are property
   of their respective owners. </p>
</div>
</body>
</html>