C# 编写串口程序

来源:互联网 发布:孔明棋算法 编辑:程序博客网 时间:2024/05/22 10:42

       最近参考百度《C#编写串口程序》的pdf做了一个串口调试工具,以此为模版用于开发更复杂的上位机软件,PDF中叙述很完整。需要了解编写过程的请认真看资料。


下面阐述一下几点:

(1)需要调用serialPort类         https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx

      示例代码:

public static void Main(){    string name;    string message;    StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;    Thread readThread = new Thread(Read);    // Create a new SerialPort object with default settings.    _serialPort = new SerialPort();    // Allow the user to set the appropriate properties.    _serialPort.PortName = SetPortName(_serialPort.PortName);    _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);    _serialPort.Parity = SetPortParity(_serialPort.Parity);    _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);    _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);    _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);    // Set the read/write timeouts    _serialPort.ReadTimeout = 500;    _serialPort.WriteTimeout = 500;    _serialPort.Open();    _continue = true;    readThread.Start();    Console.Write("Name: ");    name = Console.ReadLine();    Console.WriteLine("Type QUIT to exit");    while (_continue)    {        message = Console.ReadLine();        if (stringComparer.Equals("quit", message))        {            _continue = false;        }        else        {            _serialPort.WriteLine(                String.Format("<{0}>: {1}", name, message));        }    }    readThread.Join();    _serialPort.Close();}public static void Read(){    while (_continue)    {        try        {            string message = _serialPort.ReadLine();            Console.WriteLine(message);        }        catch (TimeoutException) { }    }}
(2)serialDataReceivedEventHandler委托:https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived(v=vs.110).aspx#示例

用来处理接受的数据。

using System;using System.IO.Ports;class PortDataReceived{    public static void Main()    {        SerialPort mySerialPort = new SerialPort("COM1");        mySerialPort.BaudRate = 9600;        mySerialPort.Parity = Parity.None;        mySerialPort.StopBits = StopBits.One;        mySerialPort.DataBits = 8;        mySerialPort.Handshake = Handshake.None;        mySerialPort.RtsEnable = true;        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);        mySerialPort.Open();        Console.WriteLine("Press any key to continue...");        Console.WriteLine();        Console.ReadKey();        mySerialPort.Close();    }    private static void DataReceivedHandler(                        object sender,                        SerialDataReceivedEventArgs e)    {        SerialPort sp = (SerialPort)sender;        string indata = sp.ReadExisting();        Console.WriteLine("Data Received:");        Console.Write(indata);    }}

(3)try   catch

try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。


