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;
using System.IO.Ports;
using System.Threading.Tasks;
namespace ComPortApp
{
public partial class FrmMain : Form
{private List<byte> buffer = new List<byte>();
public FrmMain()
{
InitializeComponent();
BindPortName();
this.tsbtnRead.Click += new EventHandler(tsbtnRead_Click);
this.tsbtnStop.Click += new EventHandler(tsbtnStop_Click);
this.tsbtnSend.Click += new EventHandler(tsbtnSend_Click);
this.tstxtPort.Text = "9600";
}
void tsbtnSend_Click(object sender, EventArgs e)
{
var text = this.rtxtSend.Text.Trim();
var bytes = StringToBytes(text);
if (bytes == null)
{
WritePortData(bytes);
}
//WritePortData(text);
}
void tsbtnStop_Click(object sender, EventArgs e)
{
if (serialPort != null)
{
serialPort.Close();
}
BtnReadEnabled(true);
}
private SerialPort serialPort;
void tsbtnRead_Click(object sender, EventArgs e)
{
if (serialPort != null)
{
serialPort.Close();
}
if (this.tscbxName.SelectedItem == null || string.IsNullOrEmpty(this.tscbxName.SelectedItem.ToString()))
{
MessageBox.Show("请选择串口!");
return;
}
var name = this.tscbxName.SelectedItem.ToString();
if (string.IsNullOrEmpty(name))
{
MessageBox.Show("串口名称不能为空!");
return;
}
int baudRate = 0;
string sBaudRate = this.tstxtPort.Text.Trim();
if (!int.TryParse(sBaudRate, out baudRate))
{
MessageBox.Show("波特率填写错误!");
return;
}
BtnReadEnabled(false);
BeginReadCom(name, baudRate);
}
private void WritePortData(byte[] bytes)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Write(bytes, 0, bytes.Length);
}
}
public void WritePortData(string text)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Write(text);
}
}
private void BeginReadCom(string name, int baudRate)
{
Task task = new Task(() =>
{
serialPort = new SerialPort() { PortName = name, BaudRate = baudRate };
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
try
{
serialPort.Close();
System.Threading.Thread.Sleep(2000);
serialPort.Open();
SetData("打开端口成功!\r\n");
}
catch (Exception ex)
{
SetData(string.Format("打开端口失败!{0}\r\n", ex.Message));
}
});
task.ContinueWith((t) =>
{
if (t.Exception != null)
{
SetData("\r\n" + t.Exception.Message);
}
});
task.Start();
}
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//开始读取相应的数据
SerialPort sp = sender as SerialPort;
//获取可读取数据长度
if (sp.BytesToRead > 0)
{
//读取数据
var readBytes = new byte[sp.BytesToRead];
sp.Read(readBytes, 0, readBytes.Length);
buffer.AddRange(readBytes);
SetData(Program.ToHexString(readBytes));
byte[] remainingBytes = null;
var parser = new TempParser();
parser.NewRequestArrive += new EventHandler<PacketRequest<BSurgarPacket>>(parser_NewRequestArrive);
parser.ParsePacket(buffer.ToArray(), ref remainingBytes);
buffer = new List<byte>(remainingBytes);
}
}
private int index = 1;
void parser_NewRequestArrive(object sender, PacketRequest<BSurgarPacket> e)
{
ShowParseResult(string.Format("记录数:{0},{1}\r\n", index, e.Packet.ToString()));
index++;
}
private void ProcessData()
{
}
private void SetData(string data)
{
if (this.rtxtData.InvokeRequired)
{
this.Invoke((MethodInvoker)(() =>
{
this.rtxtData.Text += data.ToString();
}));
}
else
{
this.rtxtData.Text += data.ToString();
}
}
private void BtnReadEnabled(bool isEnabled)
{
if (this.toolStrip1.InvokeRequired)
{
this.toolStrip1.Invoke((MethodInvoker)(() =>
{
this.tsbtnRead.Enabled = isEnabled;
}));
}
else
{
this.tsbtnRead.Enabled = isEnabled;
}
}
private void ShowParseResult(string result)
{
if (this.rtxtPacket.InvokeRequired)
{
this.rtxtPacket.Invoke((MethodInvoker)(() =>
{
this.rtxtPacket.Text += result;
}));
}
else
{
this.rtxtPacket.Text += result;
}
}
public void BindPortName()
{
var names = SerialPort.GetPortNames();
if (names == null || names.Length <= 0)
{
return;
}
foreach (var n in names)
{
this.tscbxName.Items.Add(n);
}
this.tscbxName.SelectedItem = this.tscbxName.Items[0];
}
public byte[] StringToBytes(string text)
{
if (string.IsNullOrEmpty(text))
{
return null;
}
string[] sBytes = text.Split(' ');
List<byte> list = new List<byte>();
try
{
foreach (var b in sBytes)
{
list.Add(Convert.ToByte(b, 16));
}
return list.ToArray();
}
catch (Exception ex)
{
Console.Write(ex.Message);
return null;
}
}
}
}
简单的串口通信,凑合着看吧