<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Developer Blog归档 - Kvaser</title>
	<atom:link href="https://www.kvaser.cn/developer-blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kvaser.cn/developer-blog/</link>
	<description>先进的CAN总线解决方案专家</description>
	<lastBuildDate>Wed, 13 Aug 2025 05:27:07 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.kvaser.cn/wp-content/uploads/2024/06/favicon-3.ico</url>
	<title>Developer Blog归档 - Kvaser</title>
	<link>https://www.kvaser.cn/developer-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>安装指南&#124;在树莓派PC上安装Linuxcan和Linux驱动程序</title>
		<link>https://www.kvaser.cn/developer-blog/installing-linuxcan-and-linux-drivers-on-a-raspberry-pi-pc/</link>
		
		<dc:creator><![CDATA[Adam Raymer]]></dc:creator>
		<pubDate>Fri, 27 Jun 2025 05:23:13 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1190411</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/installing-linuxcan-and-linux-drivers-on-a-raspberry-pi-pc/">安装指南|在树莓派PC上安装Linuxcan和Linux驱动程序</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>树莓派（Raspberry Pi）已成为PC领域一款价格亲民但功能强大的工具。树莓派单板计算机易于嵌入、设置简单且非常灵活，广泛应用于各种系统中。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><a href="https://kvaser.com/single-download/?download_id=47147"><strong>Kvaser Linux</strong><strong>驱动程序和</strong><strong>SDK</strong><strong>开发包</strong></a>支持安装在树莓派操作系统上，让您的树莓派系统也能使用Kvaser硬件。安装过程与基于ARM的Linux PC类似，但存在一些关键差异。本文将介绍常规内核模块和动态内核模块（DKMS）的驱动安装方法。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>第一步是准备树莓派操作系统。首先启用源码包，方法是取消sources列表中deb-src行的注释，并使用“sudo”命令确保以管理员权限运行，如下所示：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%sudo sed -i  &lsquo;s/^#deb-src/deb-src/&rsquo; /etc/apt/sources.list.d/raspi.list
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>接下来，安装构建工具和内核头文件，并确保安装的内核头文件为最新版本。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%sudo apt update
%sudo apt install build-essential raspberrypi-kernel-headers</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您尚未下载Kvaser Linux驱动程序和SDK开发包，请在<a href="https://kvaser.com/single-download/?download_id=47147"><strong>这里</strong></a>下载。在终端窗口中，您需要使用以下命令解压文件：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%tar -xzf linxuxcan_X_XX_XXX.tar.gz
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>tar程序用于提取压缩的tar文件。其中，“x”命令用于解压，“z”命令用于启用gzip压缩（因为该文件已被压缩，需要解压缩），“f”命令则告知tar程序下一个参数是归档文件名。X_XX_XXX是您所下载的驱动程序和SDK的版本号。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>打开解压.tar.gz文件所在的目录，找到linuxcan文件夹。进入&#8221;linuxcan&#8221;目录后，运行：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%make
%sudo make install</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>默认情况下，PCIe和虚拟CAN驱动程序均未安装。这是因为您可能不希望在启动时加载这些驱动，特别是当您不打算使用它们时。这样可以减少设备启动时加载的组件。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您希望安装并加载虚拟CAN和PCIe驱动程序，则需要运行：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%sudo make load </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您使用的是不支持PCIe的旧主板，则需要对“sudo”命令使用“-E”参数，以保留环境变量。如果由于您的主板没有PCIe导致安装出现问题，那么我们需要设置“KDIR”和“KV_NO_PCI”这两个环境变量。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">$ sudo -E make install  </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h5><strong>使用动态内核模块支持（</strong><strong>DKMS</strong><strong>）</strong></h5>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您希望使用动态内核模块支持（DKMS），从而避免在内核更新后重新安装驱动程序，可以参考以下步骤。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>确保树莓派内核头文件更新到最新版本，然后安装DKMS。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%sudo sed -i  &lsquo;s/^#deb-src/deb-src/&rsquo; /etc/apt/sources.list.d/raspi.list
%sudo apt update
%sudo apt install build-essential raspberrypi-kernel-headers
%sudo apt install dkms</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>该命令将在您的系统上下载并安装DKMS软件包。安装完成后，运行以下命令安装兼容DKMS的驱动程序：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">%make dkms
%sudo make dkms_install  </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>总而言之，在树莓派上安装驱动程序与在其他Linux系统上安装并无太大差异，只是需要注意内核头文件是否正确。除了可以安装Linuxcan之外，您还可以在树莓派上使用SocketCAN。（注意：<em>在</em><em>PC</em><em>上安装驱动程序将会禁用</em><em>SocketCAN</em><em>驱动程序，以避免冲突。在其他</em><em>Linux PC</em><em>上安装</em><em>Linuxcan</em><em>也是如此。）</em></p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h5><strong>它能为您带来什么帮助？</strong></h5>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>单板计算机在人工智能和嵌入式系统中日益普及。能够在这些系统上安装Kvaser驱动程序，为Kvaser产品应用于更多新兴、有趣的环境中开启了机遇。您也可以在基于ARM的Linux系统上安装<a href="https://kvaser.com/single-download/?download_id=1011283887"><strong>Kvaser CanKing 7</strong></a>，构建属于您自己的单板CAN总线监控系统。您还可以通过加装HAT扩展板，为您的树莓派增加M.2接口功能，并使用<a href="https://kvaser.com/product/kvaser-m-2-pcie-4xcan/"><strong>Kvaser M.2 PCIe 4xCAN</strong></a>板卡来实现板载CAN功能。</p>
<p>&nbsp;</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1.webp" class="vc_single_image-img  attachment-full" alt="" title="Screenshot-2025-06-17-075947-2048x745" srcset="https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1.webp 2048w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-300x109.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-1024x373.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-768x279.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-100x36.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-1536x559.webp 1536w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-324x118.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/08/Screenshot-2025-06-17-075947-2048x745-1-416x151.webp 416w" sizes="(max-width: 2048px) 100vw, 2048px" /></div></div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/installing-linuxcan-and-linux-drivers-on-a-raspberry-pi-pc/">安装指南|在树莓派PC上安装Linuxcan和Linux驱动程序</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kvaser Mini PCIe通讯卡：主要区别和选型指南</title>
		<link>https://www.kvaser.cn/developer-blog/kvaser-mini-pcie-interface-cards-key-differences-selection-guide/</link>
		
		<dc:creator><![CDATA[Lars-Göran Fredriksson]]></dc:creator>
		<pubDate>Wed, 23 Apr 2025 07:56:23 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1045530</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-mini-pcie-interface-cards-key-differences-selection-guide/">Kvaser Mini PCIe通讯卡：主要区别和选型指南</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>截至2025年3月，Kvaser为嵌入式计算机共推出四种Mini PCIe小型CAN通讯卡。这些通讯卡的主要区别在于它们与主板CPU的连接方式： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<table>
<tbody>
<tr>
<th>Name</th>
<th>EAN</th>
<th>Lane used</th>
</tr>
<tr>
<td>
<p style="text-align: left; color: #374151;"><a href="https://kvaser.cn/product/kvaser-mini-pcie-1xcan-fd-over-usb/">Kvaser Mini PCIe 1xCAN</a></p>
</td>
<td>73-30130-01368-1</td>
<td>USB</td>
</tr>
<tr>
<td>
<p style="text-align: left; color: #374151;"><a href="https://kvaser.cn/product/kvaser-mini-pci-express-2xhs/">Kvaser Mini PCI Express 2xHS</a></p>
</td>
<td>73-30130-00743-7</td>
<td>USB</td>
</tr>
<tr>
<td>
<p style="text-align: left; color: #374151;"><a href="https://kvaser.cn/product/kvaser-mini-pci-express-1xcan-v3/">Kvaser Mini PCI Express 1xCAN v3</a></p>
</td>
<td>73-30130-01420-6</td>
<td>PCI</td>
</tr>
<tr>
<td>
<p style="text-align: left; color: #374151;"><a href="https://kvaser.com/product/kvaser-mini-pci-express-2xcan-v3-2/">Kvaser Mini PCI Express 2xCAN v3</a></p>
</td>
<td>73-30130-01417-6</td>
<td>PCI</td>
</tr>
</tbody>
</table>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><strong>了解区别</strong></p>
<p>这些卡遵循Mini PCI Express（mPCIe）标准，支持通过PCI Express x1或USB 2.0进行连接。不过，主板制造商并不需要同时支持这两种连接方式——有些主板仅提供PCI通道，有些则仅支持USB。</p>
<p>为什么不同时连接两个通道呢？一方面是因为“PCI Express x1”是CPU上的有限资源，可用的通道数量有限。另一方面是因为有些mPCIe卡并不需要超高速PCI通道，普通的USB通道就足够了。</p>
<p><strong>如何选择合适的通讯卡？</strong></p>
<p>如果要确定哪种Kvaser mPCIe卡适配您的系统，请查看主板的技术规格。在数据表中查找有关Mini PCIe扩展插槽的详细信息：</p>
<ul>
<li>如果其中提到“PCIe x1、USB 2.0”，则可以使用基于PCI的卡。</li>
<li>如果只列出 “Mini PCIe x1 (Gen 3)”，则很可能支持PCI，但未明确提及支持USB。</li>
</ul>
<ul>
<li>如果数据表内容不够明确，你可以咨询供应商确认mPCIe插槽是否兼容PCI、USB或两者皆可。在个别情况下，直接插卡测试或许是确认其兼容性的唯一途径。</li>
</ul>
<p><strong>产品对比</strong></p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<table>
<tbody>
<tr>
<th>EAN</th>
<td><a href="https://kvaser.cn/product/kvaser-mini-pcie-1xcan-fd-over-usb/">01368-1</a></td>
<td><a href="https://kvaser.cn/product/kvaser-mini-pci-express-2xhs/">00743-7</a></td>
<td><a href="https://kvaser.cn/product/kvaser-mini-pci-express-1xcan-v3/">01420-6 </a></td>
<td><a href="https://kvaser.com/product/kvaser-mini-pci-express-2xcan-v3-2/">01417-6 </a></td>
</tr>
<tr>
<th>Name</th>
<td>Mini PCIe 1xCAN</td>
<td>Kvaser Mini PCI Express 2xHS</td>
<td>Kvaser Mini PCI Express 1xCAN v3</td>
<td>Kvaser Mini PCI Express 2xCAN v3</td>
</tr>
<tr>
<th>Mode</th>
<td>USB</td>
<td>USB</td>
<td>PCI</td>
<td>PCI</td>
</tr>
<tr>
<th>CAN FD</th>
<td>YES</td>
<td>NO</td>
<td>YES</td>
<td>YES</td>
</tr>
<tr>
<th># CAN channels</th>
<td>1</td>
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<th>Galvanic isolation</th>
<td>YES</td>
<td>YES</td>
<td>YES</td>
<td>YES</td>
</tr>
<tr>
<th>Operation system</th>
<td>WIN+LINUX</td>
<td>WIN+LINUX</td>
<td>WIN+LINUX</td>
<td>WIN+LINUX</td>
</tr>
<tr>
<th>Silent mode</th>
<td>YES</td>
<td>YES</td>
<td>YES</td>
<td>YES</td>
</tr>
</tbody>
</table>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>从上表可见，各产品在功能上并无显著差异，唯一例外是00743-7无法处理CAN FD帧。</p>
<p><strong>性能差异</strong><strong> </strong></p>
<p>&gt;问：<strong>通信方式是否会影响性能？</strong><br />
会的。PCI与USB的通信机制不同，这会影响到性能：</p>
<ul>
<li><strong>PCI</strong><strong>通信</strong>速度极快，能够在CPU与CAN控制器之间实现<strong>极低的延迟</strong>。</li>
<li><strong>USB</strong><strong>通信</strong>虽快，但当需要在主板上实现较为复杂的通信时，速度不及PCI。</li>
</ul>
<p>&gt;问：<strong>这在标准应用中是否重要？</strong><br />
对于常见的CAN应用来说并不重要——通常不会有明显的性能差异。然而，对于需要<strong>大量</strong><strong>ECU</strong><strong>刷写</strong>操作的应用，采用PCI通讯卡可能有助于实现<strong>更快速的数据传输</strong>。</p>
<p><strong>驱动程序和</strong><strong>SDK</strong><strong>的差异</strong><strong> </strong></p>
<p>所有Kvaser CAN和LIN通讯卡均使用相同的驱动程序和SDK，确保了软件的兼容性。在大多数情况下，只要所安装的版本兼容该通讯卡，更换Kvaser通讯卡时便无需调整软件。</p>
<p>但也有一些特殊情况需要注意：</p>
<ul>
<li><strong>Linux</strong><strong>内核和</strong><strong>SocketCAN</strong><strong>：</strong>Linux内核管理内置的SocketCAN版本，因此某些产品可能需要达到<strong>最低内核版本</strong>才能正常运行。</li>
<li><strong>驱动程序更新：</strong>使用老旧的驱动程序可能导致新推出的Kvaser产品无法被识别。因此，我们建议您始终使用最新版本的驱动程序和SDK，以确保完全兼容。</li>
</ul>
<p>所有Kvaser驱动和SDK均免费使用——无需支付许可费用，更无隐形费用！另外，Kvaser技术支持服务同样完全免费！</p>
<p><strong>Kvaser</strong><strong>技术支持</strong></p>
<p>Kvaser技术支持团队随时待命，为您提供帮助。无论是寻求技术援助、咨询相关产品问题，还是想表达对我们的认可，欢迎您发送邮件至<strong><a href="mailto:SUPPORT.CN@KVASER.COM">SUPPORT.CN@KVASER.COM</a></strong>。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><em>PCI Express Mini</em><em>通讯卡尺寸为</em><em>30 mm×50.95 mm</em><em>（宽</em><em>×</em><em>长），属于全尺寸迷你卡。卡上配备</em><em>52</em><em>针边缘连接器，由两排交错排列、间距为</em><em>0.8 mm</em><em>的连接器组成。每排包含八个触点，接着是一个相当于四个触点宽的间隙，再之后是另外</em><em>18</em><em>个触点。</em><em> </em></p>

		</div>
	</div>
</div></div></div><div class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1.webp" class="vc_single_image-img  attachment-full" alt="" title="01368-1_4-2048x1205" srcset="https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1.webp 2048w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-300x177.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-1024x603.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-768x452.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-100x59.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-1536x904.webp 1536w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-324x191.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/05/01368-1_4-2048x1205-1-416x245.webp 416w" sizes="(max-width: 2048px) 100vw, 2048px" /></div></div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-mini-pcie-interface-cards-key-differences-selection-guide/">Kvaser Mini PCIe通讯卡：主要区别和选型指南</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>关于CanKing 7 GUI扩展：创建与使用指南</title>
		<link>https://www.kvaser.cn/developer-blog/introducing-canking-7-gui-extensions/</link>
		
		<dc:creator><![CDATA[Mattias Busck]]></dc:creator>
		<pubDate>Thu, 27 Mar 2025 15:56:48 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1045377</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/introducing-canking-7-gui-extensions/">关于CanKing 7 GUI扩展：创建与使用指南</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>什么是CanKing 7 GUI扩展？</h3>
<p>CanKing 7 GUI扩展是 Kvaser CanKing中的图形视图。这些视图允许任何人使用其基于Web的组件扩展用户界面。用户可以通过创建按钮来发送报文，也可以通过创建各种网格和仪表来显示从CAN总线接收到的信息。</p>
<h3>如何创建扩展</h3>
<p>在CanKing中开发图形用户界面（GUI）扩展所使用的技术是React。<a href="https://react.dev/learn" target="_blank" rel="noreferrer noopener">React</a>是用于构建用户界面的JavaScript库。通过使用网络技术，CanKing可以确保速度和安全性，而基于网络的应用程序（包括游戏）都有这两个要求。</p>
<h1>CanKing API和React</h1>
<h3>文档</h3>
<p>CanKing GUI扩展API定义了Kvaser特定组件。扩展程序可以使用这些组件发送和接收CAN报文，并实现与CanKing UI和服务的交互。</p>
<p>其他定义和概念（如<a href="https://react.dev/reference/react/hooks" rel="noreferrer noopener">钩子</a>）来自React本身。对于学习React，<a href="https://react.dev/learn" rel="noreferrer noopener">https://react.dev/learn</a>是一个很好的起点。</p>
<p>在阅读API文档和实施扩展时，了解这些概念非常重要。 </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu.webp" class="vc_single_image-img  attachment-full" alt="" title="image-04-canking-help-menu" srcset="https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu.webp 560w, https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu-300x188.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu-100x63.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu-324x203.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/04/image-04-canking-help-menu-416x261.webp 416w" sizes="(max-width: 560px) 100vw, 560px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>打开Web浏览器窗口后，您可以在其中浏览API。 </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help.webp" class="vc_single_image-img  attachment-full" alt="" title="image-05-canking-gui-installed-help" srcset="https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help.webp 828w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help-300x273.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help-768x699.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help-100x91.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help-324x295.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-05-canking-gui-installed-help-416x379.webp 416w" sizes="(max-width: 828px) 100vw, 828px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>可用模块</h3>
<p>API被划分为不同的模块。目前，这些模块包括控件、钩子、图标、IPC和模型。</p>
<h4>控件</h4>
<p>这些是作为React组件实现的UI控制组件的函数、类型和接口。例如<code>CanIdentifierControl</code>，它创建了一个用于编辑CAN标识符的UI控件。</p>
<h4>钩子</h4>
<p>该模块定义了<a href="https://react.dev/reference/react/hooks" rel="noreferrer noopener">React钩子</a>。这些都是以“use”开头的函数（请参阅下文建议），可以在事件发生时为组件提供回调，也可以提供用于更新数据的函数。</p>
<p><code>useProjectData</code>是一个重要的钩子 ，它允许扩展程序在CanKing项目（*.ckproj）文件中存储和加载其设置。</p>
<p>另一个钩子是<code>useNewMeasurementData</code>，它可以将CAN报文传递到扩展组件中，如跟踪窗口或可视仪表。</p>
<h4>图标</h4>
<p>该模块包含可用于CanKing UI的图标。</p>
<h4>IPC</h4>
<p>该模块实现了与CanKing服务交互的进程间通信（IPC）。例如： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">- sendCanMessage(  
        channelId: string,  
        canId: number,  
        data: number[],  
        ...flags: [CanFrameFlag](../enums/models.CanFrameFlag.html)[],  
    ): Promise&lt;void&gt;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>另一个函数是<code>updateSource</code>，它允许扩展程序更新CAN通道的属性，如总线参数。请注意，需要使用钩子<code>useMeasurementSetup</code>来更新当前的总线参数。</p>
<h4>模型</h4>
<p>模型模块包含类型、类、接口、枚举等。其中一个典型的例子就是<code>useNewMeasurementData</code>中的框架。</p>
<h1>创建扩展</h1>
<h3>安装工具</h3>
<p>为了开始使用，您需要CanKing 7和驱动程序。您还需要NodeJS和编辑器。<a href="https://www.npmjs.com/package/@kvaser/canking-api" rel="noreferrer noopener">Kvaser CanKing GUI Extensions SDK</a>中的说明解释了细节。简而言之，您需要：</p>
<ol>
<li><a href="https://resources.kvaser.com/7330130980013/latest/kvaser_drivers_setup.exe">Kvaser驱动程序</a></li>
<li><a href="https://kvaser.com/canking">CanKing 7</a></li>
<li><a href="https://nodejs.org/">NodeJS</a></li>
<li><a href="https://code.visualstudio.com/">Visual Studio代码</a></li>
</ol>
<h3>使用Npm创建新扩展</h3>
<ul>
<li>确保已安装NojeJS并将其放在命令行的PATH中。</li>
<li>使用npm命令行创建扩展：<code>npm create @kvaser/canking-extension@latest</code></li>
</ul>
<p>（按回车键进行默认选择） </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">C:\Users\mabu\OneDrive - Kvaser AB\proj\CanKing-7-GUI-Extension-Guide&gt;npm create @kvaser/canking-extension@latest

&gt; npx
&gt; create-extension

&radic; Project name: ... my-ck-extension
&radic; Package name: ... my-ck-extension
&radic; Display name: ... MyCkExtension
&radic; Package description: ... A CanKing GUI extension
&radic; Package author: ... Kvaser FAE

