C#串口接收、发送总结
最近笔者使用C#编程时,经常用到串口通信功能。所以总结记录一下串口通信功能的使用方法。串口组件在工具箱中找到SerialPort组件,将其添加到设计中。串口端口和波特率设置属性名称含义(Name)指示代码中用来标识该对象的名称BaudRate此串行端口上要使用的波特率DataBits没发送/接收一个字节的数据位数目DiscardNull在添加到序列缓冲区前是否丢弃端口上接收的空字节DtrEnabl
最近笔者使用C#编程时,经常用到串口通信功能。所以总结记录一下串口通信功能的使用方法。
串口组件
在工具箱中找到SerialPort组件,将其添加到设计中。
串口端口和波特率设置

| 属性名称 | 含义 |
|---|---|
| (Name) | 指示代码中用来标识该对象的名称 |
| BaudRate | 此串行端口上要使用的波特率 |
| DataBits | 没发送/接收一个字节的数据位数目 |
| DiscardNull | 在添加到序列缓冲区前是否丢弃端口上接收的空字节 |
| DtrEnable | 在通信过程中是否启用数据终端就绪(DTR)行 |
| GenerateMember | 指示是否将为此组件生成成员变量 |
| Handshake | 用于数据交换中流控制的握手协议 |
| Modifiers | 指示对象的可见性级别 |
| Parity | 用于对每个接收字节进行奇偶校验检查并且标记每个发送的字节的方案 |
| ParityPeplace | 用来替换接收的有奇偶校验错误的字节的字节 |
| PortName | 要打开的通信端口的名称 |
| ReadBufferSize | 读取缓冲区的大小(以字节为单位) |
| ReadTimeout | 读取超时(以毫秒为单位) |
| ReceivedBytesThreshold | 触发Read事件前要求可用的字节数 |
| RtsEnable | 在通信过程中是否启用请求发送(RTS)行 |
| StopBits | 每发送/接收一个字节的停止位数目 |
| WriteBufferSize | 写入缓冲区的大小(以字节为单位) |
| WriteTimerout | 写入超时(以毫秒为单位) |
上表是SerialPort组件的属性及其对应的含义,在实际编程中,鼠标选中某个属性时也会显示出对应的含义。平时使用时,我们大多只需修改PortName、BaudRate、DataBits 、StopBits、Parity、ReadBufferSize、WriteBufferSize这个几个属性。其中DataBits 、StopBits、Parity这三个属性在大多数串口通信中,都默认为8、One、None。在STM32F1单片机中关于串口的配置有如下语句。
在.cs文件中调用如下语句进行SerialPort组件的初始化。
serialPort1.PortName = comboBox1.Text;//设置端口名
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);//设置波特率
serialPort1.Open();//打开串口
其中comboBox1、comboBox2为设计中的两个控件。
调用以下函数关闭串口。
serialPort1.Close();//关闭串口
在定时器中调用以下函数用以更新可用端口。
private void Updata_Serialport_Name(ComboBox MycomboBox)
{
string[] ArryPort = SerialPort.GetPortNames();
MycomboBox.Items.Clear();
for (int i = 0; i < ArryPort.Length; i++)
{
MycomboBox.Items.Add(ArryPort[i]);
}
}
串口接收
| 事件名称 | 含义 |
|---|---|
| DataReceived | 每次从SerialPort接收数据时引发 |
| ErrorReceived | 每次从SerialPort接收错误时引发 |
| PinChanged | 每次SerialPort的pin更改时引发 |
上表SerialPort组件的事件及其对应的含义。我们将主要使用DataReceived事件。
在DateRecived事件中引用以下函数,即可完成串口数据的接收与显示。
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//string str = serialPort1.ReadExisting();//直接以字符串方式读并显示
//textBox1.AppendText(str);
int length = serialPort1.BytesToRead;
byte[] data = new byte[length];
serialPort1.Read(data, 0, length);
//对串口接收数据的处理,可对data进行解析
for (int i = 0; i < length; i++)
{
string str = Convert.ToString(data[i], 16).ToUpper();
textBox1.AppendText(str.Length == 1 ? "0" + str + " " : str + " ");//将接收到的数据以十六进制显示到文本框内
}
//string str = Encoding.UTF8.GetString(data, 0, length);
//textBox1.AppendText(str);//以字符显示
}
串口发送
SerialPort组件的发送方法如下。
//serialPort1.Write(textBox2.Text.Trim());//以字符串方式发送数据
int length;
byte[] data = new byte[length];
serialPort1.Write(data, 0, length);
//write()的后两个参数为offset和count,就是发送数据的起始位置和长度
//比如只发数组的第二个数据,则使用serialPort1.Write(data, 1, 1);
至此,我们就可实现C#串口通信的基本操作。
关于串口发送数据时,需要从输入控件读取各种数据类型以及不同数据类型的转换请参考笔者之前的博客。
更多推荐



所有评论(0)