Form1
Form1,commBar代码:
using COM_TEST; 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; namespace 串口 { 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 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(); } private void button_Test_Click_1(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); // } } } } }
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; } } }
原文:https://www.cnblogs.com/Maxs/p/10944958.html