Creating a new CanKing extension in C:\Users\mabu\OneDrive - Kvaser AB\proj\CanKing-7-GUI-Extension-Guide\my-ck-extensi
on.


A project for extension my-ck-extension has been created successfully.
</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><code>npm</code>现在已经创建了一个名为<code>my-ck-extension</code>（选定的项目名称）的目录结构。我们进入该目录。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">cd my-ck-extension</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>使用版本控件</h3>
<p>在该目录中，已经创建了许多文件。为了跟踪更改，让我们使用git将它们添加到源代码控件中。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">git init
git add .
git commit -m &quot;Create CanKing7 extension from template&quot;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>安装依赖项</h3>
<p>由于我们的扩展使用了NodeJS，因此需要安装扩展使用的软件包。在my-ck-extension目录中，使用： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">npm install</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>这将在名为<code>node_modules</code>的新目录中安装所有必要的软件包。</p>
<h1>运行扩展</h1>
<h3>加载代码</h3>
<p>从扩展文件夹中使用shell命令启动VS Code： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">  code .</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>启动/调试扩展</h3>
<ul>
<li>如果已经安装了扩展，可以从Visual Studio Code开始调试：</li>
</ul>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code.webp" class="vc_single_image-img  attachment-full" alt="" title="image-02-debug-in-vs-code" srcset="https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code.webp 531w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code-300x147.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code-100x49.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code-324x159.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-02-debug-in-vs-code-416x204.webp 416w" sizes="(max-width: 531px) 100vw, 531px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<ul>
<li>也可以使用终端：</li>
</ul>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">npm run start</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>在CanKing中添加扩展</h3>
<p>稍等片刻后，CanKing 7将启动，新扩展将出现在工作区的“选择视图”菜单中： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension.webp" class="vc_single_image-img  attachment-full" alt="" title="image-01-select-view-my-ck-extension" srcset="https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension.webp 1035w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-300x228.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-1024x778.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-768x583.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-100x76.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-324x246.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-01-select-view-my-ck-extension-416x316.webp 416w" sizes="(max-width: 1035px) 100vw, 1035px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在工作区中，会出现一个显示扩展的新视图： </p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace.webp" class="vc_single_image-img  attachment-full" alt="" title="image-03-canking-new-extension-in-workspace" srcset="https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace.webp 1035w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-300x228.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-1024x778.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-768x583.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-100x76.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-324x246.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/03/image-03-canking-new-extension-in-workspace-416x316.webp 416w" sizes="(max-width: 1035px) 100vw, 1035px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h1>检查源</h1>
<h3>React</h3>
<p>CanKing 7使用<a href="https://www.typescriptlang.org/">TypeScript</a>，这是<a href="https://en.wikipedia.org/wiki/JavaScript">Javascript</a>的静态类型超集，增加了类型定义。</p>
<p>请注意，由于React教程可以使用JavaScript或TypeScript，因此请确保使用需要说明变量类型的TypeScript版本。</p>
<ul>
<li><a href="https://react.dev/learn">https://react.dev/learn</a></li>
<li><a href="https://react.dev/learn/typescript">https://react.dev/learn/typescript</a></li>
</ul>
<h3>Javascript、Typescript和XML</h3>
<p>为了查看扩展，我们将开始检查文件<code>src / WorkspaceView / index.tsx</code></p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">my-ck-extension
└───src
    └───WorkspaceView
        └───index.tsx</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>这个文件的扩展名是<code>“.tsx”</code>，我们由此得出：</p>
