清雅老翁 發表於 2020-9-17 17:33:00

C#开发串口通信实例及串口基础

<h1>一、串口通信简介</h1>
<p><span style="font-size: 16px">&nbsp; &nbsp; <span style="color: rgba(0, 128, 128, 1)">&nbsp; &nbsp;串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。</span></span></p>
<p><span style="color: rgba(0, 128, 128, 1); font-size: 16px">&nbsp; &nbsp; &nbsp; &nbsp;串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。</span></p>
<p>&nbsp;<strong> 1.&nbsp;波特率:</strong>这是一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送960个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为960Bd,比特率为10位*960个/秒=9600bps。</p>
<p>&nbsp; <strong>2.&nbsp;数据位:</strong>这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。</p>
<p>&nbsp;<strong> 3.&nbsp;停止位:</strong>用于表示单个包的最后几位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。</p>
<p>&nbsp; <strong>4.&nbsp;校验位:</strong>在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。</p>
<h1>二、C#串口编程类</h1>
<p>&nbsp; &nbsp; &nbsp; &nbsp;从.NET Framework 2.0开始,C#提供了SerialPort类用于实现串口控制。命名空间:<strong><span style="font-size: 16px">System.IO.Ports</span></strong>。其中详细成员介绍参看MSDN文档。下面介绍其常用的字段、方法和事件。</p>
<h3>&nbsp; 1. 常用字段:</h3>
<table border="2" align="left">
<tbody>
<tr>
<td>名称</td>
<td>说明</td>
</tr>
<tr>
<td>PortName</td>
<td>获取或设置通信端口</td>
</tr>
<tr>
<td>BaudRate</td>
<td>获取或设置串行波特率</td>
</tr>
<tr>
<td>DataBits</td>
<td>获取或设置每个字节的标准数据位长度</td>
</tr>
<tr>
<td>Parity</td>
<td>获取或设置奇偶校验检查协议</td>
</tr>
<tr>
<td>StopBits</td>
<td>获取或设置每个字节的标准停止位数</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>2. 常用方法:</h3>
<table border="2" align="left">
<tbody>
<tr>
<td>名称</td>
<td>说明</td>
</tr>
<tr>
<td>Close</td>
<td>关闭端口连接,将&nbsp;IsOpen&nbsp;属性设置为&nbsp;<strong>false</strong>,并释放内部&nbsp;Stream&nbsp;对象</td>
</tr>
<tr>
<td>GetPortNames</td>
<td>获取当前计算机的串行端口名称数组</td>
</tr>
<tr>
<td>Open</td>
<td>打开一个新的串行端口连接</td>
</tr>
<tr>
<td>Read</td>
<td>从&nbsp;<strong>SerialPort</strong>&nbsp;输入缓冲区中读取</td>
</tr>
<tr>
<td>Write</td>
<td>&nbsp;将数据写入串行端口输出缓冲区</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>3. 常用事件:</h3>
<table border="2" align="left">
<tbody>
<tr>
<td>名称</td>
<td>说明</td>
</tr>
<tr>
<td>DataReceived</td>
<td>表示将处理&nbsp;<strong>SerialPort</strong>&nbsp;对象的数据接收事件的方法</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>三、C#开发串口实例</h1>
<p>前台页面:</p>
<p><img src="https://img2020.cnblogs.com/blog/1702828/202009/1702828-20200917173019614-720829701.png" alt="" loading="lazy"></p>
<p>&nbsp;后台代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.IO.Ports;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Windows.Forms;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> SerialPort
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">partial</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> SerialPort : Form
    {
      String serialPortName;
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> SerialPort()
      {
            InitializeComponent();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Form1_Load(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] ports = System.IO.Ports.SerialPort.GetPortNames();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取电脑上可用串口号</span>
            comboBox1.Items.AddRange(ports);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给comboBox1添加数据</span>
            comboBox1.SelectedIndex = comboBox1.Items.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> ? <span style="color: rgba(128, 0, 128, 1)">0</span> : -<span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果里面有数据,显示第0个</span>
<span style="color: rgba(0, 0, 0, 1)">
            comboBox2.Text </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">115200</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">默认波特率:115200</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            comboBox3.Text </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">默认停止位:1</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            comboBox4.Text </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">8</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">默认数据位:8</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            comboBox5.Text </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">无</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">默认奇偶校验位:无</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button1_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (button1.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开串口</span><span style="color: rgba(128, 0, 0, 1)">"</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果按钮显示的是打开</span>
                <span style="color: rgba(0, 0, 255, 1)">try</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">防止意外错误</span>
                  serialPort1.PortName = comboBox1.Text;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取comboBox1要打开的串口号</span>
                  serialPortName =<span style="color: rgba(0, 0, 0, 1)"> comboBox1.Text;
                  serialPort1.BaudRate </span>= <span style="color: rgba(0, 0, 255, 1)">int</span>.Parse(comboBox2.Text);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取comboBox2选择的波特率</span>
                  serialPort1.DataBits = <span style="color: rgba(0, 0, 255, 1)">int</span>.Parse(comboBox4.Text);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置数据位</span>
                  <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">设置停止位</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox3.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.StopBits =<span style="color: rgba(0, 0, 0, 1)"> StopBits.One; }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox3.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1.5</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.StopBits =<span style="color: rgba(0, 0, 0, 1)"> StopBits.OnePointFive; }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox3.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.StopBits =<span style="color: rgba(0, 0, 0, 1)"> StopBits.Two; }
                  </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">设置奇偶校验</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox5.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">无</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.Parity =<span style="color: rgba(0, 0, 0, 1)"> Parity.None; }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox5.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">奇校验</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.Parity =<span style="color: rgba(0, 0, 0, 1)"> Parity.Odd; }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (comboBox5.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">偶校验</span><span style="color: rgba(128, 0, 0, 1)">"</span>) { serialPort1.Parity =<span style="color: rgba(0, 0, 0, 1)"> Parity.Even; }

                  serialPort1.Open();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打开串口</span>
                  button1.Text = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关闭串口</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示关闭串口</span>
<span style="color: rgba(0, 0, 0, 1)">                }
                </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception err)
                {
                  MessageBox.Show(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开失败</span><span style="color: rgba(128, 0, 0, 1)">"</span>+ err.ToString(), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">提示!</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对话框显示打开失败</span>
<span style="color: rgba(0, 0, 0, 1)">                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">要关闭串口</span>
                <span style="color: rgba(0, 0, 255, 1)">try</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">防止意外错误</span>
                  serialPort1.Close();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭串口</span>
<span style="color: rgba(0, 0, 0, 1)">                }
                </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception){}
                button1.Text </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开串口</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示打开</span>
<span style="color: rgba(0, 0, 0, 1)">            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span> WndProc(<span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> Message m)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (m.Msg == <span style="color: rgba(128, 0, 128, 1)">0x0219</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设备改变</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (m.WParam.ToInt32() == <span style="color: rgba(128, 0, 128, 1)">0x8004</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">usb串口拔出</span>
                  <span style="color: rgba(0, 0, 255, 1)">string</span>[] ports = System.IO.Ports.SerialPort.GetPortNames();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重新获取串口</span>
                  comboBox1.Items.Clear();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除comboBox里面的数据</span>
                  comboBox1.Items.AddRange(ports);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给comboBox1添加数据</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (button1.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关闭串口</span><span style="color: rgba(128, 0, 0, 1)">"</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户打开过串口</span>
                        <span style="color: rgba(0, 0, 255, 1)">if</span> (!serialPort1.IsOpen){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户打开的串口被关闭:说明热插拔是用户打开的串口</span>
                            button1.Text = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">打开串口</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
                            serialPort1.Dispose();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">释放掉原先的串口资源</span>
                            comboBox1.SelectedIndex = comboBox1.Items.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> ? <span style="color: rgba(128, 0, 128, 1)">0</span> : -<span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示获取的第一个串口号</span>
<span style="color: rgba(0, 0, 0, 1)">                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                            comboBox1.Text </span>= serialPortName;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示用户打开的那个串口号</span>
<span style="color: rgba(0, 0, 0, 1)">                        }
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户没有打开过串口</span>
                        comboBox1.SelectedIndex = comboBox1.Items.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> ? <span style="color: rgba(128, 0, 128, 1)">0</span> : -<span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示获取的第一个串口号</span>
<span style="color: rgba(0, 0, 0, 1)">                  }
                }
                </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (m.WParam.ToInt32() == <span style="color: rgba(128, 0, 128, 1)">0x8000</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">usb串口连接上</span>
                  <span style="color: rgba(0, 0, 255, 1)">string</span>[] ports = System.IO.Ports.SerialPort.GetPortNames();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重新获取串口</span>
<span style="color: rgba(0, 0, 0, 1)">                  comboBox1.Items.Clear();
                  comboBox1.Items.AddRange(ports);
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (button1.Text == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关闭串口</span><span style="color: rgba(128, 0, 0, 1)">"</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户打开过一个串口</span>
                        comboBox1.Text = serialPortName;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示用户打开的那个串口号</span>
<span style="color: rgba(0, 0, 0, 1)">                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                        comboBox1.SelectedIndex </span>= comboBox1.Items.Count &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> ? <span style="color: rgba(128, 0, 128, 1)">0</span> : -<span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示获取的第一个串口号</span>
<span style="color: rgba(0, 0, 0, 1)">                  }
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">base</span>.WndProc(<span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> m);
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> serialPort1_DataReceived(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, SerialDataReceivedEventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> len = serialPort1.BytesToRead;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取可以读取的字节数</span>
            <span style="color: rgba(0, 0, 255, 1)">byte</span>[] buff = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建缓存数据数组</span>
            serialPort1.Read(buff, <span style="color: rgba(128, 0, 128, 1)">0</span>, len);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把数据读取到buff数组</span>
<span style="color: rgba(0, 0, 0, 1)">            
            Invoke((</span><span style="color: rgba(0, 0, 255, 1)">new</span> Action(() =&gt;{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">C# 3.0以后代替委托的新方法</span>
<span style="color: rgba(0, 0, 0, 1)">               
                  textBox1.AppendText(Encoding.Default.GetString(buff));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对话框追加显示数据</span>
<span style="color: rgba(0, 0, 0, 1)">            })));
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button2_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            textBox1.Clear();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除接收对话框显示的数据</span>
<span style="color: rgba(0, 0, 0, 1)">      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button3_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            String Str </span>= textBox2.Text.ToString();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取发送文本框里面的数据</span>
            <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Str.Length &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  
                        serialPort1.Write(Str);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">串口发送数据</span>
<span style="color: rgba(0, 0, 0, 1)">                  
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception){ }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button4_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            textBox2.Clear();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除发送文本框里面的内容</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }
}</span></pre>
</div><br><br>
来源:https://www.cnblogs.com/sgxw/p/13686409.html
頁: [1]
查看完整版本: C#开发串口通信实例及串口基础