下面是项目的完整代码:

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 串口配置工具{    public partial class FormMain : Form    {        SerialPort sp = null;//声明串口类        bool isOpen = false;//打开串口标志位        bool isSetProperty = false;//属性设置标志位        bool isHex = false;//十六进制显示标志位        public FormMain()        {            InitializeComponent();        }        //初始化配置        private void FormMain_Load(object sender, EventArgs e)        {            this.MaximumSize = this.Size;            this.MinimumSize = this.Size;            this.MaximizeBox = false;//禁止用最大化            int i;            for (i = 0; i < 15; i++)//最大支持到串口15,根据需求添加            {                cbxCOMPort.Items.Add("COM" + (i + 1).ToString());            }            cbxCOMPort.SelectedIndex = 0;            //列出常用的波特率            cbxBaudRate.Items.Add("1200");            cbxBaudRate.Items.Add("2400");            cbxBaudRate.Items.Add("4800");            cbxBaudRate.Items.Add("9600");            cbxBaudRate.Items.Add("19200");            cbxBaudRate.Items.Add("38400");            cbxBaudRate.Items.Add("43000");            cbxBaudRate.Items.Add("56000");            cbxBaudRate.Items.Add("57600");            cbxBaudRate.Items.Add("115200");            cbxBaudRate.SelectedIndex = 3;            //列出停止位            cbxStopBits.Items.Add("0");            cbxStopBits.Items.Add("1");            cbxStopBits.Items.Add("1.5");            cbxStopBits.Items.Add("2");            cbxStopBits.SelectedIndex = 1;            //列出奇偶校验位            cbxParity.Items.Add("无");            cbxParity.Items.Add("奇校验");            cbxParity.Items.Add("偶校验");            cbxParity.SelectedIndex = 0;            //列出数据位            cbxDataBits.Items.Add("8");            cbxDataBits.Items.Add("7");            cbxDataBits.Items.Add("6");            cbxDataBits.Items.Add("5");            cbxDataBits.SelectedIndex = 0;            //默认显示char            rbnChar.Checked = true;        }        //串口检测        private void btnCheckCOM_Click(object sender, EventArgs e)//检测那些串口可用        {            bool comExistence = false;//有可用串口标志位            cbxCOMPort.Items.Clear();                        for (int i = 0; i < 15; i++)            {                try                {                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());                    sp.Open();                    sp.Close();                    cbxCOMPort.Items.Add("COM" + (i + 1).ToString());                    comExistence = true;                }                catch (Exception)                {                    continue;                }            }            if (comExistence)            {                cbxCOMPort.SelectedIndex = 0;            }            else            {                MessageBox.Show("没有找到串口!", "错误提示");            }        }               /////////私有函数        /*        检测串口是否设置        */        private bool CheckPortSetting()        {                        if (cbxCOMPort.Text.Trim() == "") return false;            if (cbxBaudRate.Text.Trim() == "") return false;            if (cbxDataBits.Text.Trim() == "") return false;            if (cbxParity.Text.Trim() == "") return false;            if (cbxStopBits.Text.Trim() == "") return false;            return true;        }        /////////私有函数        /*        检测发送数据        */        private bool CheckSendData()        {            if (cbxCOMPort.Text.Trim() == "") return false;            return true;        }        /////////私有函数        /*       设置串口的属性        */        private void SetPortProperty()        {            sp = new SerialPort();            sp.PortName = cbxCOMPort.Text.Trim();//串口名称            sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());//波特率            float f = Convert.ToSingle(cbxStopBits.Text.Trim());//设置停止位            if (f == 0)            {                sp.StopBits = StopBits.None;            }            else if (f == 1.5)            {                sp.StopBits = StopBits.OnePointFive;            }            else if (f == 1)            {                sp.StopBits = StopBits.One;            }            else if (f == 2)            {                sp.StopBits = StopBits.Two;            }            else            {                sp.StopBits = StopBits.One;            }            sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim());//设置数据位            string s = cbxParity.Text.Trim();//设置奇偶位            if (s == "无")            {                sp.Parity = Parity.None;            }            else if (s == "奇校验")            {                sp.Parity = Parity.Odd;            }            else if (s == "偶校验")            {                sp.Parity = Parity.Even;            }            else            {                sp.Parity = Parity.None;            }            sp.ReadTimeout = -1;//设置超时读取函数            sp.RtsEnable = true;            //定义 DataReceive 事件            sp.ReceivedBytesThreshold = 1;            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);//该方法加载就运行,            if (rbnHex.Checked)            {                                isHex = true;            }            else            {                isHex = false;            }        }        private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            System.Threading.Thread.Sleep(100);//延时100ms等待数据接收            this.Invoke((EventHandler)(delegate            {                if (isHex == false)                {                    tbxRecvData.Text += sp.ReadLine();                }                else                {                    Byte[] ReceivedData = new Byte[sp.BytesToRead];//创建接受的数组                    sp.Read(ReceivedData, 0, ReceivedData.Length);                    String RecvDataText = null;                    for (int i = 0; i < ReceivedData.Length - 1; i++)                    {                        RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + " ");                    }                    tbxRecvData.Text += RecvDataText;                }                sp.DiscardInBuffer();            }));        }        //打开串口        private void btnOpenCOM_Click(object sender, EventArgs e)        {            if (isOpen == false)            {                if (!CheckPortSetting())                {                    MessageBox.Show("串口未设置!", "错误提示");                    return;                }                if (!isSetProperty)                {                    SetPortProperty();                    isSetProperty = true;                }                try                {                    sp.Open();                    isOpen = true;                    btnCheckCOM.Text = "关闭串口";                    cbxCOMPort.Enabled = false;                    cbxBaudRate.Enabled = false;                    cbxDataBits.Enabled = false;                    cbxParity.Enabled = false;                    cbxStopBits.Enabled = false;                    rbnChar.Enabled = false;                    rbnHex.Enabled = false;                   }                catch (Exception)                {                    isSetProperty = false;                    isOpen = false;                    MessageBox.Show("串口无效或已被占用!", "错误提示");                }            }            else            {                try                {                    sp.Close();                    isOpen = false;                    isSetProperty = false;                    btnCheckCOM.Text = "打开串口";                    cbxCOMPort.Enabled = true;                    cbxBaudRate.Enabled = true;                    cbxDataBits.Enabled = true;                    cbxParity.Enabled = true;                    cbxStopBits.Enabled = true;                    rbnChar.Enabled = true;                    rbnHex.Enabled = true;                }                catch (Exception)                {                    MessageBox.Show("关闭时发生错误!", "错误提示");                }            }        }        //发送数据        private void btnSend_Click(object sender, EventArgs e)        {            if (isOpen)            {                try                {                    sp.WriteLine(tbxSendData.Text);                    //MessageBox.Show("发送完成!", "错误提示");                }                catch (Exception)                {                    MessageBox.Show("发送数据时发送错误!", "错误提示");                    return;                }            }            else            {                MessageBox.Show("串口尚未打开!", "错误提示");                return;            }            if (!CheckSendData())            {                MessageBox.Show("请输入要发送的数据!", "错误提示");                return;            }        }        //清楚缓冲区        private void btnCleanData_Click(object sender, EventArgs e)        {            tbxRecvData.Text = "";            tbxSendData.Text = "";        }     }}

源代码下载链接:

链接:http://pan.baidu.com/s/1o8iM0qQ 密码:tbii


原创粉丝点击