C#实现扫码枪串口通信(实例化serialPort方式)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class frm_SerianTest : Form { /// <summary> /// frm_SerianTest构造函数 /// </summary> public frm_SerianTest() { InitializeComponent();//部件初始化 } private SerialPort SerialPort_0 = new SerialPort();//实例化串口设备 //private Encoding Encoding_0 = Encoding.Default;//选用默认编码模式 /// <summary> /// 定时器事件:实现系统时间获取 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer1_Tick(object sender, EventArgs e) { //实现系统时间显示 Lbl_SysTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); } /// <summary> /// 窗口加载事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frm_SerianTest_Load(object sender, EventArgs e) { timer1.Interval = 1000;//时间间隔1000 单位:ms timer1.Start();//启用间隔时间事件 timer1.Tick += timer1_Tick; //获取可用端口号 string[] Ports = SerialPort.GetPortNames(); if (Ports.Length>0)//获取数组长度大于0 { cmb_Port.DataSource = Ports;//获取到的端口号赋值给Cmb_Port } //波特率设置 int[] Bauds = { 1200, 2400, 4800, 9600, 12800, 115200 }; cmb_BaudRate.DataSource = Bauds; cmb_BaudRate.SelectedIndex = 3;//开机默认9600 //校验位设置(typeof:可以取得变量的类型,或者表达式的类型) cmb_ParityBit.DataSource = Enum.GetNames(typeof(Parity));//获取Parity枚举的各名称; //数据位设置 int[] DataBits = { 5, 6, 7, 8 }; cmb_DateBit.DataSource = DataBits; cmb_DateBit.SelectedIndex = 3; //停止位设置 cmb_StopBit.DataSource = Enum.GetNames(typeof(StopBits));//获取Parity枚举的各名称; cmb_StopBit.SelectedIndex = 1; } /// <summary> /// 刷新可用端口事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Refresh_Click(object sender, EventArgs e) { string[] Ports = SerialPort.GetPortNames();//获取电脑中可用的端口 if (Ports.Length > 0) { cmb_Port.DataSource = Ports; } } /// <summary> /// 与虚拟串口设备建立连接事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_ConnectReader_Click(object sender, EventArgs e) { if (btn_ConnectReader.Text == "连接") { if (SerialPort_0.IsOpen)//如果已经建立连接则先断开 { SerialPort_0.Close(); } try //(*Trim()是去空格*) { SerialPort_0.PortName = cmb_Port.Text.Trim(); SerialPort_0.BaudRate = Convert.ToInt32(cmb_BaudRate.Text.Trim()); SerialPort_0.DataBits = Convert.ToInt32(cmb_DateBit.Text.Trim()); SerialPort_0.Parity = (Parity)Enum.Parse(typeof(Parity), cmb_ParityBit.Text.Trim(), true);//将comboBox中的字符串转换为Parity枚举类型 SerialPort_0.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmb_StopBit.Text.Trim(), true);//将comboBox中的字符串转换为StopBits枚举类型 SerialPort_0.Encoding = Encoding.Default;//选用默认编码方式 SerialPort_0.ReceivedBytesThreshold = 1;//默认缓存区为1个字节 SerialPort_0.DataReceived += SerialPort_0_DataReceived; SerialPort_0.Open();//打开连接 //MessageBox.Show("连接成功"); Log("连接成功!" ); //禁用众多通信参数配置选项 btn_Refresh.Enabled = false; btn_ConnectReader.Text = "断开"; cmb_Port.Enabled = false; cmb_BaudRate.Enabled = false; cmb_DateBit.Enabled = false; cmb_StopBit.Enabled = false; cmb_ParityBit.Enabled = false; } catch (Exception ex) { //MessageBox.Show("连接失败"+ex.Message); Log("连接失败!" + ex.Message); } } else if (btn_ConnectReader.Text == "断开") { SerialPort_0.Close(); //MessageBox.Show("断开成功"); Log("已断开!"); //启用通信参数配置项 btn_Refresh.Enabled = true; btn_ConnectReader.Text = "连接"; cmb_Port.Enabled = true; cmb_BaudRate.Enabled = true; cmb_DateBit.Enabled = true; cmb_StopBit.Enabled = true; cmb_ParityBit.Enabled = true; } } private void SerialPort_0_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { //因为要访问UI资源,所以需要使用invoke方式同步ui this.Invoke((EventHandler)(delegate { string result = string.Empty; result = SerialPort_0.ReadExisting(); Log("扫码结果:" + result); }) ); } catch (Exception ex) { //响铃并显示异常给用户 //System.Media.SystemSounds.Beep.Play(); Log(ex.Message); } } //通过ListView将信息显示 private void Log(string info) { Invoke(new Action(() => { string time = DateTime.Now.ToString(); ListViewItem Lst = new ListViewItem(time); Lst.SubItems.Add(info); listView1.Items.Insert(0, Lst); })); } private void btn_ManulCode_Click(object sender, EventArgs e) { if (tbox_ManulCode.Text==string.Empty) { Log("条码信息不能为空!"); } else { Log("手动输入条码结果:" + tbox_ManulCode.Text); tbox_ManulCode.Text = ""; } } private void btn_Send_Click(object sender, EventArgs e) { if (SerialPort_0.IsOpen) { if (tbox_SendData.Text != string.Empty) { try { SerialPort_0.Write(tbox_SendData.Text.Trim()); } catch (Exception ex) { Log("发送失败," + ex); } Log("发送内容:" + tbox_SendData.Text); } else { Log("没有发送内容!"); } } else { Log("串口未打开!"); } } } }