using Kvaser.CanLib; using System.Text;
讯享网
namespace CanDemo {
讯享网</span><span style="color: rgba(0, 128, 0, 1)">//</span> <span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://blog.csdn.net/supposing/article/details/</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> D:Program FilesKvaserCanlibdotnetx64 etstandard2.0Kvaser.CanLib.dll
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> KvaserApi { </span><span style="color: rgba(0, 0, 255, 1)">int</span> hnd = <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Kvaser通道句柄</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> CanState = <span style="color: rgba(0, 0, 255, 1)">false</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">CAN状态</span> Thread readCANThread; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建数据监听控制线程 </span><span style="color: rgba(0, 128, 0, 1)">// public class CanMsg//定义CanMsg包 {
讯享网 </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> ID; </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] Data; </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> DataType; </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> TimeStamp; } </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> InitKvaser(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> BaudRate) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> freq = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">50</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率50K对应freq为-7</span> freq = -<span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">100</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率100K对应freq为-5</span> freq = -<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">125</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率125K对应freq为-4</span> freq = -<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">250</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率250K对应freq为-3</span> freq = -<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">500</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率500K对应freq为-2</span> freq = -<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BaudRate == <span style="color: rgba(128, 0, 128, 1)">1000</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">波特率1000K对应freq为-1</span> freq = -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建Kvaser状态句柄</span> Canlib.canStatus stat = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Canlib.canStatus(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Kvaser软件库初始化</span> Canlib.canInitializeLibrary();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打开CAN通道;其中第一个参数为通道号,从0开始,如有多CAN卡或多通道,则依次为2、3...;第二个参数为canOPEN_xxx标志,一般默认为0;返回值为通道句柄</span> hnd = Canlib.canOpenChannel(<span style="color: rgba(128, 0, 128, 1)">0</span>, Canlib.canOPEN_ACCEPT_VIRTUAL);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Canlib.canOPEN_EXCLUSIVE </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置CAN参数;第一个参数为CAN通道句柄,第二个参数为波特率对应参数,其他参数默认为0即可;返回值为0则代表设置成功,否则设置失败</span> stat = Canlib.canSetBusParams(hnd, freq, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">if</span> (stat == Canlib.canStatus.canOK)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果打开成功,则CAN状态更新为true</span> CanState = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">启动CAN BUS总线</span> Canlib.canBusOn(hnd);
讯享网 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重置CAN BUS总线</span> Canlib.canResetBus(hnd);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清空缓存区</span> Canlib.canFlushReceiveQueue(hnd);
讯享网 </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CanState == <span style="color: rgba(0, 0, 255, 1)">false</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果CAN卡打开失败,则弹出错误提示信息</span> {
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CAN启动失败!请连接CAN卡或重新插拔CAN卡!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">; } canWrite(hnd, </span><span style="color: rgba(128, 0, 128, 1)">111</span>, <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] { <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span> }, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">标准帧</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">canWrite(hnd, 222, new byte[] { 1, 1, 1, 1, 1 }, "扩展帧"); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如打开成功,启动CAN信号读取线程</span> readCANThread = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ThreadStart(DataReadCAN)); readCANThread.IsBackground </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; readCANThread.Start();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">启动CAN接收</span> }
讯享网 </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> CloseKvaser() { Canlib.canBusOff(hnd);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭CAN总线</span> Canlib.canClose(hnd);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭CAN通道</span> Canlib.canUnloadLibrary();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">卸载软件库</span> CanState = <span style="color: rgba(0, 0, 255, 1)">false</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">CAN状态更新为false</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (readCANThread != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) readCANThread.Abort();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">退出监听线程</span> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">写入CAN数据</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> canWrite(<span style="color: rgba(0, 0, 255, 1)">int</span> hnd, <span style="color: rgba(0, 0, 255, 1)">int</span> ID, <span style="color: rgba(0, 0, 255, 1)">byte</span>[] data, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> dataType) { </span><span style="color: rgba(0, 0, 255, 1)">bool</span> writeResult = <span style="color: rgba(0, 0, 255, 1)">false</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送是否成功标识</span> Canlib.canStatus stat = Canlib.canStatus.canERR_NOMSG;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Kvaser状态句柄 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">canWrite输入5个参数。第一个为通道句柄,为canOpenChannel的返回值;第二个参数为CAN报文的ID;第三个参数为报文数据; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第四个参数为报文长度;第五个参数为报文类型(扩展帧或标准帧)</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (dataType == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">标准帧</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) stat </span>=<span style="color: rgba(0, 0, 0, 1)"> Canlib.canWrite(hnd, ID, data, data.Length, Canlib.canMSG_STD); </span><span style="color: rgba(0, 0, 255, 1)">if</span> (dataType == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扩展帧</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) stat </span>=<span style="color: rgba(0, 0, 0, 1)"> Canlib.canWrite(hnd, ID, data, data.Length, Canlib.canMSG_EXT); </span><span style="color: rgba(0, 0, 255, 1)">if</span> (stat == Canlib.canStatus.canOK)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果写入返回值为canOK,说明写入成功</span> writeResult = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> writeResult; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取CAN数据</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> canRead(<span style="color: rgba(0, 0, 255, 1)">int</span> hnd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> filterID) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> dlc, flags;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义数据长度及数据标识</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] msg = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[<span style="color: rgba(128, 0, 128, 1)">8</span>];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义数据数组</span> <span style="color: rgba(0, 0, 255, 1)">int</span> IDReceive = filterID;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义过滤ID</span> <span style="color: rgba(0, 0, 255, 1)">long</span> time;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义时间戳</span> Canlib.canStatus stat;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Kvaser状态句柄 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">canRead第一个参数为通道句柄,为canOpenChannel的返回值;第二个参数为过滤的ID,如果为-1,则全部接受;否则为待接收的ID; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第三个参数为报文数据;第四个参数为报文长度;第五个参数为报文类型(扩展帧或标准帧);第六个参数为报文时间戳</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (filterID == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) stat </span>= Canlib.canRead(hnd, <span style="color: rgba(0, 0, 255, 1)">out</span> IDReceive, msg, <span style="color: rgba(0, 0, 255, 1)">out</span> dlc, <span style="color: rgba(0, 0, 255, 1)">out</span> flags, <span style="color: rgba(0, 0, 255, 1)">out</span> time);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果全部接收,则使用canRead函数</span> <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> stat </span>= Canlib.canReadSpecific(hnd, filterID, msg, <span style="color: rgba(0, 0, 255, 1)">out</span> dlc, <span style="color: rgba(0, 0, 255, 1)">out</span> flags, <span style="color: rgba(0, 0, 255, 1)">out</span> time);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果定义了过滤ID,则使用canReadSpecific函数</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (stat ==<span style="color: rgba(0, 0, 0, 1)"> Canlib.canStatus.canOK) { CanMsg canmsg </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> CanMsg() { TimeStamp =<span style="color: rgba(0, 0, 0, 1)"> time }; canmsg.ID </span>=<span style="color: rgba(0, 0, 0, 1)"> IDReceive; canmsg.Data </span>=<span style="color: rgba(0, 0, 0, 1)"> msg; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (flags == <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">) canmsg.DataType </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">标准帧</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (flags == <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">) canmsg.DataType </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扩展帧</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">string</span> hex = ToHexString(canmsg.Data, canmsg.Data.Length, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">); Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recv,TimeStamp={canmsg.TimeStamp},DataType={canmsg.DataType},ID={canmsg.ID},Data={hex}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); } } </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> DataReadCAN() { </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取CAN报文</span> canRead(hnd, -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">); } } </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> ToHexString(<span style="color: rgba(0, 0, 255, 1)">byte</span>[] bytes, <span style="color: rgba(0, 0, 255, 1)">int</span> length, <span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)"> space) { </span><span style="color: rgba(0, 0, 255, 1)">string</span> strFill = space ? <span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">string</span> hexString = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (bytes != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) { StringBuilder strB </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuilder(); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < length; i++<span style="color: rgba(0, 0, 0, 1)">) { strB.Append(bytes[i].ToString(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">X2</span><span style="color: rgba(128, 0, 0, 1)">"</span>) +<span style="color: rgba(0, 0, 0, 1)"> strFill); } hexString </span>=<span style="color: rgba(0, 0, 0, 1)"> strB.ToString(); } hexString </span>=<span style="color: rgba(0, 0, 0, 1)"> hexString.Trim(); </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> hexString; } } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/195071.html