串口编程

SerialPort建立通讯过程

  1. 引入API:System.IO.Ports;
  2. 创建SerialPort对象
  3. 设置串口参数
    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版权协议,转载请附上原文出处链接和本声明。