至于什么是串口,百度有很多了,我如果copy下来,生疏的文字性的也不好理解。我的理解就是2个硬件通过电缆连接进行通信,串口是COM1-COM256之间。
它有几个重要的概念,波特率,数据位,停止位,奇偶校验。具体的相关知识可以进行百度。
在net 1.1时候,需要通过系统API 来进行,到 net 2的时候微软已经为我们封装了相关的类了。
在自己电脑上开发的时候,需要用软件来模拟2个串口,有一个软件叫Virtual Serial Port Driver 还有个叫VSPM
先上图。。
代码很简单 首先就是初始化2个串口的各项参数,这里给定一些默认参数。
然后就是调用发送和接收方法了,有一点需要注意的是,接收事件是异步的,最好不要直接访问UI控件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace SerialDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private Dictionary GetInitData() { Dictionary dic = new Dictionary(); List ports = new List(); for (int i = 1; i //{ // FunListen(); //}); } catch (Exception ex) { this.listLog.Items.Add(DateTime.Now + " " + this.cbxCOMPort2.Text + "串口初始化失败," + ex.Message); } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); Dictionary dic = GetInitData(); this.cbxCOMPort1.DataSource = dic["ports"] as List; this.cbxCOMPort1.SelectedItem = "COM3"; this.cbxParity1.DataSource = dic["parity"] as List; this.cbxBaudRate1.DataSource = dic["baudRate"] as List; this.cbxBaudRate1.SelectedItem = "9600"; this.cbxDataBits1.DataSource = dic["dataBits"] as List; this.cbxStopBits1.DataSource = dic["stopBits"] as List; Dictionary dic2 = GetInitData(); this.cbxCOMPort2.DataSource = dic2["ports"] as List; this.cbxCOMPort2.SelectedItem = "COM4"; this.cbxParity2.DataSource = dic2["parity"] as List; this.cbxBaudRate2.DataSource = dic2["baudRate"] as List; this.cbxBaudRate2.SelectedItem = "9600"; this.cbxDataBits2.DataSource = dic2["dataBits"] as List; this.cbxStopBits2.DataSource = dic2["stopBits"] as List; Init1(); Init2(); } public delegate void Action(); private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e) { //读取串口数据 this.listReceive.Invoke(new Action( delegate { this.listReceive.Items.Add(serialPort2.ReadExisting()); }), null); } private void btnInit_Click(object sender, EventArgs e) { Init1(); Init2(); } private void btnSend_Click(object sender, EventArgs e) { if (String.IsNullOrEmpty(this.txtSend.Text)) { MessageBox.Show("请输入要发送的数据"); return; } try { serialPort1.WriteLine(this.txtSend.Text); //MessageBox.Show("数据发送成功!", "系统提示"); } catch (Exception ex) { MessageBox.Show("发送数据时发生错误!" + ex.Message); } } private void btnReceive_Click(object sender, EventArgs e) { try { //byte[] buffer = new byte[serialPort2.BytesToRead]; //serialPort2.Read(buffer,0,buffer.Length); //string str = Encoding.Unicode.GetString(buffer, 0, buffer.Length); //读取串口数据 this.listReceive.Items.Add(serialPort2.ReadExisting()); //this.listReceive.Items.Add(str); } catch (Exception ex) { MessageBox.Show("读取串口时发生错误!" + ex.Message); } } private void btnClose_Click(object sender, EventArgs e) { this.serialPort1.Close(); this.listLog.Items.Add(DateTime.Now + " " + this.serialPort1.PortName + "串口已关闭"); this.serialPort2.Close(); this.listLog.Items.Add(DateTime.Now + " " + this.serialPort2.PortName + "串口已关闭"); } } }
最后上源码包
还有一个wpf版本的