<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Vb on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/vb/</link><description>Recent content in Vb on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 22 Jul 2025 08:40:01 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/vb/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft.Jet.OLEDB.4.0驱动程序</title><link>https://leafcxy.github.io/posts/2025-07-22-11/</link><pubDate>Tue, 22 Jul 2025 08:40:01 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-22-11/</guid><description>&lt;p&gt;在64位程序中运行使用Microsoft.Jet.OLEDB.4.0需要特别注意，因为Microsoft.Jet.OLEDB.4.0驱动程序是为32位环境设计的。在64位操作系统和64位应用程序中，它可能无法正常工作。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;如果你需要在64位程序中使用Microsoft.Jet.OLEDB.4.0，你可以尝试以下方法：&lt;/p&gt;
&lt;p&gt;使用WoW64（Windows on Windows 64）桥接器：WoW64是Windows提供的一种机制，允许32位应用程序在64位环境中运行。你可以通过在64位程序中调用WoW64桥接器来访问Microsoft.Jet.OLEDB.4.0驱动程序。这可以通过编程方式实现，例如使用系统调用来调用适当的WoW64函数。
使用32位版本的数据库引擎：如果你有权限安装额外的软件，你可以尝试安装32位版本的数据库引擎，例如Microsoft Access，它包含了Microsoft.Jet.OLEDB.4.0驱动程序。然后，你可以在64位程序中使用这个32位版本的数据库引擎来访问数据库。
使用替代的数据库连接驱动程序：如果可能，考虑使用与64位环境兼容的其他数据库连接驱动程序，例如MySQL或SQLite。这些驱动程序可以在64位环境中正常运行，并且提供了与Microsoft.Jet.OLEDB.4.0相似的功能。
请注意，这些方法可能并不适用于所有情况，具体取决于你的应用程序和需求。在进行任何更改之前，请确保备份你的数据，并测试你的应用程序以确保其正常工作。&lt;/p&gt;</description></item><item><title>SerialPort串口编程</title><link>https://leafcxy.github.io/posts/2025-07-22-7/</link><pubDate>Tue, 22 Jul 2025 08:32:21 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-22-7/</guid><description>&lt;p&gt;从Microsoft .Net 2.0版本以后，就默认提供了System.IO.Ports.SerialPort类，用户可以非常简单地编写少量代码就完成串口的信息收发程序。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="串口端口号搜索"&gt;串口端口号搜索&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[] portList = System.IO.Ports.SerialPort.GetPortNames();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i = &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &amp;lt; portList.Length; i++)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; name = portList[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; comboBox.Items.Add(name);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="串口属性参数设置"&gt;串口属性参数设置&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SerialPort mySerialPort = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; SerialPort(&lt;span style="color:#e6db74"&gt;&amp;#34;COM2&amp;#34;&lt;/span&gt;);&lt;span style="color:#75715e"&gt;//端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.BaudRate = &lt;span style="color:#ae81ff"&gt;9600&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//波特率&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.Parity = Parity.None;&lt;span style="color:#75715e"&gt;//校验位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.StopBits = StopBits.One;&lt;span style="color:#75715e"&gt;//停止位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.DataBits = &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//数据位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.Handshake = Handshake.Non;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.ReadTimeout = &lt;span style="color:#ae81ff"&gt;1500&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.DtrEnable = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//启用数据终端就绪信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.Encoding = Encoding.UTF8;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.ReceivedBytesThreshold = &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//DataReceived触发前内部输入缓冲器的字节数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.DataReceived += &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; SerialDataReceivedEvenHandler(DataReceive_Method);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySerialPort.Open();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="串口发送信息"&gt;串口发送信息&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Write a string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;port.Write(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Write a set of bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;port.Write(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;[] { &lt;span style="color:#ae81ff"&gt;0x0A&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0xE2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0xFF&lt;/span&gt; }, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Close the port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;port.Close();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="串口接收信息"&gt;串口接收信息&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; serialReadString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; port_DataReceived(&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt; sender, SerialDataReceivedEventArgs e)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; serialReadString = port.ReadExisting());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.txt1.Invoke( &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; MethodInvoker(&lt;span style="color:#66d9ef"&gt;delegate&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.txt1.AppendText(serialReadString); }));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="循环接收数据"&gt;循环接收数据&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; com_DataReceived(&lt;span style="color:#66d9ef"&gt;object&lt;/span&gt; sender, SerialDataReceivedEventArgs e)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Use either the binary OR the string technique (but not both)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Buffer and process binary data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (com.BytesToRead &amp;gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bBuffer.Add((&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;)com.ReadByte());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ProcessBuffer(bBuffer);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Buffer string data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sBuffer += com.ReadExisting();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ProcessBuffer(sBuffer);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; ProcessBuffer(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; sBuffer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Look in the string for useful information&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// then remove the useful data from the buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; ProcessBuffer(List&amp;lt;&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&amp;gt; bBuffer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Look in the byte array for useful information&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// then remove the useful data from the buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>