C# 如何操作串口


1.首先要引用  System.IO.Ports

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace FrmScanProt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //APICloud  //app

        string text = "";
        SerialPort sp = new SerialPort();

        delegate void UpdateTextEventHandler(string text);  //委托,此為重點.
        UpdateTextEventHandler updateText;  //事件


        private void Form1_Load(object sender, EventArgs e)
        {
            AddParameters();


            string[] itemName = SerialPort.GetPortNames();  //獲取當前計算機串型端口名稱數組.
            cboPortName.Items.Clear();
            foreach (var item in itemName)
            {
                cboPortName.Items.Add(item);
            }

            cboPortName.SelectedIndex = 0;
            cboBaudRate.SelectedIndex = 1;
            cboDataBit.SelectedIndex = 3;
            cboParityBit.SelectedIndex = 0;
            cboStopBit.SelectedIndex = 1;

            updateText += new UpdateTextEventHandler(UpdateTextBox);    //委托方法
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //處理串口對象的數據接收事件的方法.

            sp.Close();
            lblScan.Text = "未開啟采集程序.";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (txtCode.Text != "")
            {
                listBox1.Items.Add(txtCode.Text);
                txtCode.Text = "";
                txtCode.Focus();
            }
            else { MessageBox.Show(" 條碼不能為空!"); txtCode.Focus(); }
        }

        private void btnStartScan_Click(object sender, EventArgs e)
        {
            if (!sp.IsOpen)
            {
                sp.Open();  //打開一個新的串口連接.
                lblScan.Text = "采集中...";
                txtCode.Focus();
            }
        }

        private void btnEndScan_Click(object sender, EventArgs e)
        {
            if (sp.IsOpen)
            {
                sp.Close(); //關閉一個串口連接.
                lblScan.Text = "采集結束.";
                txtCode.Focus();
            }
        }

        /// <summary>
        /// 串口名稱
        /// </summary>
        private void cboPortName_SelectedIndexChanged(object sender, EventArgs e)
        {
            sp.PortName = cboPortName.Items[cboPortName.SelectedIndex].ToString();
        }

        /// <summary>
        /// 波特率(每秒傳送字節數)
        /// </summary>
        private void cboBaudRate_SelectedIndexChanged(object sender, EventArgs e)
        {
            //獲取或設置串口波特率
            // cboBaudRate.Items.Add(sp.BaudRate);
            sp.BaudRate = Convert.ToInt32(cboBaudRate.Items[cboBaudRate.SelectedIndex].ToString());

        }
        /// <summary>
        /// 數據字節
        /// </summary>
        private void cboDataBit_SelectedIndexChanged(object sender, EventArgs e)
        {
            //設置每個字節的標准數據長度
            sp.DataBits = Convert.ToInt32(cboDataBit.Items[cboDataBit.SelectedIndex].ToString());
        }
        /// <summary>
        /// 停止位置
        /// </summary>
        private void cboStopBit_SelectedIndexChanged(object sender, EventArgs e)
        {
            //設置每個字節的標准停止位數
            sp.StopBits =(StopBits)cboStopBit.SelectedIndex;
        }
        /// <summary>
        /// 奇偶位置
        /// </summary>
        private void cboParityBit_SelectedIndexChanged(object sender, EventArgs e)
        {
            //設置奇偶校驗檢查協議
           // sp.Parity = Parity.Odd;
            sp.Parity = (Parity)System.Enum.Parse(typeof(Parity), cboParityBit.SelectedIndex.ToString());
        }
        /// <summary>
        /// 接收到的數據
        /// </summary>
        private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if(!sp.IsOpen)
            {
                MessageBox.Show("請先啟用掃描槍采集...");
                Thread.Sleep(2000);
                this.Close();
                return;
            }

            Thread.Sleep(100);
            byte[] buffer = Encoding.UTF8.GetBytes(sp.ReadExisting());
            string newString = Encoding.UTF8.GetString(buffer);

            //string readString = sp.ReadExisting();//讀取串口對象的流和輸入緩沖區所有立即可用的字節流.

            this.Invoke(updateText, new string[] { newString });   //控件基礎句柄的線程上,執行委托.
        }

        /// <summary>
        /// 獲取數據.
        /// </summary>
        private void UpdateTextBox(string text)
        {
            this.txtCode.Text = text;
            listBox1.Items.Add(txtCode.Text);
            txtCode.Text = "";
        }


        private void AddParameters()
        {
            this.cboBaudRate.Items.AddRange(new object[] { "4800", "9600", "14400", "19200", "38400", "56000", "57600", "115200", "128000" });

            this.cboDataBit.Items.AddRange(new object[] { "5", "6", "7", "8" });

            this.cboStopBit.Items.AddRange(new object[] { "0.5", "1", "1.5", "2" });

            this.cboParityBit.Items.AddRange(new object[]{"none","odd","even"});
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM