建立好一个form后,选择工具箱,在组件所属里找到SerialPort:
拖拽一个即可。
这时可以看到属性栏:
可以查看修改默认属性值。
这时就可以通过控件设计我们的界面啦:
我这里设计的很简单,包括串口设置、接收数据、发送数据。串口设置参数,我只包含了两个,我们经常改动的COM口和波特率,其他都使用默认值。
波特率通常使用的有固定几种,我们将可能用到的写到波特率绑定的combobox的Items集合属性中即可:
在初始构造函数中加入:
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
}
防止后面出现异常,会提示线程间操作无效: 从不是创建控件的线程访问它。
先实现串口的自动扫描识别:
//我们在form载入时,扫描识别存在的串口。
private void Form1_Load(object sender, EventArgs e)
{
RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
if (keyCom != null)
{
string[] sSubKeys = keyCom.GetValueNames();
cmbPort.Items.Clear();
foreach (string sName in sSubKeys)
{
string sValue = (string)keyCom.GetValue(sName);
cmbPort.Items.Add(sValue);
}
if (cmbPort.Items.Count > 0)
cmbPort.SelectedIndex = 0;
}
cmbBaud.Text = "115200";
}
串口打开实现:
bool isOpened = false;//串口状态标志
private void button1_Click(object sender, EventArgs e)
{
if (!isOpened)
{
serialPort.PortName = cmbPort.Text;
serialPort.BaudRate = Convert.ToInt32(cmbBaud.Text, 10);
try
{
serialPort.Open(); //打开串口
button1.Text = "关闭串口";
cmbPort.Enabled = false;//关闭使能
cmbBaud.Enabled = false;
isOpened = true;
serialPort.DataReceived += new SerialDataReceivedEventHandler(post_DataReceived);//串口接收处理函数
}
catch
{
MessageBox.Show("串口打开失败!");
}
}
else
{
try
{
serialPort.Close(); //关闭串口
button1.Text = "打开串口";
cmbPort.Enabled = true;//打开使能
cmbBaud.Enabled = true;
isOpened = false;
}
catch
{
MessageBox.Show("串口关闭失败!");
}
}
}
接收处理函数:
private void post_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string str = serialPort.ReadExisting();//字符串方式读
ReceiveTbox.Text = "";//先清除上一次的数据
ReceiveTbox.Text += str;
}
因为我们之前在打开串口时,加载了串口接收处理函数,所以,每次串口有数据,会自动调用接收处理函数。
数据发送:
private void button2_Click(object sender, EventArgs e)
{
//发送数据
if (serialPort.IsOpen)
{//如果串口开启
if (SendTbox.Text.Trim() != "")//如果框内不为空则
{
serialPort.Write(SendTbox.Text.Trim());//写数据
}
else
{
MessageBox.Show("发送框没有数据");
}
}
else
{
MessageBox.Show("串口未打开");
}
}
通过串口写,即可发出。
测试:
可以使用Configure Virtual Serial Port Driver来虚拟串口,模拟通信。
我直接使用了串口调试经常使用的TTL转USB,自发自收来真实测试:
扫描到了串口:
发送我们的最熟悉的hello world: