SerialPort建立通讯过程
- 引入API:System.IO.Ports;
- 创建SerialPort对象
- 设置串口参数
a) PortName串口号:PC设备扫描连接的串口
b) BaudRate波特率:表示每秒传输的字节数。常用4800、9600,38400;
c) DataBit数据位:编码位数。常用8,7,5
d) StopBit停止位:表示一个包结束。常用1、1.5、2;
e) Parity校验方式:检验传输数据的容错率。分为奇校验、偶校验、无校验。
串口编程常用的是RS232协议,九芯插头。串行接口可以接受来自CPU的并行数据字符,转换为连续的串行数据流发送出去。同时可以将接收的串行数据流转换为并行的数据字符提供给CPU的器件。
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;//引入串口通讯API
namespace Serial_Port
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public SerialPort Sp;//串口定义
private void Form1_Load(object sender, EventArgs e)
{
RichTextBox.CheckForIllegalCrossThreadCalls = false;
Control.CheckForIllegalCrossThreadCalls = false;
//串口实例化
Sp = new SerialPort();
//遍历本机串口
string[] ports =SerialPort.GetPortNames();
foreach(string port in ports)
{
cmbPortname.Items.Add(port);
}
//串口号 波特率 数据位 停止位 校验方式默认值设置
if (ports.Length >= 1)
cmbPortname.SelectedIndex = 0;
cmbBaudRate.SelectedIndex = 1;
cmbDataBit.SelectedIndex = 2;
cmbStopBit.SelectedIndex = 0;
cmbParity.SelectedIndex = 0;
//数据接收绑定
Sp.DataReceived += new SerialDataReceivedEventHandler(sp_Received);
}
//打开串口方法
public void OpenSerialPort()
{
//串口未打开
if(Sp.IsOpen==false)
{
try
{
Sp.PortName = cmbPortname.Text.ToString();
Sp.BaudRate =Convert.ToInt16(cmbBaudRate.Text);
Sp.DataBits =Convert.ToInt16(cmbDataBit.Text);
switch (cmbStopBit.Text.ToString())
{
case "1":
Sp.StopBits=StopBits.One;
break;
case "1.5":
Sp.StopBits=StopBits.OnePointFive;
break;
case "2":
Sp.StopBits=StopBits.Two;
break;
default:
break;
}
switch (cmbParity.Text.ToString())
{
case "None":
Sp.Parity =Parity.None;
break;
case "Even":
Sp.Parity = Parity.Even;
break;
case "Odd":
Sp.Parity = Parity.Odd;
break;
default:
break;
}
}
catch(Exception ex)
{
MessageBox.Show("串口参数设置错误:" + ex.Message, "串口参数设置错误");
}
}
if(Sp.IsOpen==true)
{
Sp.Open();
cmbBaudRate.Enabled = false;
cmbDataBit.Enabled = false;
cmbParity.Enabled = false;
cmbPortname.Enabled = false;
cmbStopBit.Enabled = false;
//数据接收绑定
Sp.DataReceived += new SerialDataReceivedEventHandler(sp_Received);
}
}
//串口发送消息 字符转换为流
public void sendMsg()
{
if (Sp.IsOpen == false)
{
OpenSerialPort();
}
if (Sp.IsOpen)
{
try
{
Byte[] Buffer = Encoding.ASCII.GetBytes(richTextBox2.Text.ToString());
Sp.Write(Buffer, 0, Buffer.Length);
}
catch(Exception ex)
{
MessageBox.Show("串口发送消息失败:"+ex.Message,"串口发送");
}
}
}
//接收数据
public string rec_auto;
//流转换为字符
public void sp_Received(Object sender, SerialDataReceivedEventArgs e)
{
try
{
Byte[] auto_rec = new Byte[Sp.BytesToRead];
string length = Sp.Read(auto_rec, 0, auto_rec.Length).ToString();
rec_auto = new UTF8Encoding().GetString(auto_rec);
richTextBox1.Text = rec_auto;
}
catch (Exception ex)
{
MessageBox.Show("串口接收消息失败:" + ex.Message, "串口接收");
}
}
}
}
版权声明:本文为qq_38208612原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。