[置顶] C#:通过串口读取扫描枪里的值

[置顶] C#:通过串口读取扫描枪里的值_第1张图片

窗体代码

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;

namespace COM_TEST
{
    public partial class Form1 : Form
    {
        CommBar commBar;

        bool buttonBool = false;//指示按钮是开还是关

        public Form1()
        {
            InitializeComponent();
            commBar = new CommBar();
            CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.comboBox_Com.Items.Clear();
            this.comboBox_Com.Items.Add("请选择COM口");
            string[] comNames = commBar.GetComName();
            for (int i = 0; i < comNames.Length; i++)
            {
                this.comboBox_Com.Items.Add(comNames[i]);
            }
            this.comboBox_Com.SelectedIndex = 0;
        }

        private void button_Test_Click(object sender, EventArgs e)
        {
            //关闭
            if (buttonBool)
            {
                buttonBool = false;

                commBar.Close();
                this.button_Test.Text = "点击测试";
            }
                //开始
            else if (!buttonBool)
            {
                buttonBool = true;
                this.button_Test.Text = "正在测试……";

                //注册一该串口
                commBar.SerialPortValue(this.comboBox_Com.Text, Convert.ToInt32(this.comboBox_comPl.Text));
                //打开串口
                if (commBar.Open())
                    //关联事件处理程序
                    commBar.serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
            }
        }

        //用来为文本框赋值
        private void CodeText(CommBar commBar)
        {
            this.textBox_TestTxt.Text = "";
            this.textBox_TestTxt.Text = commBar.Code;
        }

        //委托,指向CodeText方法
        private delegate void ModifyButton_dg(CommBar commBar);

        //串口接收接收事件处理程序
        //每当串口讲到数据后激发
        void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
            byte[] m_recvBytes = new byte[commBar.serialPort.BytesToRead];//定义缓冲区大小
            int result = commBar.serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//从串口读取数据
            if (result <= 0)
                return;
            commBar.Code = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//对数据进行转换
            this.Invoke(new ModifyButton_dg(CodeText), commBar);//调用委托,将值传给文本框
            commBar.serialPort.DiscardInBuffer();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            commBar.Close();
            commBar.serialPort.Dispose();
        }
    }
}

扫描枪工作类代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace COM_TEST
{
    /// <summary>
    /// 扫描枪工作类
    /// </summary>
    class CommBar
    {
        //串口引用
        public SerialPort serialPort;

        //存储转换的数据值
        public string Code { get; set; }

        public CommBar()
        {
            serialPort = new SerialPort();
        }

        //串口状态
        public bool IsOpen
        {
            get
            {
                return serialPort.IsOpen;
            }
        }

        //打开串口
        public bool Open()
        {
            if (serialPort.IsOpen)
            {
                Close();
            }
            serialPort.Open();
            if (serialPort.IsOpen)
            {
                return true;
            }
            else
            {
                MessageBox.Show("串口打开失败!");
                return false;
            }
        }

        //关闭串口
        public void Close()
        {
            serialPort.Close();
        }

        //定入数据,这里没有用到
        public void WritePort(byte[] send, int offSet, int count)
        {
            if (IsOpen)
            {
                serialPort.Write(send, offSet, count);
            }
        }

        //获取可用串口
        public string[] GetComName()
        {
            string[] names = null;
            try
            {
                names = SerialPort.GetPortNames(); // 获取所有可用串口的名字
            }
            catch (Exception)
            {
                System.Windows.Forms.MessageBox.Show("找不到串口");
            }
            return names;
        }

        //注册一个串口
        public void SerialPortValue(string portName, int baudRate)
        {
            //串口名
            serialPort.PortName = portName;
            //波特率
            serialPort.BaudRate = baudRate;
            //数据位
            serialPort.DataBits = 8;
            //两个停止位
            serialPort.StopBits = System.IO.Ports.StopBits.One;
            //无奇偶校验位
            serialPort.Parity = System.IO.Ports.Parity.None;
            serialPort.ReadTimeout = 100;
            //commBar.serialPort.WriteTimeout = -1;
        }
    }
}

你可能感兴趣的:(C#,串口,SerialPort,扫描枪)