<ul>
<li>t表示这是<a class="Hyperlink SCXW159057751 BCX4" href="https://www.typescriptlang.org/" target="_blank" rel="noreferrer noopener">TypeScript</a>，<a class="Hyperlink SCXW159057751 BCX4" href="https://en.wikipedia.org/wiki/JavaScript" target="_blank" rel="noreferrer noopener">Javascript</a>的静态类型超集，增加了类型定义。</li>
<li>x表示这是JavaScript的类似XML的语法扩展。</li>
</ul>
<p>有了类型定义，就能及早防止错误，并允许代码编辑器查找数据结构。例如，<code>接口IProjectData</code>定义了我们扩展中的哪些数据会保存在CanKing 7项目文件中。我们在此说明，参数<code>channelId</code>必须是<code>字符串</code>类型。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">// If any data should be stored in the project file then add it to this interface
interface IProjectData {
  // This is an example showing how to store the selected channel id to the project file
  channelId: string;
}</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>WorkspaceView函数</h3>
<p>我们的<code>Index.tsx</code>通过定义名为<code>WorkspaceView</code>的函数实现了CanKing 7的扩展。该函数首先以标准方式定义变量：</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">function WorkspaceView() {
  // Get this view&#039;s unique id from search params
  const [searchParams] = useSearchParams();
  const idString = searchParams.get(&#039;id&#039;);</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在函数结束时，我们返回定义React组件的数据结构。通过语法扩展，我们可以直接编写XML结构。</p>
<p>大括号（如<code>{icon}</code>中的大括号）允许我们在其中嵌入使用变量的表达式。我们正在使用文件顶部的图标：</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">import icon from &#039;../assets/icon.png&#039;;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>我们可以看到，扩展包含一个位于顶层的方框组件：</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">    return (
        &lt;Box aria-label=&quot;canking-extension-view&quot; margin={1}&gt;
            &lt;h3&gt;Add your elements here!&lt;/h3&gt;
            &lt;div&gt;This is an example how to embed an image:&lt;/div&gt;
            &lt;img src={icon} height={50} /&gt;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h3>发送CAN报文</h3>
<p>要发送消息，首先需要导入一个按钮。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">import { Box, Button } from &#039;@mui/material&#039;;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>然后将其添加到<code>WorkspaceView</code>函数中，并将其<code>onClick</code><a href="https://react.dev/learn/typescript#typescript-with-react-components" target="_blank" rel="nofollow noopener">prop</a>设置为<code>onSendCanMessage</code>。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">&lt;Button onClick={onSendCanMessage}&gt; Send CAN Message &lt;/Button&gt;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>回调函数<code>onSendCanMessage</code>是通过React钩子<a href="https://react.dev/reference/react/useCallback" target="_blank" rel="nofollow noopener">useCallback</a>创建的。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">// A callback that will send out a CAN message on the selected channel with the specified CAN id
  const onSendCanMessage = useCallback(() =&gt; {
    if (projectData.channelId !== &#039;&#039;) {
      const flags =
        sessionData.canIdType === &#039;extended&#039; ? CanFrameFlag.CAN_FRAME_FLAG_EXT : CanFrameFlag.CAN_FRAME_FLAG_STD;
      sendCanMessage(projectData.channelId, sessionData.canId, [0x55], flags);
    }
  }, [projectData.channelId, sessionData.canId, sessionData.canIdType]);</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>原因在于，<code>sendCanMessage</code>需要访问<code>channelId</code>（字符串），以便通知CanKing 7服务在哪个通道上发送。建议将该字符串存储在projectData中。扩展中的所有组件都可以使用这个字符串，因为它是在顶层定义的。它也与.ckproj文件一起保存和加载。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">// Use the useProjectData hook to serialize/deserialize your view data to the project
const { projectData, setProjectData } = useProjectData&lt;IProjectData&gt;(id, defaultProjectData);</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>要设置channelId，可以添加<code>CanChannelSelectControl</code>。其也由CanKing 7 SDK提供。为使其正常工作，该组件需要：</p>
<ol>
<li>在创建时知道要显示哪个选项。</li>
<li>根据选项的变化采取行动，并将选项存储在自身之外。</li>
</ol>
<p>为此，SDK定义了接口<code>CanChannelSelectControlProps</code>，允许将配置参数传递给控件。</p>
<p>（根据React惯例，接口的名称是组件名称 + <em>Props</em>）。</p>
<p>除其他参数外，<code>onChannelIdentifierChange</code>属性还接受用户选择CAN通道时将调用的回调函数。它还可以通过<code>channelIdentifier</code>获取初始值。</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">&lt;CanChannelSelectControl
    channelIdentifier={projectData.channelId}
    onChannelIdentifierChange={onChannelIdentifierChange}
    hideSectionControl
  /&gt;</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><code>onChannelIdentifierChange</code>回调函数定义如下：</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">  // A callback that will get the new selected channel id and save it to the project data
  const onChannelIdentifierChange = useCallback(
    (channelId: string) =&gt; {
      const data = { ...projectData };
      data.channelId = channelId;
      setProjectData(data);
    },
    [projectData, setProjectData],
  );</code></pre></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>至此，对新扩展特性的初步检查就结束了。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/introducing-canking-7-gui-extensions/">关于CanKing 7 GUI扩展：创建与使用指南</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>无线CAN设备怎么选？Kvaser BlackBird v2和Air Bridge Light HS详细对比来了！</title>
		<link>https://www.kvaser.cn/developer-blog/kvaser-blackbird-v2-vs-kvaser-air-bridge-light-hs/</link>
		
		<dc:creator><![CDATA[Adam Raymer]]></dc:creator>
		<pubDate>Tue, 07 Jan 2025 10:27:32 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1044897</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-blackbird-v2-vs-kvaser-air-bridge-light-hs/">无线CAN设备怎么选？Kvaser BlackBird v2和Air Bridge Light HS详细对比来了！</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths.webp" class="vc_single_image-img  attachment-full" alt="" title="BlackBird-v2-vs-airbridgelighths" srcset="https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths.webp 1887w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-300x159.webp 300w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-1024x543.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-768x407.webp 768w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-100x53.webp 100w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-1536x814.webp 1536w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-324x172.webp 324w, https://www.kvaser.cn/wp-content/uploads/2025/02/BlackBird-v2-vs-airbridgelighths-416x220.webp 416w" sizes="(max-width: 1887px) 100vw, 1887px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>您应该选择哪款产品？</h4>
<p>在一些情况下，比如实验室内或是户外现场作业，您可能需要一边移动一边保持与CAN总线的连接。有时，目标总线可能距离较远，以至于延长CAN总线至您所在位置会干扰总线性能，或者该距离超出了当前CAN比特率所支持的范围。在这些情况下，直接将CAN总线电缆拉到电脑旁边显然有些不切实际。例如，当操作起重机时，需要在吊臂末端监控CAN总线时，有线系统会显得非常不便；又或者，当需要在移动环境中，如行驶的车辆内监控CAN总线时，有线系统根本无法使用。面对这些挑战，究竟有哪些可行的选择呢？</p>
<p>在Kvaser设备目录中，您有两种选择：Kvaser BlackBird v2和Kvaser Air Bridge Light HS。这两种设备都能实现自由移动并提供更长的连接距离，但两款产品存在许多差异。</p>
<p>接下来让我们分别了解两款产品：</p>
<p><strong>Kvaser BlackBird v2 (BlackBird)</strong></p>
<p>Kvaser BlackBird系列是一款WiFi CAN通讯仪。<a href="https://www.kvaser.cn/product/kvaser-blackbird-v2/">Kvaser BlackBird v2</a> 可连接到您的内联网，和联网打印机一样，成为一个联网设备。Kvaser BlackBird的范围仅限于WiFi网络和最近的WiFi路由器。</p>
<p>BlackBird和Leaf v3一样，本身就是一款通讯仪。它提供适用于Windows系统和Linux系统的驱动程序。在Windows系统中，您可以利用远程设备配置工具将BlackBird配置到您的WiFi网络。配置完成后，就可以通过网络设备选择器选择使用BlackBird。这样做的目的是将PC连接到BlackBird，并锁定该设备，使其仅供PC使用（防止从同一通讯仪发送冲突消息的问题）。此时，BlackBird可以像其他Kvaser通讯仪一样供PC使用。您只需要将一个Kvaser BlackBird连接到CAN总线即可进行通信，另一端不需要另一个通讯仪连接到PC。</p>
<p>在Linux系统中，还需执行一些额外步骤。目前，Linux驱动程序和API文件正处于Beta测试阶段，可按需分发。除了驱动程序，我们还提供了相应教程，以便协助您完成设备设置。需要注意，目前还没有与Linux系统相匹配的远程设备配置工具和网络设备选择器。因此，您需要更新mhydrard.conf文件并重启远程服务。有关具体操作步骤，请参考BlackBird的Linux驱动程序指南。</p>
<p>以下是mhydrad.conf文件的示例及其填写方式：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-t">#
# Lines starting with the hash (#) character are comments.
# The configuration consists of a list of device configurations, separated by
# lines starting with a hyphen (-) character.
# Each device configuration consists of a number of key-value pairs, with a
# colon (:) between the key and the value, and with one pair per line.
# The valid keys are:
# &#039;eanhi&#039; and &#039;eanlo&#039; - the EAN of the device
# &#039;serial&#039; - the serial number of the device
# &#039;hostname&#039; - the host name of the device
# &#039;ipv4&#039; - the IP(v4) address of the device
# &#039;port&#039; - the IP port used on the device
# &#039;name&#039; - the name of the device
# &#039;connected&#039; - a flag telling whether the device should be connected
# or not
#
# The keys &#039;eanhi&#039;, &#039;eanlo&#039;, and &#039;serial&#039; are mandatory.
# One of &#039;hostname&#039; and &#039;ipv4&#039; must be specified.
# &#039;port&#039; is optional, and defaults to 11416, if not specified.
# &#039;connected&#039; is optional, and defaults to 0 (not connected) if not specified.
# &#039;name&#039; is optional.
#
# The lines below, if uncommented, would be a valid configuration for two
# devices:
#
# serial: 420
# eanhi: 0x00073301
# eanlo: 0x30006713
# connected: 1
# hostname: &quot;kv-06713-000420&quot;
# name: &quot;Unnamed Interface #420&quot;
# port: 11416
# -
# serial: 421
# eanhi: 0x00073301
# eanlo: 0x30006713
# connected: 1
# name: &quot;Unnamed Interface #421&quot;
# ipv4: 10.10.0.109
# port: 11416</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在Linux系统中连接BlackBird的另一种方法是使用REST API。目前不支持SocketCAN。</p>
<p>Kvaser BlackBird每秒可发送15,000条报文，比特率范围在40-1000 kbps之间，支持静默模式。Kvaser BlackBird使用WiFi标准802.11 b/g/n和2.4 GHz带宽与WiFi网络进行通信。但是，它不支持CAN FD。</p>
<p><strong>Kvaser Air Bridge Light HS: (Air Bridge Light HS)</strong></p>
<p><a href="https://www.kvaser.cn/product/kvaser-air-bridge-light-hs/">Kvaser Air Bridge Light HS</a>是一款点对点2.4 GHz射频CAN网桥。通过射频信号，Air Bridge Light HS无需电缆即可实现CAN网络两个部分的远距离通信。该网桥套装随附两个已预配对的设备，这意味着您无需对两台设备进行额外配置即可让它们相互通信。此外，Air Bridge Light HS还具有自动波特率调整功能，因此无需配置比特率。Kvaser Air Bridge Light HS的工作频段为2.4 GHz ISM，预计通信距离可达70米（实际距离受安装条件和环境因素影响）。两款设备均配备了全向天线。</p>
<p>Kvaser Air Bridge Light HS确实存在一些局限性。作为一款桥接器，使用Kvaser Air Bridge时，您仍然需要一个通讯仪来读取CAN数据。一般情况下，操作方式如下：将一个Air Bridge Light HS设备接入CAN总线，此时该设备依靠CAN总线供电；而另一个设备则插入CAN通讯仪的供电连接器（此连接器可由CAN通讯仪本身或其他电源注入器供电），再与PC相连。这样，便能在CAN总线和PC之间建立起射频连接。</p>
<p>与Kvaser BlackBird v2一样，Kvaser Air Bridge Light HS也存在一些局限性。它不支持CAN FD，且每秒只能双向传输约1200条报文。另外，Air Bridge Light HS也不会缓存待发送的消息，这意味着如果连接断开，这些消息就会丢失。不过，它会尝试自动重新建立连接。</p>
<p>何时以及如何使用Kvaser Air Bridge Light HS或Kvaser BlackBird v2？</p>
<p>两者都是一种“无线”设备。当遇到需要移动CAN总线、有线电缆使用不便、无法铺设电缆，或者PC与CAN总线之间的距离不固定且频繁变动等情况时，选择Kvaser Air Bridge Light HS或Kvaser BlackBird会是非常明智的决定。</p>
<p>若您需要在存在障碍的情况下访问CAN总线，那么Kvaser BlackBird v2会是更好的选择。因为BlackBird使用本地以太网，因此它可以通过内联网发送消息，可穿越墙壁甚至建筑物。只要您身处路由器的信号覆盖范围内，就能保持灵活移动。</p>
<p>如果没有WiFi网络，或者您只需要在两个CAN网络之间建立连接，那么Kvaser Air Bridge Light HS是更好的选择。其优势在于无需任何设置。另外，如果您无需直接与CAN总线相连，而只是希望扩展CAN总线，让不同节点能在更远的距离上顺畅通信，那么Air Bridge Light HS无疑是一个更佳的方案。</p>
<p><strong>总结：</strong></p>

		</div>
	</div>
<div class="vc_row wpb_row vc_inner vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>Kvaser BlackBird v2:</p>
<ul>
<li>CAN通讯仪</li>
<li>CAN总线与PC之间的WiFi连接。</li>
<li>需要通过Kvaser设备指南进行网络配置和连接，才能访问设备。</li>
<li>在LinuxCAN或SocketCAN中，无法与WiFi一起使用。</li>
<li>可与REST API配合使用，但REST API运行速度较慢。</li>
</ul>

		</div>
	</div>
</div></div></div><div class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>Kvaser Air Bridge Light HS:</p>
<ul>
<li>用于连接两个CAN总线段的CAN网桥</li>
<li>无需配置，可自动波特率匹配比特率</li>
<li>支持全向射频连接</li>
<li>由于Air Bridge Light HS不是可连接到PC的通讯仪，因此无需驱动程序。</li>
</ul>

		</div>
	</div>
</div></div></div></div></div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-blackbird-v2-vs-kvaser-air-bridge-light-hs/">无线CAN设备怎么选？Kvaser BlackBird v2和Air Bridge Light HS详细对比来了！</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>如何使用Memorator Pro的触发器功能分割日志文件以便于提取数据</title>
		<link>https://www.kvaser.cn/developer-blog/how-to-split-log-files-using-the-trigger-function-of-a-memorator-pro-to-facilitate-data-extraction/</link>
		
		<dc:creator><![CDATA[Adam Raymer]]></dc:creator>
		<pubDate>Fri, 15 Nov 2024 09:54:51 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1044338</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/how-to-split-log-files-using-the-trigger-function-of-a-memorator-pro-to-facilitate-data-extraction/">如何使用Memorator Pro的触发器功能分割日志文件以便于提取数据</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>当你需要记录大量数据时，一次性全部提取这些数据是一项繁重的任务。根据数据量的大小，一台PC可能需要花很长时间来处理所有的记录。那么，有没有办法使用Kvaser Memorator按时间分割日志，保持日志的顺序，并允许你提取某一记录时限内的数据呢？答案是：有！</p>
<p>通常你需要等待提取过程结束后再将日志分割成单独的文件。有时停止记录并重新开始在SD卡上创建新条目可能更方便。本文将讨论如何实现它。</p>
<p>我们将在Memorator Pro上使用触发器。基本触发器可在<a href="https://kvaser.cn/product/kvaser-memorator-2xhs-v2/">Kvaser Memorator 2xHS v2</a> 、<a href="https://www.kvaser.cn/product/kvaser-memorator-pro-2xhs-v2/">Kvaser Memorator Pro 2xHS v2</a> 和<a href="https://www.kvaser.cn/product/kvaser-memorator-pro-5xhs/">Kvaser Memorator Pro 5xHS</a> 上使用和访问。在本例中，我们会将日志按每两分钟的记录间隔进行分割。</p>
<p>第一步，从Windows开始菜单中打开Kvaser Memorator配置工具，然后选择你使用的Memorator。连接你的Memorator。必要时将Memorator时钟与系统同步，并进行磁盘维护（例如初始化或格式化）。</p>
<p>前往Kvaser Memorator配置工具左侧，在日志配置项下即可使用触发器。你可能需要取消勾选“Log Everything – the triggers are disregarded but the filters are still used”。如果勾选了该复选框，你创建的所有触发器都无法使用。该复选框默认勾选。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture1devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog.webp 1872w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-324x235.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-416x302.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-300x218.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-1024x743.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-768x557.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-100x73.webp 100w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture1devblog-1536x1114.webp 1536w" sizes="(max-width: 1872px) 100vw, 1872px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>取消勾选“Log everything – the triggers are disregarded but the filters are still used”后，前往触发器。我们将在此创建两个触发器：一个在两分钟后停止记录，另一个重新开始记录。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture2devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog.webp 1872w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-324x238.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-416x305.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-300x220.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-1024x752.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-768x564.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-100x73.webp 100w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture2devblog-1536x1127.webp 1536w" sizes="(max-width: 1872px) 100vw, 1872px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在“Triggers”目录中，单击“Add”以创建一个新触发器。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture3devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog.webp 886w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog-324x268.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog-416x344.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog-300x248.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog-768x635.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture3devblog-100x83.webp 100w" sizes="(max-width: 886px) 100vw, 886px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>你可以给触发器贴上任何你喜欢的标签。在本例中，“PowerOn”就很合适。然后，你可以选择默认的通道。</p>
<p>最后，协议可以设置为“None”（原始CAN数据）或“J1939”（J1939格式）。</p>
<p>在下一屏中，我们需要选择/define what the trigger reacts on。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture4devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog.webp 883w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog-324x270.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog-416x347.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog-300x250.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog-768x640.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/12/Picture4devblog-100x83.webp 100w" sizes="(max-width: 883px) 100vw, 883px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>对于PowerOn触发器，我们希望在出现特殊事件时触发，即在Memorator接通电源时启动。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture5devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog.webp 856w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog-324x220.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog-416x282.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog-300x203.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog-768x520.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture5devblog-100x68.webp 100w" sizes="(max-width: 856px) 100vw, 856px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在特殊事件用例中，我们希望<a href="https://www.kvaser.cn/product/kvaser-memorator-pro-5xhs/">Kvaser Memorator Pro 5xHS</a> 启动。选择“Start Up”后，单击“OK”，然后单击“Next”。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture6devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog.webp 883w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog-324x270.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog-416x346.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog-300x250.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog-768x639.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture6devblog-100x83.webp 100w" sizes="(max-width: 883px) 100vw, 883px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在最后一个屏幕中，检查触发器，如果满意，单击“Finish”。现在该创建第二个触发器了。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture7devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog.webp 938w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog-324x265.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog-416x340.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog-300x245.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog-768x628.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture7devblog-100x82.webp 100w" sizes="(max-width: 938px) 100vw, 938px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>创建第二个触发器的过程以同样的方式开始。创建触发器名称、读取触发器信息的通道，以及协议。在本例中，我们可以使用“Periodic”这一名称，因为它将创建一个两分钟的计时器。准备就绪后，单击“Next”。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture8devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog.webp 1803w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-324x264.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-416x339.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-300x245.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-1024x835.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-768x626.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-100x82.webp 100w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture8devblog-1536x1252.webp 1536w" sizes="(max-width: 1803px) 100vw, 1803px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>下一步你需要创建一个Timer Event触发器。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture9devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog.webp 857w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog-324x220.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog-416x283.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog-300x204.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog-768x522.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture9devblog-100x68.webp 100w" sizes="(max-width: 857px) 100vw, 857px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>你希望Periodic触发器计数120秒，并在完成后重新开始。将秒数设为120，然后勾选“Activate the timer cyclic”复选框，这样计时器就会重新开始。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture10devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog.webp 892w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog-324x266.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog-416x342.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog-300x247.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog-768x631.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture10devblog-100x82.webp 100w" sizes="(max-width: 892px) 100vw, 892px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在“Set trigger timeout”屏幕中，我们希望触发器运行但不保持激活状态。我们希望计时器启动一次，完成后立即停止，以便再次触发。单击“Next”继续。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture11devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog.webp 880w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog-324x268.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog-416x345.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog-300x249.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog-768x636.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture11devblog-100x83.webp 100w" sizes="(max-width: 880px) 100vw, 880px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>单击“Finish”以完成触发器。现在我们有了两个触发器，分别是PowerOn和Periodic。这两个触发器一起工作，记录120秒（两分钟），停止记录，然后再次开始记录。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture12devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog.webp 1964w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-324x189.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-416x243.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-300x175.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-1024x598.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-768x449.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-100x58.webp 100w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture12devblog-1536x897.webp 1536w" sizes="(max-width: 1964px) 100vw, 1964px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>要使两个触发器协同工作，需要创建一个表达式来解释触发器之间的关系。在“1st Expression”字段中，键入(PowerOn|Periodic)。动作将是StartLogging。触发后，Post触发器将告诉触发器在119000毫秒（119秒）后停止。Post触发器的时间需要比Timer Event触发器（在本例中为名为“Periodic”的触发器）的时间稍微短一些。</p>
<p>连接电源后，Memorator将启动。PowerOn将触发，Periodic触发器的计时器将开始倒计时。由于PowerOn触发，设备将开始记录数据。记录119秒后，Post触发器时间将导致记录停止。一秒后，Periodic触发器计时器开始倒计时，触发为真，设备将再次开始记录。Post触发器时间和Periodic触发器将继续循环停止和开始记录的过程。</p>
<p>停止记录并重新开始记录的操作会在日志文件下的日志列表中创建新的日志文件。<br />
如果需要不同的时间间隔怎么办？你可以随时更改Timer Event触发器时间和Post触发器时间。请记住，Timer Event的单位是秒，而Post触发器的单位是毫秒。如果你想要一小时长的间隔，Timer Event的触发时间应为3600秒，Post触发器时间应为3,599,000秒（比Timer Event少一秒）。</p>
<p>现在所有设置都已完成，你可以将配置下载到Memorator。</p>
<p>现在，当Memorator进行日志记录时，它会记录两分钟，然后停止记录，创建新的日志条目，并再次开始记录。提取数据时，你会看到多个日志文件，每个文件长五分钟。这样，你就可以选择某个时间段来提取日志，而不是从会话中提取整个日志，再将日志分割成若干段。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog.webp" class="vc_single_image-img  attachment-full" alt="" title="Picture13devblog" srcset="https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog.webp 936w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog-324x235.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog-416x301.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog-300x217.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog-768x556.webp 768w, https://www.kvaser.cn/wp-content/uploads/2024/11/Picture13devblog-100x72.webp 100w" sizes="(max-width: 936px) 100vw, 936px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>这种方法的缺点是，日志停止和重新启动时会有大约1秒钟的延迟。在此期间，数据会因设备未记录而丢失。如果你确实有大量数据需要记录，并且正在寻找一种更简单的提取方法，这仍然是一个不错的选择。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/how-to-split-log-files-using-the-trigger-function-of-a-memorator-pro-to-facilitate-data-extraction/">如何使用Memorator Pro的触发器功能分割日志文件以便于提取数据</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>轻松移植应用程序！一文讲清如何将Kvaser NuGet软件包安装到Visual Studio并进行相关设置</title>
		<link>https://www.kvaser.cn/developer-blog/kvaser-nuget-packages-and-visual-studio/</link>
		
		<dc:creator><![CDATA[Troy]]></dc:creator>
		<pubDate>Thu, 19 Sep 2024 09:29:06 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1043744</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-nuget-packages-and-visual-studio/">轻松移植应用程序！一文讲清如何将Kvaser NuGet软件包安装到Visual Studio并进行相关设置</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element vc_custom_1730108217336" >
		<div class="wpb_wrapper">
			<p><em>我们.NET封装器的一项新功能极大程度简化了应用程序在不同操作系统之间的移植工作。通过链接到</em><em>Visual Studio</em><em>中的资源库，当您创建新项目时，</em><em>NuGet</em><em>会自动抓取库的正确版本。这确实极大地提升了开发体验，并且任何使用</em><em>VB .NET</em><em>或</em><em>C#</em><em>的人都可以利用这一功能。本指南将引导您在</em><em>Visual Studio</em><em>中完成进行相关设置过程。</em></p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>从CANlib SDK安装包的5.45.724版本开始，.NET封装器得到了更新，使用起来更加方便。改进之处包括：</p>
<ul>
<li>已消除架构依赖性。所有封装器组件均面向所有类型的CPU设计</li>
<li>所有封装器均重新设计以支持.NET Standard 2.0和.NET 6.0</li>
<li>当为.NET Framework 4.6.1及更高版本、.NET Core 2.0及更高版本和 .NET 5.0及更高版本进行开发时，.Net Standard 2.0封装器仅适用于Windows。</li>
<li>为.NET 6.0及更高版本开发时，.Net Standard 6.0封装器可用于Windows和Linux。对于新开发项目，它们是首选。</li>
<li>所有封装器中都添加了NuGet软件包。NuGet软件包同时包含用于.NET Standard 2.0和.NET 6.0的组件。NuGet软件包会基于您的项目设置自动选择正确的组件。</li>
</ul>
<p>本文将重点介绍如何使用最后一项改进功能，说明如何将Kvaser NuGet软件包安装到Visual Studio中，以及如何将Kvaser NuGet软件包添加到项目中。</p>
<p>我将使用Visual Studio 2022进行演示。</p>
<h3>如何将Kvaser NuGet软件包添加到Visual Studio</h3>
<p>启动Visual Studio 2022并选择“继续”。（不需要编写代码）</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture1-1.webp" alt="" /><br />
在菜单中，选择“工具” -&gt; “NuGet软件包管理器设置”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture2.webp" alt="" /><br />
在“选项”对话中，选择“NuGet软件包管理器”下的“包源”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture3.webp" alt="" /><br />
如果您看到的是一个纯白色窗格，而不是下面的屏幕所示的设置，请选择“总览”，然后再次选择“包源”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture4.webp" alt="" /><br />
设置正确显示后，点击绿色加号符号添加软件包。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture5.webp" alt="" /><br />
然后输入一个适当的名称，如Kvaser软件包，并使用“&#8230;”键浏览CANlib SDK dotnet文件的安装目录C:\Program Files (x86)\Kvaser\CANlib\dotnet\。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture6.webp" alt="" /><br />
然后按“选择”以选择该目录。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture7.webp" alt="" /><br />
按“更新”将Kvaser软件包信息加载到包源。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture8.webp" alt="" /><br />
按“OK”保存您的更改并退出对话。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture9.webp" alt="" /><br />
Kvaser软件包现已添加到Visual Studio的NuGet软件包管理器中，现在即可将软件包添加到您的项目中。</p>
<h3>如何将Kvaser NuGet软件包添加到您的项目</h3>
<p>出于演示目的，我将创建一个新的Visual Basic控制台应用。我本可以选择C#、C++或F#控制台应用。这些步骤同样适用于Windows Form、WPF、类库和DLL应用。</p>
<p>如需创建一个新项目，在菜单中选择“文件” -&gt; “新建” -&gt; “项目…”</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture10.webp" alt="" /><br />
我已经将我的项目模板筛选为仅Visual Basic模板。点击项目模板列表中的VB控制台应用，然后点击“下一步”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture11.webp" alt="" /><br />
按需要设置项目名称、位置和解决方案名称，然后点击“下一步”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture12.webp" alt="" /><br />
从下拉列表中选择您所需的Framework版本。本例中选择.NET，然后单击“创建”按钮。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture13.webp" alt="" /><br />
在解决方案管理器中右击项目，然后从弹出菜单中选择“管理NuGet软件包&#8230;”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture14.webp" alt="" /><br />
点击“包源”下拉列表并选择“Kvaser软件包”。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture15.webp" alt="" /><br />
点击“浏览”键查看您可以安装哪个Kvaser软件包。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture16.webp" alt="" /><br />
选择一个您想要使用的软件包，右窗中将包含该软件包的相关信息。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture17.webp" alt="" /><br />
点击“安装”键，将软件包添加到项目。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture18.webp" alt="" /><br />
这里系统会警告您：Visual Studio将改动解决方案。点击“应用”键即可。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture19.webp" alt="" /></p>
<p>NuGet软件包管理器现在显示软件包已安装。已安装的软件包现在列为了解决方案管理器中的一个依赖项。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture20.webp" alt="" /><br />
对于项目中需要的每个Kvaser软件包，重复这些步骤即可（选择一个软件包并点击安装）。然后关闭NuGet软件包管理器。</p>
<p>现在您就可以在您使用安装的Kvaser软件包的代码中添加新行了。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture21.webp" alt="" /><br />
当您已安装Kvaser驱动程序时，不会遇到任何build或运行时间错误。</p>
<p><img decoding="async" class="alignnone size-full wp-image-1043722" src="/wp-content/uploads/2024/10/Picture22.webp" alt="" /></p>
<p>我们希望这个教程能帮助您更便捷地将我们的库整合到您的软件中。如果您有任何问题或建议，请通过<strong><u><a href="mailto:support.cn@kvaser.com">support.cn@kvaser.com</a></u></strong> 联系Kvaser支持。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/kvaser-nuget-packages-and-visual-studio/">轻松移植应用程序！一文讲清如何将Kvaser NuGet软件包安装到Visual Studio并进行相关设置</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>只需一个简单脚本，具备编程功能的Kvaser设备秒变高效网关</title>
		<link>https://www.kvaser.cn/developer-blog/a-simple-script-that-turns-a-programmable-kvaser-device-into-a-gateway/</link>
		
		<dc:creator><![CDATA[Adam Raymer]]></dc:creator>
		<pubDate>Tue, 21 May 2024 06:57:18 +0000</pubDate>
				<guid isPermaLink="false">https://staging.kvaser.cn/?post_type=developer_blog&#038;p=1034178</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/a-simple-script-that-turns-a-programmable-kvaser-device-into-a-gateway/">只需一个简单脚本，具备编程功能的Kvaser设备秒变高效网关</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在某些情况下，您可能需要合并两条CAN总线，或者在使用不同比特率和/或协议的两条总线之间进行数据传输。您可以选择购买网关来完成这项任务。或者，您也可以使用自己的多通道Kvaser设备和<strong><u><em><a href="https://www.kvaser.com/t-programming/">t脚本</a></em></u></strong>来创建自己的网关。在本文中，我们将简要介绍<em>t</em>脚本，以及如何通过编写少量代码来建立自己的网关。</p>
<p><strong>什么是<em>t</em>脚本？</strong><br />
我们的<em>t</em><em>脚本</em>语言与C语言类似，它允许用户使用“hooks”对总线上的某些事件做出编程反应和响应。<em>t</em>脚本在Kvaser设备上进行本地运行。一旦加载并启动<em>t</em>脚本，就无需再与PC通信。*</p>
<p><strong>如何设置网关？</strong><br />
首先，您需要一台可以使用t脚本的多通道设备，例如<a href="/products/?descriptor=pc_product_groups&amp;pc_product_groups=USBcan"><u>USBcan Pro</u></a>（2xHS或4xHS）或Kvaser <a href="/products/#?filter=Memorator"><u>Memorator Pro</u></a>（2xHS v2或5xHS）。然后将通道1和2分别连接到两条CAN总线上。如果设备有两条以上的通道，那么您也可以接入不同的通道。在示例中，我们将使用通道1和通道2。如果在独立模式下使用Memorator Pro，则需要为通道1供电。</p>
<p>通过Kvaser用于创建、编译和运行<em>t</em>脚本的集成开发环境TRX，您可以使用以下<em>t</em>脚本，并将其下载到通道1上的设备中：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">variables { 

  const int ch1 = 0; 

  const int ch2 = 1; 

} 

 

on start { 

  canSetBitrate(ch1, canBITRATE_250K); 

  canSetBitrate(ch2, canBITRATE_250K); 

  canSetBusOutputControl(ch1, canDRIVER_NORMAL); 

  canSetBusOutputControl(ch2, canDRIVER_NORMAL); 

  canBusOn(ch1); 

  canBusOn(ch2); 

} 

 

on stop { 

  canBusOff(ch1); 

  canBusOff(ch2); 

} 

 

on CanMessage &lt;ch1&gt; * { 

  canWrite(ch2, this); 

} 

 

on CanMessage &lt;ch2&gt; * { 

  canWrite(ch1, this); 

} </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在TRX中运行此脚本时，通道1和通道2都将以250 kb/s的比特率接入总线。之后，第一条CAN总线上的流量将传输至第二条CAN总线，反之亦然。</p>
<p><strong>正在发生什么？</strong><br />
该脚本共有四个“hooks”，分别为：on start、on stop、on CANMessage &lt;ch 1&gt;和 on CANMessage &lt;ch 2&gt;。当加载脚本并由TRX通知开始时，“on start”将被触发。在这段代码中，通道将被置于总线上。当通知TRX停止脚本时，“on stop”被触发，通道将被置于总线关闭状态。如果CAN通道1读取报文，则会触发on CANMessage &lt;ch 1&gt;，并运行代码将报文复制到CAN通道2。而如果CAN通道2读取报文，则运行on CANMessage &lt;ch 2&gt;中的代码。</p>
<p>通过这些基本步骤，您就可以拥有一个连接两条CAN总线的功能网关。但是，如果您还想做得更多，该怎么办呢？</p>
<p><strong>如果设备已经在总线上，需进行哪些操作？</strong><br />
如果设备已经在总线上，则无需on start和on stop hooks。为了便于读取，可以删除这些hooks：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">variables { 

  const int ch1 = 0; 

  const int ch2 = 1; 

} 

 

on CanMessage &lt;ch1&gt; * { 

  canWrite(ch2, this); 

} 

 

on CanMessage &lt;ch2&gt; * { 

  canWrite(ch1, this); 

} </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您使用的是<a href="/products/kvaser-usbcan-pro-2xhs-v2/"><u>Kvaser USBcan Pro 2xHS v2</u></a><strong>、</strong><a href="/products/kvaser-usbcan-pro-4xhs/"><u>Kvaser USBcan Pro 4xHS</u></a>或Kvaser Hybrid Pro 2xHS等设备，以下是启动脚本的步骤：</p>
<ol>
<li><strong>打开总线监控</strong><strong>/</strong><strong>总线分析软件</strong></li>
<li><strong>配置设备并打开通道</strong></li>
<li><strong>启动</strong><strong>TRX</strong><strong>并加载项目</strong></li>
<li><strong>在</strong><strong>TRX</strong><strong>中将设备设置为</strong><strong>“</strong><strong>在线</strong><strong>”</strong><strong>状态</strong></li>
<li><strong>在</strong><strong>TRX</strong><strong>中将</strong><strong>t</strong><strong>脚本下载到设备上</strong></li>
<li><strong>在</strong><strong>TRX</strong><strong>中启动</strong><strong>t</strong><strong>脚本</strong></li>
</ol>
<p>现在，设备已作为网关运行，您仍可使用总线分析/总线监控软件。以上就是关于设置基本网关的全部内容。但如果要连接两条不同比特率的总线，该怎么办呢？您可以为CAN通道设置所需的比特率：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">on start { 

  canSetBitrate(ch1, canBITRATE_250K); 

  canSetBitrate(ch2, canBITRATE_500K); 

  canSetBusOutputControl(ch1, canDRIVER_NORMAL); 

  canSetBusOutputControl(ch2, canDRIVER_NORMAL); 

  canBusOn(ch1); 

  canBusOn(ch2); 

} </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您使用软件监控总线，则在软件中进行配置。如果需要两个以上的通道，可以为这些通道添加更多的“CanMessage”hooks。</p>
<p><strong>将某些报文ID转移到另一个通道：</strong><br />
我们可以使用以下hooks轻松地根据ID进行过滤。该hooks事件将只发送一个11位ID 1019（十进制）的报文到CAN通道2。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">on CanMessage &lt;ch1&gt; 1019 { 

  canWrite(ch2, this); 

} </code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><strong>从CAN转到CAN FD：</strong><br />
从CAN转到CAN FD（反之亦然）更加复杂。您无法直接复制报文，而是需要重新将报文格式化为CAN FD格式。</p>
<p>在本例中，我们将CAN 通道2设置为CAN FD，标称比特率为1 mb/s，数据段比特率为2 mb/s。CAN通道1接收的任何报文都将被传输为CAN通道2的CAN FD格式，而CAN通道2的任何CAN FD报文都将被重新格式化为CAN 格式，以便在通道1上发送。本例中CAN和CAN FD的DLC均为8。在更高级的示例中，在传输报文时还需要考虑CAN和CAN FD之间的其他差异，如CAN FD帧大于8个数据字节。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">variables{
  const int ch1 = 0;
  const int ch2 = 1;
  CanMessageFd msgFD;
  CanMessage msg;
}
 
