基本信息
源码名称:串口通信示例
源码大小:0.01M
文件格式:.rar
开发语言:C#
更新时间:2019-03-13
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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.IO; using System.Text.RegularExpressions; namespace SerialPortDemo { public partial class Form1 : Form { private SerialPort spCom = new SerialPort(); private StringBuilder strBuilderRx = new StringBuilder(); private Timer timerAutoSend = new Timer(); private long nCountRx = 0; private long nCountTx = 0; private string strFn; public Form1() { InitializeComponent(); } private void SerialPortForm_Load(object sender, EventArgs e) { string[] straPorts = SerialPort.GetPortNames(); Array.Sort(straPorts); comboPortName.Items.AddRange(straPorts); comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1; comboBaudRate.SelectedIndex = comboBaudRate.Items.IndexOf("9600"); comboParity.SelectedIndex = comboParity.Items.IndexOf("None"); comboDataBits.SelectedIndex = comboDataBits.Items.IndexOf("8"); comboStopBits.SelectedIndex = comboStopBits.Items.IndexOf("1"); spCom.NewLine = "\r\n"; spCom.RtsEnable = true; buttonSend.Enabled = false; checkBoxAutoSend.Enabled = false; checkBoxNewLineRx.CheckState = CheckState.Checked; buttonSendFile.Enabled = false; comboPortName.Enabled = true; comboBaudRate.Enabled = true; comboParity.Enabled = true; comboDataBits.Enabled = true; comboStopBits.Enabled = true; textBoxTx.Text = "COM"; textBoxTimerMs.Text = "1000"; spCom.DataReceived = new SerialDataReceivedEventHandler(Com_DataReceived); timerAutoSend.Tick = new EventHandler(AutoSendTimer_Tick); } void AutoSendTimer_Tick(object sender, EventArgs e) { buttonSend_Click(sender, e); } void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) { int nReadSum = spCom.BytesToRead; nCountRx = nReadSum; byte[] byteaBuf = new byte[nReadSum]; spCom.Read(byteaBuf, 0, nReadSum); strBuilderRx.Clear(); //因为要访问ui资源,所以需要使用invoke方式同步ui this.Invoke((EventHandler)(delegate { if (checkBoxHexView.Checked) { foreach (byte byteBit in byteaBuf) { strBuilderRx.Append(byteBit.ToString("X2") " "); } } else { strBuilderRx.Append(Encoding.ASCII.GetString(byteaBuf)); } this.textBoxRx.AppendText(strBuilderRx.ToString()); labelSumRx.Text = "Get:" nCountRx.ToString(); })); } private void buttonOpen_Click(object sender, EventArgs e) { if (spCom.IsOpen) { spCom.Close(); } else { spCom.PortName = comboPortName.Text; spCom.BaudRate = int.Parse(comboBaudRate.Text); switch (comboParity.Text) { case "None": spCom.Parity = Parity.None; break; case "Odd": spCom.Parity = Parity.Odd; break; case "Even": spCom.Parity = Parity.Even; break; case "Mark": spCom.Parity = Parity.Mark; break; case "Space": spCom.Parity = Parity.Space; break; default: spCom.Parity = Parity.None; break; } spCom.DataBits = int.Parse(comboDataBits.Text); switch (comboStopBits.Text) { case "1": spCom.StopBits = StopBits.One; break; case "1.5": spCom.StopBits = StopBits.OnePointFive; break; case "2": spCom.StopBits = StopBits.Two; break; default: spCom.StopBits = StopBits.One; break; } try { spCom.Open(); } catch (System.Exception ex) { spCom = new SerialPort(); MessageBox.Show(ex.Message); } } buttonOpen.Text = spCom.IsOpen ? "Close" : "Open"; buttonSend.Enabled = spCom.IsOpen; checkBoxAutoSend.Enabled = spCom.IsOpen; buttonSendFile.Enabled = spCom.IsOpen; comboPortName.Enabled = !spCom.IsOpen; comboBaudRate.Enabled = !spCom.IsOpen; comboParity.Enabled = !spCom.IsOpen; comboDataBits.Enabled = !spCom.IsOpen; comboStopBits.Enabled = !spCom.IsOpen; } private void checkBoxNewLineRx_CheckedChanged(object sender, EventArgs e) { textBoxRx.WordWrap = checkBoxNewLineRx.Checked; } private void buttonSend_Click(object sender, EventArgs e) { int nSendSum = 0; if (checkBoxHexSend.Checked) { MatchCollection mc = Regex.Matches(textBoxTx.Text, @"(?i)[\da-f]{2}"); List<byte> buf = new List<byte>(); foreach (Match m in mc) { buf.Add(byte.Parse(m.Value)); } spCom.Write(buf.ToArray(), 0, buf.Count); nSendSum = buf.Count; } else { if (checkBoxNewLineTx.Checked) { spCom.WriteLine(textBoxTx.Text); nSendSum = textBoxTx.Text.Length 2; } else { spCom.Write(textBoxTx.Text); nSendSum = textBoxTx.Text.Length; } } nCountTx = nSendSum; labelSumTx.Text = "Send:" nCountTx.ToString(); } private void buttonReset_Click(object sender, EventArgs e) { nCountTx = nCountRx = 0; labelSumRx.Text = "Get:0"; labelSumTx.Text = "Send:0"; checkBoxHexView.CheckState = CheckState.Unchecked; checkBoxNewLineRx.CheckState = CheckState.Checked; checkBoxHexSend.CheckState = CheckState.Unchecked; checkBoxNewLineTx.CheckState = CheckState.Unchecked; checkBoxAutoSend.CheckState = CheckState.Unchecked; textBoxRx.Clear(); textBoxTx.Clear(); } private void buttonZeroCount_Click(object sender, EventArgs e) { nCountTx = nCountRx = 0; labelSumTx.Text = "Send:" nCountTx.ToString(); labelSumRx.Text = "Get:" nCountRx.ToString(); } private void buttonClearRx_Click(object sender, EventArgs e) { textBoxRx.Clear(); } private void AutoSend(object sender, EventArgs e) { if (checkBoxAutoSend.Checked == true) { timerAutoSend.Interval = Convert.ToInt32(textBoxTimerMs.Text, 10); timerAutoSend.Start(); } else { timerAutoSend.Stop(); } } private void Timer_ms_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8) { e.Handled = true; } } private void buttonSaveRx_Click(object sender, EventArgs e) { if (dlgSaveFile.ShowDialog() == DialogResult.OK) { strFn = dlgSaveFile.FileName; try { File.WriteAllText(strFn, textBoxRx.Text); } catch (System.Exception ex) { MessageBox.Show(ex.Message, "SerialPort Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } private void buttonClearTx_Click(object sender, EventArgs e) { textBoxTx.Clear(); } private void buttonSendFile_Click(object sender, EventArgs e) { if (dlgOpenFile.ShowDialog() == DialogResult.OK) { strFn = dlgOpenFile.FileName; try { spCom.Write(File.ReadAllText(strFn)); nCountTx = File.ReadAllText(strFn).Length; labelSumTx.Text = "Send:" nCountTx.ToString(); } catch (System.Exception ex) { MessageBox.Show(ex.Message, "SerialPort Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } } }