C#串口通信实现方法
本文实例讲述了C#串口通信实现方法。分享给大家供大家参考。具体方法如下:
通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据。这样可以确保每次发送的数据都可以被正确接收。
代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.IO.Ports; usingSystem.Threading; usingUtils;
namespace串口通信 { publicpartialclassForm1:Form { #region变量 ///<summary> ///启动还是停止,true起动,false停止 ///</summary> publicstaticboolstart=true; ///<summary> ///串口资源 ///</summary> privatestaticSerialPortserialPort1=null; ///<summary> ///串口资源 ///</summary> privatestaticSerialPortserialPort2=null; ///<summary> ///成功次数 ///</summary> privatestaticintsuccessCount=0; ///<summary> ///失败次数 ///</summary> privatestaticinterrorCount=0; ///<summary> ///上次计算的总次数 ///</summary> privatestaticintlastCount=0; ///<summary> ///定时器 ///</summary> privateSystem.Windows.Forms.Timertimer=newSystem.Windows.Forms.Timer(); #endregion
#regionForm1 publicForm1() { InitializeComponent(); } #endregion
#regionForm1_Load privatevoidForm1_Load(objectsender,EventArgse) { serialPort1=newSerialPort("COM1"); serialPort1.DataReceived+=newSerialDataReceivedEventHandler(serialPort_DataReceived1); serialPort1.Open(); serialPort2=newSerialPort("COM2"); serialPort2.DataReceived+=newSerialDataReceivedEventHandler(serialPort_DataReceived2); serialPort2.Open(); } #endregion
#regionForm1_FormClosed privatevoidForm1_FormClosed(objectsender,FormClosedEventArgse) { serialPort1.Close(); serialPort1.Dispose(); serialPort2.Close(); serialPort2.Dispose(); } #endregion
#regionbtnStart_Click privatevoidbtnStart_Click(objectsender,EventArgse) { start=true; SendData();
timer.Interval=500; timer.Tick+=newEventHandler(delegate(objectobj,EventArgseventArgs) { if(lastCount==0) { lastCount=successCount+errorCount; } else { intcnt=successCount+errorCount-lastCount; cnt=Data.Length*cnt/1024*(1000/timer.Interval); doubletotal=(successCount+errorCount)*Data.Length/1024.0;
InvokeDelegateinvokeDelegate=delegate() { label3.Text=cnt.ToString()+"KB/S"+total.ToString("#.0")+"KB"; }; InvokeUtil.Invoke(this,invokeDelegate); lastCount=successCount+errorCount; } }); timer.Start(); } #endregion
#regionbtnStop_Click privatevoidbtnStop_Click(objectsender,EventArgse) { start=false; timer.Stop(); timer.Dispose(); timer=newSystem.Windows.Forms.Timer(); } #endregion
#region接收串口数据事件 ///<summary> ///接收串口数据事件 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> publicvoidserialPort_DataReceived1(objectsender,SerialDataReceivedEventArgse) { if(serialPort1.ReadLine()!=null) { successCount++; SendData(); } }
///<summary> ///接收串口数据事件 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> publicvoidserialPort_DataReceived2(objectsender,SerialDataReceivedEventArgse) { List<byte>bList=newList<byte>(); inti=0; while(serialPort2.BytesToRead>0) { byte[]bArr=newbyte[serialPort2.BytesToRead]; i+=serialPort2.Read(bArr,0,bArr.Length); bList.AddRange(bArr); } serialPort2.WriteLine("success");
strings=ASCIIEncoding.UTF8.GetString(bList.ToArray()); InvokeDelegateinvokeDelegate=delegate() { textBox2.Text=s; }; InvokeUtil.Invoke(this,invokeDelegate);
if(s!=Str) { errorCount++; invokeDelegate=delegate() { label2.Text=errorCount+"次不相等(失败)"; }; InvokeUtil.Invoke(this,invokeDelegate); } else { invokeDelegate=delegate() { label1.Text=successCount+"次相等(成功)"; }; InvokeUtil.Invoke(this,invokeDelegate); } } #endregion
#region发送数据 privatevoidSendData() { if(start) { Threadthread=newThread(newParameterizedThreadStart(delegate(objectobj) { InvokeDelegateinvokeDelegate=delegate() { textBox1.Text=Str; }; InvokeUtil.Invoke(this,invokeDelegate);
serialPort1.Write(Data,0,Data.Length); })); thread.Start(); } } #endregion
#region数据 privatestaticbyte[]data=null; ///<summary> ///数据 ///</summary> privatestaticbyte[]Data { get { if(data==null) { data=ASCIIEncoding.UTF8.GetBytes(Str); }
returndata; } } #endregion
#region获取字符串 privatestaticstringstr=null; ///<summary> ///字符串 ///</summary> privatestaticstringStr { get { if(str==null) { StringBuildersb=newStringBuilder(); for(inti=0;i<270;i++) { sb.Append("计算机程序"); } str=sb.ToString(); }
returnstr; } } #endregion
} }