on start { 
  canSetBitrate(ch1, canBITRATE_250K); 
 
  canSetBitrateFd(ch2, canFD_BITRATE_2M_80P);
  canSetCommunicationMode(ch2, canMODE_CAN_FD);
 
  canBusOn(ch1); 
  canBusOn(ch2); 
} 
 
on CanMessage &lt;ch1&gt; *{
  if ((this.flags &amp; (canMSG_RTR | canMSG_ERROR_FRAME)) == 0) { 
     msgFD.id = this.id;
     if ((this.flags &amp; canMSG_EXT) != 0) { 
       msgFD.flags = canMSG_EXT; 
     } 
     
     msgFD.flags = 0;
     msgFD.dlc   = 8; 
     msgFD.data  = this.data;   
     
     canWrite(ch2, msgFD); 
   } 
 
} 
 
on CanMessageFd &lt;ch2&gt; *{  
  if ((this.id &amp; canMSG_ERROR_FRAME) == 0) {  
     msg.id = this.id; 
     msg.flags = 0; 
     if ((this.id &amp; canMSG_EXT) != 0) { 
        msg.flags = canMSG_EXT; 
     } 
     
     msg.dlc   = 8; 
     msg.data  = this.data; 
 
     canWrite(ch1, msg); 
   } 
 } 

