基本信息
源码名称:串口通信示例
源码大小: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);
}
}
}
}
}