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; using System.Threading.Tasks; using System.Windows.Forms; namespace Honeywell1900扫码枪程序触发 { public partial class Form1 : Form { SerialPort serialPort1 = new SerialPort(); delegate void myDelegate(); //委托,此为重点. public Form1() { InitializeComponent(); } private void button3_Click(object sender, EventArgs e) { serialPort1 = new SerialPort(); serialPort1.PortName = comboBox1.Text; try { serialPort1.Open(); serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived); } catch (Exception ex) { label3.ForeColor = Color.Red; label3.Text = "打开串口出错"; //MessageBox.Show("打开串口出错"); } label3.ForeColor = Color.Green; label3.Text = "串口已打开"; } private void button4_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); label3.ForeColor = Color.Green; label3.Text = "关闭串口成功"; return; } label3.ForeColor = Color.Black; label3.Text = "关闭串口成功"; } private void button1_Click(object sender, EventArgs e) { Byte[] BSendTemp = HexStringToBytes("16 54 0D"); serialPort1.Write(BSendTemp,0,BSendTemp.Length);//发送数据 } private void button2_Click(object sender, EventArgs e) { Byte[] BSendTemp = HexStringToBytes("16 55 0D"); this.serialPort1.Write(BSendTemp, 0, BSendTemp.Length);//发送数据 } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { textBox1.BeginInvoke(new myDelegate(updateTextBox)); } public void updateTextBox() { int len = serialPort1.BytesToRead; byte[] sbytes = new byte[len]; serialPort1.Read(sbytes, 0, len); textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.000")+"扫到码如下:\r\n"+Encoding.UTF8.GetString(sbytes); } public static byte[] HexStringToBytes(string hs) { string[] strArr = hs.Trim().Split(' '); byte[] b = new byte[strArr.Length]; //逐个字符变为16进制字节数据 for (int i = 0; i < strArr.Length; i++) { b[i] = Convert.ToByte(strArr[i], 16); } //按照指定编码将字节数组变为字符串 return b; } private string receive_data = ""; private void button6_Click(object sender, EventArgs e) { receive_data = "34"; } private void button5_Click(object sender, EventArgs e) { Task.Factory.StartNew(()=> { bool ret = TimeoutGetValue(ref receive_data, 4000); if (ret) { System.Diagnostics.Trace.WriteLine(ret+ receive_data); receive_data = ""; } else { System.Diagnostics.Trace.WriteLine("获取超时"); } }); } /// /// 用来获取data变量的值,并设置超时时间 /// /// ref 传递变量 /// 超时时间 /// private bool TimeoutGetValue(ref string data,int timeout) { int i_count = 0; int all_count = timeout / 200; while (data.Equals("") && i_count