on stop{
  canBusOff(ch1);
  canBusOff(ch2);
}
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><strong>以上所有这些有什么用途？</strong><br />
您无需购买全新设备作为网关，并且可以使用现有的、具有兼容性的Kvaser设备作为网关。Kvaser的<em>t</em><em>脚本</em>语言允许使用现有硬件灵活地解决常见问题，以便节省您的时间和资源。</p>
<p>这只是使用支持<em>t</em>脚本的设备和几行代码就能解决问题的一个示例。如需了解更多示例，请参阅我们的其他<a href="/support/developer/developer-blog/"><u>DevBlogs</u></a> 。</p>
<p><em>*</em><em>也就是说，如果您的设备被用作</em><em>USB</em><em>通讯仪，在程序运行时从电脑上拔下设备会导致</em><em>t</em><em>脚本停止运行。</em></p>
<p><em>此外，由于</em><em>t</em><em>脚本调度程序每次只能处理一个非定时</em><em>hooks</em><em>事件，因此在处理报文时会有</em><em>1 ms</em><em>的延迟。在某些情况下，如果同时发送多条报文，可能会推迟执行，因为调度程序会报文以</em><em>1 ms</em><em>的处理间隔逐一处理每一条报文。请在将本示例集成到您的网络时考虑到上述内容。</em></p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/a-simple-script-that-turns-a-programmable-kvaser-device-into-a-gateway/">只需一个简单脚本，具备编程功能的Kvaser设备秒变高效网关</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>最新动态：Bryan Hennessy深度解析2024年第一季度SAE J3271更新要点</title>
		<link>https://www.kvaser.cn/developer-blog/bryan-hennessys-q1-2024-update-on-sae-j3271-the-megawatt-charging-system-standard/</link>
		
		<dc:creator><![CDATA[Bryan Hennessy]]></dc:creator>
		<pubDate>Fri, 22 Mar 2024 11:39:38 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1012177</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/bryan-hennessys-q1-2024-update-on-sae-j3271-the-megawatt-charging-system-standard/">最新动态：Bryan Hennessy深度解析2024年第一季度SAE J3271更新要点</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg.webp" class="vc_single_image-img  attachment-full" alt="" title="adobestock642230707-kopiera.jpg" srcset="https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg.webp 1000w, https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg-324x108.webp 324w, https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg-416x139.webp 416w, https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg-300x100.webp 300w, https://www.kvaser.cn/wp-content/uploads/2024/04/adobestock642230707-kopierajpg-768x256.webp 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></div></div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>在CAN应用中，有一些被视为非传统的应用方式；它们不采用大多数CAN应用中的固定布局控制系统。目前，正在考虑采用CAN的两个新兴领域正是这类应用的代表：兆瓦级车辆充电器以及拖拉机/拖车连接。</p>
<h4>卡车充电</h4>
<p>虽然电动汽车充电器在世界很多地方都很常见，但它们不足以为正在开发的重型电动车辆充电。目前正在开发的重型卡车、电动渡轮和电动飞机需要功率大得多的充电站，因为它们的电池组要大得多，而且它们所服务的行业需要更快的充电时间。</p>
<p>为满足这些需求，业界正在制定兆瓦级充电标准（MCS），美国汽车工程师学会将其命名为SAE J3271。这是一种直流充电标准，可提高其适用范围内车辆的充电量。与现有的充电站相比，这种应用在多个方面有所不同。其中之一是极高的可靠性。连接时必须考虑移动部件（电缆和连接器）、极端的外部温度和湿度、粗暴的操作和肮脏的环境等因素。更麻烦的是，该标准的高功率范围要求电缆和连接器采用液体冷却。这就需要不同的专业知识来设计这些组件，因此需要不同的标准委员会和工作组同步开展工作。</p>
<h4>卡车和拖车连接</h4>
<p>在我以前提到过的一个截然不同的应用中，除了液体冷却外，不久的将来卡车/拖车连接也会面临许多相同的挑战。与CAN CC和CAN FD的大多数应用不同，这些应用要求每次连接时都将网络上的两个部件连接在一起，而且每个部件上很可能都有一个ECU。如果你研究一下CAN CC和CAN FD中的确认位，就会明白为什么在建立此连接之前，这些网络都是无效网络。此外，还有终端问题。CAN要求在干线电缆的两端或附近各安装一个终端器。如果电缆在中间某处断开，那么端接要求就会使这两部分都不能单独成为一个有效的网络。</p>
<p>兆瓦级充电器和卡车/拖车连接都必须考虑与协议检测和适配有关的可升级性和使用寿命。当一个ECU插入另一个ECU时，你必须准确了解其通信配置，或者能够检测并适配通用通信协议。目前正在考虑将 CAN CC、CAN FD、CAN XL（稍远期）、以太网10Base-T1S、1000Base-T1和采用12伏/24伏信号的ISO 11992系列用于这两种应用或其中一种。</p>
<p>ISO 11992标准主要在欧洲市场用于拖拉机/拖车连接，开发人员在思考监控管理系统和未来卡车/拖车接口的相关问题时能从中借鉴一些经验。这些重叠领域涉及对高可靠性的要求，以及需要在两端都有终端的分离式网络。ISO 11992是一项经过实践检验的标准，它允许在故障条件下进行通信，例如CAN_H或CAN_L短路或断路时的单线连接。从ISO 11992借鉴到的在网络两端设置终端的经验提升了我们的信心，但网络、速度和协议之间的额外选择也在要求开发人员提出新的解决方案，并证明这些解决方案能够满足这些应用的高可靠性需求。</p>
<p>作为数字控制技术领域的领军企业，Kvaser将持续监督并推动这些标准化进程，同时提供高质量的接口和数据记录仪，以满足行业需求。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/bryan-hennessys-q1-2024-update-on-sae-j3271-the-megawatt-charging-system-standard/">最新动态：Bryan Hennessy深度解析2024年第一季度SAE J3271更新要点</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>利用MagiSync的优势</title>
		<link>https://www.kvaser.cn/developer-blog/using-the-benefits-of-magisync/</link>
		
		<dc:creator><![CDATA[Troy]]></dc:creator>
		<pubDate>Tue, 31 Oct 2023 10:26:38 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1011995</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/using-the-benefits-of-magisync/">利用MagiSync的优势</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>MagiSync是我们的SemiPro、Professional和Precision产品中提供的一项功能，使用它可自动同步连接到同一USB根集线器的Kvaser USB设备上的时钟信号。当设备插入电源并通电时，这种同步就会发生，并且不需要任何配置即可激活此功能。</p>
<p>如果您选中菜单项“查看”-&gt;“已同步硬件”，就可以通过查看Kvaser设备指南来判断哪些设备已同步。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png.webp" class="vc_single_image-img  attachment-full" alt="" title="magisync-devblog-1.png" srcset="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png.webp 936w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png-324x218.webp 324w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png-416x280.webp 416w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png-300x202.webp 300w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-1png-768x517.webp 768w" sizes="(max-width: 936px) 100vw, 936px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>正如您所看到的，Kvaser Hybrid Pro和Kvaser Memorator Pro被同步到了MagiSync Group 1中。附带的Leaf Light v2不包括在内，因为它不支持MagiSync。因此，Hybrid Pro和Memorator Pro通道上的时钟信号是同步的，而Leaf Light HS v2通道则不同步。</p>
<p>随着时钟信号的同步，我们现在需要将时钟放在同一时域内，以保证从每个通道返回的时间戳在同一时刻是相同的。这样就能更轻松地分析从多个通道上接收的数据。这是通过使用CANlib SDK中的kvTimeDomain***函数来完成的。</p>
<p>第一步是创建一个时域，供您希望具有同步时间戳的所有句柄使用。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">Canlib.canStatus status = Canlib.kvTimeDomainCreate(out object myTimeDomain);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>下一步是配置每个通道的句柄。因此，需要获取您的通道句柄并设置其比特率。在我的示例代码中，我使用通道枚举1和3来对应Kvaser Hybrid Pro的第一个通道和Kvaser Memorator Pro的第一个通道，如下所示：</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png.webp" class="vc_single_image-img  attachment-full" alt="" title="magisync-devblog-2.png" srcset="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png.webp 936w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png-324x218.webp 324w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png-416x280.webp 416w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png-300x202.webp 300w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-2png-768x517.webp 768w" sizes="(max-width: 936px) 100vw, 936px" /></div><pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">int hybridHnd = Canlib.canOpenChannel(1, 0);
int memoHnd = Canlib.canOpenChannel(3, 0);
status = Canlib.canSetBusParams(hybridHnd, Canlib.canBITRATE_250K, 0, 0, 0, 1);
status = Canlib.canSetBusParams(memoHnd, Canlib.canBITRATE_250K, 0, 0, 0, 1);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>通常情况下，当通道句柄设置为总线开启时，时间戳会重置为零。当使用时域时，我们希望只有在重置时域时才将时间戳重置为零。因此，我们需要使用canIoCtl函数来关闭正常行为。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">object autoResetOff = (UInt32)0;
status = Canlib.canIoCtl(hybridHnd, Canlib.canIOCTL_SET_BUSON_TIME_AUTO_RESET, ref autoResetOff);
status = Canlib.canIoCtl(memoHnd, Canlib.canIOCTL_SET_BUSON_TIME_AUTO_RESET, ref autoResetOff);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>然后，我们使用kvTimeDomainAddHandle函数将句柄添加到时域中。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">status = Canlib.kvTimeDomainAddHandle(myTimeDomain, hybridHnd);
status = Canlib.kvTimeDomainAddHandle(myTimeDomain, memoHnd);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>启动总线前，我们需要将时域重置为零。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">status = Canlib.kvTimeDomainResetTime(myTimeDomain);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>现在我们已准备好启动通道句柄总线了。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">status = canBusOn(hybridHnd);
status = canBusOn(memoHnd);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>此时，在两个通道上接收的帧的时间戳将被同步。以下是完整示例程序的输出结果，其中从左到右的列依次为通道、标识符、标志、dlc、数据字节和时间戳。</p>

		</div>
	</div>
