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

时间:2020-12-30 17:28:32

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

窗体代码

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;
}
}
}