文檔:SerialPort 類 (System.IO.Ports) | Microsoft Learn
頁面展示:
代碼:
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; using Timer = System.Windows.Forms.Timer; namespace MyModbusTool { public partial class FormModnus2 : Form { //串口類對象 private SerialPort serial; //計時器 private Timer timer; private Thread reavThread; public FormModnus2() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false;//跨線程檢測關閉 InitUI(); //初始化 serial = new SerialPort(); timer = new Timer(); timer.Tick += Timer_Tick; } /// <summary> /// 通過線程方式去接收數據 /// </summary> public void StarreavThread() { reavThread = new Thread(() => { while (true) { try { //阻塞線程,先讀一個字節 //沒有數據就會阻塞,直到有數據纔會執行 int first = serial.ReadByte(); int len = serial.BytesToRead;//獲取剩下緩衝區中數據的字節數。 byte[] left = new byte[len]; int nRead = serial.Read(left, 0, len); //合併數據到 data byte[] data= new byte[1+len]; data[0] = (byte)first; for(int i=0;i<len;i++) { data[1 + i] = left[i]; } //獲取原有的內容 String strText = tbxJS.Text; String content = Encoding.GetEncoding("GB2312").GetString(data); String time = DateTime.Now.ToString("HH:mm:ss.fff:"); tbxJS.Text = strText + "\r\n" + time + content; } catch (Exception e) { break; } } }); reavThread.Start(); } #region 初始化UI /// <summary> /// 初始化UI /// </summary> public void InitUI() { //獲取本機的所有的串口名稱 string[] _porNames = SerialPort.GetPortNames(); foreach (string _porName in _porNames) { this.cbxCKMC.Items.Add(_porName); } this.cbxCKMC.SelectedIndex = 0;//默認選中第一個 //設置波特率 string[] baudRates = { "9600", "14400", "19200", "38400", "57600", "115200" }; foreach (string baudRate in baudRates) { this.cbxBTL.Items.Add(baudRate); } this.cbxBTL.SelectedIndex = 0; //數據位 string[] dataBits = { "8", "7", "6", "5", }; foreach (string s in dataBits) { this.cbxSJW.Items.Add(s); } this.cbxSJW.SelectedIndex = 0; //奇偶校驗 Parity[] parities = { Parity.None, Parity.Odd, Parity.Even, Parity.Mark, Parity.Space }; foreach (Parity s in parities) { this.cbxJOJY.Items.Add(s); } this.cbxJOJY.SelectedIndex = 0; //停止位 StopBits[] stopBits = { /*StopBits.None, */StopBits.One, StopBits.Two, StopBits.OnePointFive }; foreach (StopBits s in stopBits) { this.cbxTZW.Items.Add(s); } this.cbxTZW.SelectedIndex = 0; } #endregion #region 打開串口 /// <summary> /// 打開串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDKCK_Click(object sender, EventArgs e) { try { if (btnDKCK.Text == "打開串口") { string _cbxCKMC = this.cbxCKMC.SelectedItem.ToString();//窗口名稱 string _cbxBTL = this.cbxBTL.SelectedItem.ToString();//波特率 string _cbxSJW = this.cbxSJW.SelectedItem.ToString();//數據位 string _cbxJOJY = this.cbxJOJY.SelectedItem.ToString();//奇偶校驗 string _cbxTZW = cbxTZW.SelectedItem.ToString();//停止位 serial.PortName = _cbxCKMC; serial.BaudRate = Convert.ToInt32(_cbxBTL); serial.DataBits = Convert.ToInt32(_cbxSJW); serial.Parity = (Parity)Enum.Parse(typeof(Parity), _cbxJOJY); serial.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _cbxTZW); serial.Open(); StarreavThread(); groupBox1.Enabled = false; btnDKCK.Text = "關閉串口"; } else { serial.Close(); groupBox1.Enabled = true; btnDKCK.Text = "打開串口"; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion /// <summary> /// 發送 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void butFS_Click(object sender, EventArgs e) { if (serial.IsOpen) { String StrMsg = tbxFS.Text; byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(StrMsg); serial.Write(bytes, 0, bytes.Length); } } /// <summary> /// 自動發送 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBox1_CheckStateChanged(object sender, EventArgs e) { try { //如果勾選 if (checkBox1.Checked) { int intervaar = Convert.ToInt32(tbxFSJG.Text);//獲取間隔時間 timer.Interval = intervaar; timer.Start();//開始執行 } else { timer.Stop(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// <summary> /// 定時器響應事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Timer_Tick(object sender, EventArgs e) { butFS_Click(null, null); } /// <summary> /// 窗體關閉 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FormModnus_FormClosed(object sender, FormClosedEventArgs e) { if (serial.IsOpen) { serial.Close(); } } } }