1.首先要引用 System.IO.Ports
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; using System.IO.Ports; using System.Threading; namespace FrmScanProt { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //APICloud //app string text = ""; SerialPort sp = new SerialPort(); delegate void UpdateTextEventHandler(string text); //委托,此為重點. UpdateTextEventHandler updateText; //事件 private void Form1_Load(object sender, EventArgs e) { AddParameters(); string[] itemName = SerialPort.GetPortNames(); //獲取當前計算機串型端口名稱數組. cboPortName.Items.Clear(); foreach (var item in itemName) { cboPortName.Items.Add(item); } cboPortName.SelectedIndex = 0; cboBaudRate.SelectedIndex = 1; cboDataBit.SelectedIndex = 3; cboParityBit.SelectedIndex = 0; cboStopBit.SelectedIndex = 1; updateText += new UpdateTextEventHandler(UpdateTextBox); //委托方法 sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //處理串口對象的數據接收事件的方法. sp.Close(); lblScan.Text = "未開啟采集程序."; } private void button1_Click(object sender, EventArgs e) { if (txtCode.Text != "") { listBox1.Items.Add(txtCode.Text); txtCode.Text = ""; txtCode.Focus(); } else { MessageBox.Show(" 條碼不能為空!"); txtCode.Focus(); } } private void btnStartScan_Click(object sender, EventArgs e) { if (!sp.IsOpen) { sp.Open(); //打開一個新的串口連接. lblScan.Text = "采集中..."; txtCode.Focus(); } } private void btnEndScan_Click(object sender, EventArgs e) { if (sp.IsOpen) { sp.Close(); //關閉一個串口連接. lblScan.Text = "采集結束."; txtCode.Focus(); } } /// <summary> /// 串口名稱 /// </summary> private void cboPortName_SelectedIndexChanged(object sender, EventArgs e) { sp.PortName = cboPortName.Items[cboPortName.SelectedIndex].ToString(); } /// <summary> /// 波特率(每秒傳送字節數) /// </summary> private void cboBaudRate_SelectedIndexChanged(object sender, EventArgs e) { //獲取或設置串口波特率 // cboBaudRate.Items.Add(sp.BaudRate); sp.BaudRate = Convert.ToInt32(cboBaudRate.Items[cboBaudRate.SelectedIndex].ToString()); } /// <summary> /// 數據字節 /// </summary> private void cboDataBit_SelectedIndexChanged(object sender, EventArgs e) { //設置每個字節的標准數據長度 sp.DataBits = Convert.ToInt32(cboDataBit.Items[cboDataBit.SelectedIndex].ToString()); } /// <summary> /// 停止位置 /// </summary> private void cboStopBit_SelectedIndexChanged(object sender, EventArgs e) { //設置每個字節的標准停止位數 sp.StopBits =(StopBits)cboStopBit.SelectedIndex; } /// <summary> /// 奇偶位置 /// </summary> private void cboParityBit_SelectedIndexChanged(object sender, EventArgs e) { //設置奇偶校驗檢查協議 // sp.Parity = Parity.Odd; sp.Parity = (Parity)System.Enum.Parse(typeof(Parity), cboParityBit.SelectedIndex.ToString()); } /// <summary> /// 接收到的數據 /// </summary> private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { if(!sp.IsOpen) { MessageBox.Show("請先啟用掃描槍采集..."); Thread.Sleep(2000); this.Close(); return; } Thread.Sleep(100); byte[] buffer = Encoding.UTF8.GetBytes(sp.ReadExisting()); string newString = Encoding.UTF8.GetString(buffer); //string readString = sp.ReadExisting();//讀取串口對象的流和輸入緩沖區所有立即可用的字節流. this.Invoke(updateText, new string[] { newString }); //控件基礎句柄的線程上,執行委托. } /// <summary> /// 獲取數據. /// </summary> private void UpdateTextBox(string text) { this.txtCode.Text = text; listBox1.Items.Add(txtCode.Text); txtCode.Text = ""; } private void AddParameters() { this.cboBaudRate.Items.AddRange(new object[] { "4800", "9600", "14400", "19200", "38400", "56000", "57600", "115200", "128000" }); this.cboDataBit.Items.AddRange(new object[] { "5", "6", "7", "8" }); this.cboStopBit.Items.AddRange(new object[] { "0.5", "1", "1.5", "2" }); this.cboParityBit.Items.AddRange(new object[]{"none","odd","even"}); } private void button2_Click(object sender, EventArgs e) { listBox1.Items.Clear(); } } }

