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.Threading;
using System.Collections;
namespace SerialTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitInfo();
}
DataTable tableOfSource;
private void InitInfo()
{
Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
foreach (string portName in pc.Ports.SerialPortNames)
{
this.portNames.Items.Add(portName);
}
if (this.portNames.Items.Count > 0)
{
this.portNames.SelectedIndex = 0;
}
this.rate.Items.Add("2400");
this.rate.Items.Add("4800");
this.rate.Items.Add("9600");
this.rate.Items.Add("19200");
this.rate.SelectedIndex = 2;
tableOfSource = new DataTable("Source");
tableOfSource.Columns.Add("id");
tableOfSource.Columns.Add("data");
tableOfSource.Columns.Add("number");
this.source.DataSource = tableOfSource;
}
System.IO.Ports.SerialPort port;
private void btnOpen_Click(object sender, EventArgs e)
{
string portName = this.portNames.SelectedItem.ToString();
if (portName != null && !portName.Equals(""))
{
if (port != null)
{
if (port.IsOpen)
port.Close();
port = null;
}
try
{
port = new System.IO.Ports.SerialPort(portName);
port.PortName = portName;
port.BaudRate = Convert.ToInt32(this.rate.SelectedItem.ToString());
port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
}
catch (Exception e_open)
{
MessageBox.Show(string.Format("打开串口{0}失败", this.portNames.SelectedItem.ToString()));
}
}
}
byte[] readbuffer = new byte[7];
byte[] parseBuffer = new byte[6];
void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (port != null)
{
int length = port.BytesToRead;
while (length >= 7)
{
try
{
port.Read(readbuffer, 0, 7);
Array.Copy(readbuffer, 1, parseBuffer, 0, 6);
string str = Encoding.ASCII.GetString(parseBuffer);
int numberOfCard = Int32.Parse(str, System.Globalization.NumberStyles.HexNumber);
ProcessData(numberOfCard);
Array.Clear(parseBuffer, 0, 6);
Array.Clear(readbuffer, 0, 7);
length -= 7;
}
catch (Exception e_parseData)
{
}
}
}
}
private delegate void InvokeMethod(int rowid, int numberofReader);
private delegate void InvokeAddRow(InfoRow infoRow,int numberOfCard);
static Hashtable table = new Hashtable();
static int index = 0;//行数
private void ProcessData(int numberOfCard)
{
if (table.Contains(numberOfCard))
{
InfoRow row = (InfoRow)table[numberOfCard];
row.NumberOfReader = row.NumberOfReader + 1;
this.Invoke(new InvokeMethod(InvokePaint), new object[] {row.RowID,row.NumberOfReader });
}
else
{
InfoRow infoRow = new InfoRow(index++, 1);
table.Add(numberOfCard, infoRow);
this.Invoke(new InvokeAddRow(AddRow), new object[] { infoRow,numberOfCard });
}
}
private void AddRow(InfoRow infoRow,int numberOfCard)
{
tableOfSource.Rows.Add(new object[] { infoRow.RowID,numberOfCard,infoRow.NumberOfReader});
}
private void InvokePaint(int rowid, int numberOfReader)
{
try
{
DataRow row = tableOfSource.Rows[rowid];
row.BeginEdit();
row["number"] = numberOfReader;
row.EndEdit();
}
catch (Exception e)
{
}
}
private void btn_close_Click(object sender, EventArgs e)
{
if (port != null && port.IsOpen)
{
port.Close();
port = null;
MessageBox.Show(string.Format("关闭串口{0}成功", this.portNames.SelectedItem.ToString()));
}
}
private delegate void InvokeClear();
private void clear_Click(object sender, EventArgs e)
{
this.Invoke(new InvokeClear(ClearRows));
table.Clear();
index = 0;
}
private void ClearRows()
{
tableOfSource.Rows.Clear();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (port != null && port.IsOpen)
{
port.Close();
}
}
}
//
class InfoRow
{
private int rowID;
public int RowID
{
get { return rowID; }
set { rowID = value; }
}
private int numberOfReader;
public int NumberOfReader
{
get { return numberOfReader; }
set { numberOfReader = value; }
}
public InfoRow(int _rowID, int _numberOfReader)
{
this.rowID = _rowID;
this.numberOfReader = _numberOfReader;
}
}
}
串口编程
最新推荐文章于 2022-11-18 18:02:00 发布