<div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png.webp" class="vc_single_image-img  attachment-full" alt="" title="magisync-devblog-3.png" srcset="https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png.webp 936w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png-324x224.webp 324w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png-416x288.webp 416w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png-300x208.webp 300w, https://www.kvaser.cn/wp-content/uploads/2023/12/magisync-devblog-3png-768x532.webp 768w" sizes="(max-width: 936px) 100vw, 936px" /></div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><em>**** </em><em>运行程序时的截屏显示在两个通道上接收到的具有相同时间戳的相同信息</em><em> ****</em></p>
<p>作为使用kvTimeDomain***函数的最后一步，您应该使用kvTimeDomain RemoveHandle和kvTimeDomainDelete函数来正确清理句柄和时域。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">status = Canlib.canBusOff(hybridHnd);
status = Canlib.canBusOff(memoHnd);
status = Canlib.kvTimeDomainRemoveHandle(myTimeDomain, hybridHnd);
status = Canlib.kvTimeDomainRemoveHandle(myTimeDomain, memoHnd);
status = Canlib.canClose(hybridHnd);
status = Canlib.canClose(memoHnd);
status = Canlib.kvTimeDomainDelete(myTimeDomain);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如果您喜欢在同一时域中获得所有的时间戳，您可能还想调整时间戳的解析度。报告的默认时间戳精度是1毫秒。但是您可以使用canIoCtl函数来调整每个句柄时间戳的精度。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">object timerScale = (UInt32)1;  // set resolution to 1 microsecond
status = Canlib.canIoCtl(hybridHnd, Canlib.canIOCTL_SET_TIMER_SCALE, ref timerScale);
status = Canlib.canIoCtl(memoHnd, Canlib.canIOCTL_SET_TIMER_SCALE, ref timerScale);</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>应在重置时域并使句柄在总线上处于激活状态之前进行此更改。</p>

		</div>
	</div>
<div class="vc_separator wpb_content_element vc_separator_align_center vc_sep_width_100 vc_sep_pos_align_center vc_sep_color_grey wpb_content_element" ><span class="vc_sep_holder vc_sep_holder_l"><span class="vc_sep_line"></span></span><span class="vc_sep_holder vc_sep_holder_r"><span class="vc_sep_line"></span></span>
</div>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>如需了解更多信息，请参见<a href="https://www.kvaser.com/canlib-webhelp/">CANlib帮助文档</a>。如果您有任何问题或希望获取本文中的示例应用副本，请发送邮件至<a href="mailto:support@kvaser.com">support@kvaser.com</a>。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/using-the-benefits-of-magisync/">利用MagiSync的优势</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>如何正确理解和选择SocketCAN与LinuxCAN？</title>
		<link>https://www.kvaser.cn/developer-blog/socketcan-versus-linuxcan-make-the-right-choice-for-your-application/</link>
		
		<dc:creator><![CDATA[Adam Raymer]]></dc:creator>
		<pubDate>Mon, 12 Jun 2023 06:03:11 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1011809</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/socketcan-versus-linuxcan-make-the-right-choice-for-your-application/">如何正确理解和选择SocketCAN与LinuxCAN？</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="vc_row wpb_row vc_inner vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="single-image"><img decoding="async" src="https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg.webp" class="vc_single_image-img  attachment-full" alt="" title="socketcanversuslinuxcanbannerblogpost1.jpg" srcset="https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg.webp 1920w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-324x110.webp 324w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-416x141.webp 416w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-300x102.webp 300w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-1024x347.webp 1024w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-768x260.webp 768w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-1536x520.webp 1536w, https://www.kvaser.cn/wp-content/uploads/2023/07/socketcanversuslinuxcanbannerblogpost1jpg-1200x406.webp 1200w" sizes="(max-width: 1920px) 100vw, 1920px" /></div></div></div></div></div><div class="vc_row wpb_row vc_inner vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>设想一下，您正在开发一款CAN系统。您需要在CAN节点和计算机之间建立连接，来控制CAN节点的收发。并且，您使用的是Kvaser硬件设备，该项目要求您使用Linux电脑（例如Raspberry Pi或Ubuntu）。那么该如何将Kvaser设备连接到PC？</p>
<p>为了达到此目的，您需要安装驱动程序。鉴于您正在使用Linux，可以选择LinuxCAN驱动程序或SocketCAN驱动程序。那么这两者有什么区别吗？这取决于您的目的。</p>
<p><strong>什么是LinuxCAN？</strong></p>
<p>LinuxCAN是Kvaser为Linux量身定制的一套驱动程序。该驱动程序包含在Kvaser CANlib SDK软件开发包中，并通过我们的API进行定制编程。也就是一次安装就能涵盖所有设备（不包括以太网设备）的驱动程序。</p>
<p><strong>什么是SocketCAN？</strong></p>
<p><a href="https://en.wikipedia.org/wiki/SocketCAN">SocketCAN</a>是一组开源的CAN驱动程序和网络堆栈，多个Linux发布版本中都包含它们。换句话说，SocketCAN是预装的，您只需配置SocketCAN即可。不止是Kvaser硬件产品，SocketCAN还支持其他设备。SocketCAN使用Berkeley socket API、Linux网络堆栈，并将CAN设备驱动程序作为网络接口。<a href="https://www.kvaser.cn/knowledge-base/linux-can-i-use-socketcan-with-my-kvaser-interface/">点击此处</a>，获取适用于SocketCAN的Kvaser相关产品完整列表。</p>
<p>Kvaser持续为SocketCAN提供驱动程序更新，但不对SocketCAN进行维护。您可以在Kvaser官网上查询SocketCAN的测试版驱动程序。这些驱动程序用于更新Linux内核的SocketCAN驱动，但可能会出现尚未获批或整合进最新版本内核的情况Kvaser硬件的支持取决于Linux内核版本，因为我们需等SocketCAN工作组将支持新硬件的更新加进去。</p>
<p><strong>两者的差异在哪里？</strong></p>
<p>SocketCAN和LinuxCAN均支持在Linux设备上使用Kvaser。接下来我将列出一些软件关键区别，以便帮助您选择：</p>
<ul>
<li>SocketCAN是一组基于网络套接字的驱动程序。类似于通用驱动程序。您可以这样理解：当您插上一个新鼠标，其即被注册为“通用鼠标”。SocketCAN提供访问CAN总线的功能。SocketCAN允许按需更换设备，包含来自其他公司的设备。此外，还可以通过bash命令提示执行SocketCAN命令，这意味着您可以从命令终端设置基本发送、接收功能。</li>
<li>LinuxCAN与Kvaser Windows API适配。该API专用于Kvaser，驱动程序专用于Kvaser设备。基于此，您就可以访问更多基于LinuxCAN SDK编程的功能。这些功能包括：对装置上的LED进行编程，以及添加Kvaser Memorator提取命令。LinuxCAN还支持LIN功能，SocketCAN则不支持。但LinuxCAN不支持在终端窗口中通过bash提示符运行命令。</li>
</ul>
<p><strong>可以同时使用SocketCAN和LinuxCAN吗？</strong></p>
<p>这个取决于您的应用情况。首先，在为Kvaser产品安装LinuxCAN时，安装程序会将SocketCAN驱动程序列入黑名单。这是为了防止驱动程序冲突。这意味着Kvaser设备只能使用LinuxCAN驱动程序。虽然如此，您仍然可以使用其他公司的SocketCAN驱动程序。Kvaser API命令仍然仅适用于Kvaser设备，SocketCAN命令仅适用于使用SocketCAN驱动程序的设备。</p>
<p><strong>什么情况下应该只选择其中之一？</strong></p>
<p>这取决于项目的性质。如果您有一个项目，它所使用的功能特定于Kvaser设备，那么LinuxCAN将是更好的选择。如果在您的应用中所用的CAN通讯仪可能被替换，或者要它们具有类似的功能，那么可以考虑选择SocketCAN。</p>
<p><strong>总结：</strong><br />
<strong>SocketCAN：</strong></p>
<ul>
<li>为Kvaser以及其他公司的硬件提供驱动程序。</li>
<li>可通过Linux内核获得，无需安装。</li>
<li>可通过bash提示符运行命令。</li>
<li>无LIN功能。</li>
</ul>
<p><strong>LinuxCAN：</strong></p>
<ul>
<li>特定于Kvaser设备，支持高级功能。</li>
<li>将Kvaser产品中的SocketCAN驱动程序列入黑名单，以避免冲突。</li>
<li>无法通过bash提示符运行命令。</li>
<li>具有LIN功能。</li>
</ul>

		</div>
	</div>
</div></div></div></div></div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/socketcan-versus-linuxcan-make-the-right-choice-for-your-application/">如何正确理解和选择SocketCAN与LinuxCAN？</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
