初学C#,最近学习串口编程,串口编程是一个全新的领域,现记录下学到的一些基础内容。
串口编程中需要用到一个非常重要的控件SerialPort
SerialPort几个比较重要属性
NAME 标识在代码中串口的名称
BaudRate 获取或设置串行波特率
DataBits 数据位长度
Parity 奇偶校验
StopBits 停止位
代码
Form1()
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
下面这句必须加,为了避免线程间的错误 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls
= false;
Form1_Load 窗口加载函数
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Encoding = Encoding.GetEncoding("GB2312");
comboBox2.Text = "115200";
button2.Enabled = false;
}
设置串口编码方式为GB2312 serialPort1.Encoding = Encoding.GetEncoding(“GB2312”) comboBOX2为串口波特率选择栏,默认波特率115200
button2为关闭串口按钮,默认不可以点击
serialPort1_DataReceived 串口接收函数
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//串口接收数据事件
{
//接收模式 数据
if (radioButton1.Checked)//选择框,勾选则是ture 进入数据接收模式
{
byte[] data = new byte[serialPort1.BytesToRead];//定义一个数组,长度被接收的数据长度决定
serialPort1.Read(data,0,data.Length);//从串口读数据到数组data 从0开始 偏移data.Length
foreach (var item in data)//遍历数组data
{
string str = Convert.ToString(item, 16).ToUpper();//将数组data中的数据转换成16进制的字符串,同时将字符串大写
if (str.Length == 1)//处理字符串,比如只接收到一个8,则处理成08
{
str = "0" + str;
}
textBox2.AppendText(str);//将处理之后的字符串显示到textBox2中,textBox2为接收数据显示栏
}
}
//接收模式 字符
else
{
string str = serialPort1.ReadExisting();//直接将接收到的数据转换成字符串
textBox2.AppendText(str);//显示字符串
}
}
radioButton1为勾选框
button1_Click 打开串口按钮
private void button1_Click(object sender, EventArgs e)//打开串口
{
try//提高程序的容错性
{
serialPort1.PortName = comboBox1.Text;//选择串口,comboBox1为串口选择栏
serialPort1.BaudRate = int.Parse(comboBox2.Text);//选择波特率
serialPort1.Open();//打开串口
button1.Enabled = false;//串口打开按钮不可用
button2.Enabled = true;//串口关闭可用
}
catch
{
MessageBox.Show("错误!","提示");
serialPort1.Close();//记得出错要关闭串口
}
}
button2_Click 关闭串口按钮
private void button2_Click(object sender, EventArgs e)//关闭串口
{
try
{
serialPort1.Close();//关闭串口
button1.Enabled = true;//串口打开按钮可用
button2.Enabled = false;//串口关闭按钮不可用
}
catch
{
MessageBox.Show("错误","提示");
serialPort1.Close();
}
}
button3_Click 串口发送数据按钮
private void button3_Click(object sender, EventArgs e)//发送数据
{
if(serialPort1.IsOpen && textBox1.Text != "")//检测串口是否打开并且发送栏是否为空
{
//发送模式 数据
if(radioButton3.Checked)
{
try
{
byte[] data = new byte[1];
string str = textBox1.Text;
str = str.Replace(" ", String.Empty);//处理准备发送得字符串,将空白字符,0X,0x删除掉
str = str.Replace("0X", String.Empty);
str = str.Replace("0x", String.Empty);
for (int i = 0; i < (str.Length - str.Length % 2) / 2; i++)
{
data[0] = Convert.ToByte(str.Substring(i * 2, 2), 16);
serialPort1.Write(data, 0, 1);
}
if (str.Length % 2 == 1)
{
data[0] = Convert.ToByte(str.Substring(str.Length - 1, 1), 16);
serialPort1.Write(data, 0, 1);
}
}
catch
{
MessageBox.Show("错误", "提示");
}
}
//发送模式 字符
else
{
try
{
serialPort1.WriteLine(textBox1.Text);
}
catch
{
MessageBox.Show("错误","提示");
serialPort1.Close();
button1.Enabled = true;
button2.Enabled = false;
}
}
}
}
textBox2_TextChanged自动下拉
private void textBox2_TextChanged(object sender, EventArgs e)
{
textBox2.Select(textBox2.Text.Length, 1);
textBox2.ScrollToCaret();
}
button4_Click 扫描串口按钮
private void button4_Click(object sender, EventArgs e)//扫描串口
{
for (int i = 1; i < 20; i++)
{
string str = "COM" + i.ToString();//遍历串口1到20
serialPort1.PortName = str;
try
{
serialPort1.Open();//打开串口,注意,如果没有成功打开串口则会执行catch里面的语句
comboBox1.Items.Add(str);//将能够成功打开的给予comboBox1
serialPort1.Close();//最后再关闭串口
}
catch
{
continue;
}
}
}
}
这里用了try catch语句 加上continue语句,如果不能成功打开串口则继续检测,一直检测到COM20
完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace SerialPort
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Encoding = Encoding.GetEncoding("GB2312");
comboBox2.Text = "115200";
button2.Enabled = false;
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//串口接收数据事件
{
//接收模式 数据
if (radioButton1.Checked)
{
byte[] data = new byte[serialPort1.BytesToRead];
serialPort1.Read(data,0,data.Length);
foreach (var item in data)
{
string str = Convert.ToString(item, 16).ToUpper();
if (str.Length == 1)
{
str = "0" + str;
}
textBox2.AppendText(str);
}
}
//接收模式 字符
else
{
string str = serialPort1.ReadExisting();
textBox2.AppendText(str);
}
}
private void button1_Click(object sender, EventArgs e)//打开串口
{
try
{
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = int.Parse(comboBox2.Text);
serialPort1.Open();
button1.Enabled = false;
button2.Enabled = true;
}
catch
{
MessageBox.Show("错误!","提示");
serialPort1.Close();
}
}
private void button2_Click(object sender, EventArgs e)//关闭串口
{
try
{
serialPort1.Close();
button1.Enabled = true;
button2.Enabled = false;
}
catch
{
MessageBox.Show("错误","提示");
serialPort1.Close();
}
}
private void button3_Click(object sender, EventArgs e)//发送数据
{
if(serialPort1.IsOpen && textBox1.Text != "")
{
//发送模式 数据
if(radioButton3.Checked)
{
try
{
byte[] data = new byte[1];
string str = textBox1.Text;
str = str.Replace(" ", String.Empty);
str = str.Replace("0X", String.Empty);
str = str.Replace("0x", String.Empty);
for (int i = 0; i < (str.Length - str.Length % 2) / 2; i++)
{
data[0] = Convert.ToByte(str.Substring(i * 2, 2), 16);
serialPort1.Write(data, 0, 1);
}
if (str.Length % 2 == 1)
{
data[0] = Convert.ToByte(str.Substring(str.Length - 1, 1), 16);
serialPort1.Write(data, 0, 1);
}
}
catch
{
MessageBox.Show("错误", "提示");
}
}
//发送模式 字符
else
{
try
{
serialPort1.WriteLine(textBox1.Text);
}
catch
{
MessageBox.Show("错误","提示");
serialPort1.Close();
button1.Enabled = true;
button2.Enabled = false;
}
}
}
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
textBox2.Select(textBox2.Text.Length, 1);
textBox2.ScrollToCaret();
}
private void button4_Click(object sender, EventArgs e)//扫描串口
{
for (int i = 1; i < 20; i++)
{
string str = "COM" + i.ToString();
serialPort1.PortName = str;
try
{
serialPort1.Open();
comboBox1.Items.Add(str);
serialPort1.Close();
}
catch
{
continue;
}
}
}
}
}
VisualStudio工程文件
工程文件链接