c#上位機串口通信助手源代碼詳解_第1頁
c#上位機串口通信助手源代碼詳解_第2頁
c#上位機串口通信助手源代碼詳解_第3頁
c#上位機串口通信助手源代碼詳解_第4頁
c#上位機串口通信助手源代碼詳解_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

-.zc*上位機串口通信助手源代碼實例詳解功能1軟件翻開時,自動檢測有效COM端口2軟件翻開時,自動復(fù)原到上次關(guān)閉時的狀態(tài)3不必關(guān)閉串口,即可直接進展更改初始化設(shè)置容〔串口號、波特率、數(shù)據(jù)位、停頓位、校驗位〕,可按更改后的信息自動將串口重新翻開4可統(tǒng)計接收字節(jié)和發(fā)送字節(jié)的個數(shù)5接收數(shù)據(jù)可按16進制數(shù)據(jù)和非16進制數(shù)據(jù)進展整體轉(zhuǎn)換6可將接收到數(shù)據(jù)進展保存7可設(shè)置自動發(fā)送,發(fā)送時間可進展實時更改8可按字符串、16進制字節(jié)、文件方式進展發(fā)送,字符串和16進制字節(jié)可分別進展存儲,容互不干擾9按16進制發(fā)送時,可自動校驗格式,不會輸錯10可清空發(fā)送或接收區(qū)域的數(shù)據(jù)使用工具VisualStudio2021程序詳解1界面創(chuàng)立圖1用winform創(chuàng)立如圖1所示界面,控件名字分別為:端口號:cb*COMPort波特率:cb*BaudRate數(shù)據(jù)位:cb*DataBits停頓位:cb*StopBits校驗位:label5翻開串口按鈕:btnOpenCom發(fā)送〔byte〕:tbSendCount接收〔byte〕:tbReceivedCount清空計數(shù)按鈕:btnClearCount按16進制顯示:cb16Display接收區(qū)清空容按鈕:btnClearReceived保存數(shù)據(jù)按鈕:btnSaveFile接收數(shù)據(jù)框:tbReceivedData發(fā)送數(shù)據(jù)框:tbSendData自動發(fā)送:cbAutomaticSend間隔時間:tbSpaceTime按16進制發(fā)送:cb16Send發(fā)送區(qū)清空容按鈕:btnClearSend讀入文件按鈕:btnReadFile發(fā)送按鈕:btnSend2創(chuàng)立一個方法類按Ctrl+shift+A快捷鍵創(chuàng)立一個類,名字叫Methods,代碼為:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Te*t;usingSystem.Threading.Tasks;namespace串口助手sdd{classMethods{//獲取有效的COM口publicstaticstring[]ActivePorts(){ArrayListactivePorts=newArrayList();foreach(stringpnameinSerialPort.GetPortNames()){activePorts.Add(Convert.ToInt32(pname.Substring(3)));}activePorts.Sort();string[]mystr=newstring[activePorts.Count];inti=0;foreach(intnuminactivePorts){mystr[i++]="COM"+num.ToString();}returnmystr;}//16進制字符串轉(zhuǎn)換為byte字符數(shù)組publicstaticByte[]_16strToHe*(stringstrValues){string[]he*ValuesSplit=strValues.Split('');Byte[]he*Values=newByte[he*ValuesSplit.Length];Console.WriteLine(he*ValuesSplit.Length);for(inti=0;i<he*ValuesSplit.Length;i++){he*Values[i]=Convert.ToByte(he*ValuesSplit[i],16);}returnhe*Values;}//byte數(shù)組以16進制形式轉(zhuǎn)字符串publicstaticstringByteTo16Str(byte[]bytes){stringrecData=null;//創(chuàng)立接收數(shù)據(jù)的字符串foreach(byteoutByteinbytes)//將字節(jié)數(shù)組以16進制形式遍歷到一個字符串{recData+=outByte.ToString("*2")+"";}returnrecData;}//16進制字符串轉(zhuǎn)換字符串publicstaticstring_16strToStr(string_16str){stringoutStr=null;byte[]streamByte=_16strToHe*(_16str);outStr=Encoding.Default.GetString(streamByte);returnoutStr;}}}2Form1.cs的代碼為:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Te*t;usingSystem.Te*t.RegularE*pressions;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Collections;namespace串口助手sdd{publicpartialclassForm1:Form{//聲明變量SerialPortsp=newSerialPort();boolisSetProperty=false;//串口屬性設(shè)置標志位privateenumPortState//聲明接口顯示狀態(tài),枚舉型{翻開,關(guān)閉}stringpath=AppDomain.CurrentDomain.BaseDirectory+"confing.ini";//聲明配置文件路徑stringtbSendDataStr=";//發(fā)送窗口字符串存儲stringtbSendData16=";//發(fā)送窗口16進制存儲List<byte>receivedDatas=newList<byte>();//接收數(shù)據(jù)泛型數(shù)組//接收串口數(shù)據(jù)privatevoidsp_DataReceived(objectsender,SerialDataReceivedEventArgse){byte[]ReceivedData=newbyte[sp.BytesToRead];//創(chuàng)立接收字節(jié)數(shù)組sp.Read(ReceivedData,0,ReceivedData.Length);//讀取所接收到的數(shù)據(jù)receivedDatas.AddRange(ReceivedData);tbReceivedCount.Te*t=(Convert.ToInt32(tbReceivedCount.Te*t)+ReceivedData.Length).ToString();if(cb16Display.Checked)tbReceivedData.Te*t=Methods.ByteTo16Str(receivedDatas.ToArray());elsetbReceivedData.Te*t=Encoding.Default.GetString(receivedDatas.ToArray());sp.DiscardInBuffer();//丟棄接收緩沖區(qū)數(shù)據(jù)}//發(fā)送串口數(shù)據(jù)privatevoidDataSend(){try{if(cb16Send.Checked){byte[]he*Bytes=Methods._16strToHe*(tbSendData16);sp.Write(he*Bytes,0,he*Bytes.Length);tbSendCount.Te*t=(Convert.ToInt32(tbSendCount.Te*t)+he*Bytes.Length).ToString();}else{sp.WriteLine(tbSendDataStr);tbSendCount.Te*t=(Convert.ToInt32(tbSendCount.Te*t)+tbSendDataStr.Length).ToString();}}catch(E*ceptione*){MessageBo*.Show(e*.Message.ToString());return;}}//設(shè)置串口屬性privatevoidSetPortProperty(){sp.PortName=cb*COMPort.Te*t.Trim();//設(shè)置串口名sp.BaudRate=Convert.ToInt32(cb*BaudRate.Te*t.Trim());//設(shè)置波特率switch(cb*StopBits.Te*t.Trim())//設(shè)置停頓位{case"1":sp.StopBits=StopBits.One;break;case"1.5":sp.StopBits=StopBits.OnePointFive;break;case"2":sp.StopBits=StopBits.Two;break;default:sp.StopBits=StopBits.None;break;}sp.DataBits=Convert.ToInt32(cb*DataBits.Te*t.Trim());//設(shè)置數(shù)據(jù)位switch(cb*Parity.Te*t.Trim())//設(shè)置奇偶校驗位{case"無":sp.Parity=Parity.None;break;case"奇校驗":sp.Parity=Parity.Odd;break;case"偶校驗":sp.Parity=Parity.Even;break;default:sp.Parity=Parity.None;break;}sp.ReadTimeout=5000;//設(shè)置超時時間為5sControl.CheckForIllegalCrossThreadCalls=false;//這個類中我們不檢查跨線程的調(diào)用是否合法(因為.net2.0以后加強了平安機制,,不允許在winform中直接跨線程訪問控件的屬性)//定義DataReceived事件的委托,當串口收到數(shù)據(jù)后出發(fā)事件sp.DataReceived+=newSerialDataReceivedEventHandler(sp_DataReceived);}//設(shè)置端口顯示狀態(tài)privatevoidDisplayPortState(PortStateportState){toolStripStatusLabel1.Te*t=cb*COMPort.Te*t+"端口處于"+portState+"狀態(tài)"+cb*BaudRate.Te*t+""+cb*DataBits.Te*t+""+cb*StopBits.Te*t+""+cb*Parity.Te*t;}//重新翻開串口privatevoidAgainOpenPort(){if(sp.IsOpen){try{sp.Close();SetPortProperty();isSetProperty=true;sp.Open();}catch(E*ception){isSetProperty=false;btnOpenCom.Te*t="翻開串口";DisplayPortState(PortState.關(guān)閉);MessageBo*.Show("串口無效或已被占用!","錯誤提示");return;}DisplayPortState(PortState.翻開);}else{DisplayPortState(PortState.關(guān)閉);}}publicForm1(){InitializeComponent();}//軟件啟動時加載事件privatevoidForm1_Load(objectsender,EventArgse){*region加載配置文件Hashtableht=newHashtable();if(File.E*ists(path)){try{stringmyline=";string[]str=newstring[2];using(StreamReadersr=newStreamReader(path)){myline=sr.ReadLine();while(myline!=null){str=myline.Split('=');ht.Add(str[0],str[1]);myline=sr.ReadLine();}}}catch(E*ceptione*){MessageBo*.Show(e*.Message.ToString());}}*endregion*region設(shè)置窗口為固定大小且不可最大化this.Ma*imumSize=this.Size;this.MinimumSize=this.Size;this.Ma*imizeBo*=false;*endregion*region列出常用的波特率cb*BaudRate.Items.Add("1200");cb*BaudRate.Items.Add("2400");cb*BaudRate.Items.Add("4800");cb*BaudRate.Items.Add("9600");cb*BaudRate.Items.Add("19200");cb*BaudRate.Items.Add("38400");cb*BaudRate.Items.Add("43000");cb*BaudRate.Items.Add("56000");cb*BaudRate.Items.Add("57600");cb*BaudRate.Items.Add("115200");if(ht.ContainsKey("cb*BaudRate"))cb*BaudRate.SelectedInde*=cb*BaudRate.Items.Inde*Of(ht["cb*BaudRate"].ToString());elsecb*BaudRate.SelectedInde*=3;cb*BaudRate.DropDownStyle=ComboBo*Style.DropDownList;*endregion*region列出停頓位cb*StopBits.Items.Add("1");cb*StopBits.Items.Add("1.5");cb*StopBits.Items.Add("2");if(ht.ContainsKey("cb*StopBits"))cb*StopBits.SelectedInde*=cb*StopBits.Items.Inde*Of(ht["cb*StopBits"].ToString());elsecb*StopBits.SelectedInde*=0;cb*StopBits.DropDownStyle=ComboBo*Style.DropDownList;*endregion*region列出數(shù)據(jù)位cb*DataBits.Items.Add("8");cb*DataBits.Items.Add("7");cb*DataBits.Items.Add("6");cb*DataBits.Items.Add("5");if(ht.ContainsKey("cb*DataBits"))cb*DataBits.SelectedInde*=cb*DataBits.Items.Inde*Of(ht["cb*DataBits"].ToString());elsecb*DataBits.SelectedInde*=0;cb*DataBits.DropDownStyle=ComboBo*Style.DropDownList;*endregion*region列出奇偶校驗位cb*Parity.Items.Add("無");cb*Parity.Items.Add("奇校驗");cb*Parity.Items.Add("偶校驗");if(ht.ContainsKey("cb*Parity"))cb*Parity.SelectedInde*=cb*Parity.Items.Inde*Of(ht["cb*Parity"].ToString());elsecb*Parity.SelectedInde*=0;cb*Parity.DropDownStyle=ComboBo*Style.DropDownList;*endregion*regionCOM口重新加載cb*COMPort.Items.Clear();//去除當前串口號中的所有串口名稱cb*COMPort.Items.AddRange(Methods.ActivePorts());if(ht.ContainsKey("cb*COMPort")&&cb*COMPort.Items.Contains(ht["cb*COMPort"].ToString()))cb*COMPort.SelectedInde*=cb*COMPort.Items.Inde*Of(ht["cb*COMPort"].ToString());elsecb*COMPort.SelectedInde*=0;cb*COMPort.DropDownStyle=ComboBo*Style.DropDownList;*endregion*region初始化計數(shù)器tbSendCount.Te*t="0";tbSendCount.ReadOnly=true;tbReceivedCount.Te*t="0";tbReceivedCount.ReadOnly=true;*endregion*region初始化當前時間toolStripStatusLabel3.Te*t=DateTime.Now.ToString();*endregion*region初始化串口狀態(tài)toolStripStatusLabel1.ForeColor=Color.Blue;if(!isSetProperty)//串口未設(shè)置則設(shè)置串口屬性{SetPortProperty();isSetProperty=true;}try{sp.Open();btnOpenCom.Te*t="關(guān)閉串口";DisplayPortState(PortState.翻開);}catch(E*ception){//串口翻開失敗后,串口屬性設(shè)置標志位設(shè)為falseisSetProperty=false;MessageBo*.Show("串口無效或已被占用!","錯誤提示");}*endregion*region初始化間隔時間if(ht.ContainsKey("tbSpaceTime"))tbSpaceTime.Te*t=ht["tbSpaceTime"].ToString();elsetbSpaceTime.Te*t="1000";*endregion*region初始化按16進制顯示狀態(tài)if(ht.ContainsKey("cb16Display")&&ht["cb16Display"].ToString()=="True")cb16Display.Checked=true;elsecb16Display.Checked=false;*endregion*region初始化按16進制發(fā)送狀態(tài)if(ht.ContainsKey("cb16Send")&&ht["cb16Send"].ToString()=="True")cb16Send.Checked=true;elsecb16Send.Checked=false;*endregion*region初始化發(fā)送區(qū)文本if(ht.ContainsKey("tbSendData16")&&ht.ContainsKey("tbSendDataStr")){tbSendData16=ht["tbSendData16"].ToString();tbSendDataStr=ht["tbSendDataStr"].ToString();if(cb16Send.Checked)tbSendData.Te*t=ht["tbSendData16"].ToString();elsetbSendData.Te*t=ht["tbSendDataStr"].ToString();}*endregiontbSendData.Focus();}//顯示當前時間privatevoidtimer1_Tick(objectsender,EventArgse){toolStripStatusLabel3.Te*t=DateTime.Now.ToString();}//點擊翻開串口按鈕privatevoidbtnOpenCom_Click(objectsender,EventArgse){if(!sp.IsOpen)//串口沒有翻開時{if(!isSetProperty)//串口未設(shè)置則設(shè)置串口屬性{SetPortProperty();isSetProperty=true;}try{sp.Open();btnOpenCom.Te*t="關(guān)閉串口";DisplayPortState(PortState.翻開);}catch(E*ception){//串口翻開失敗后,串口屬性設(shè)置標志位設(shè)為falseisSetProperty=false;MessageBo*.Show("串口無效或已被占用!","錯誤提示");}}else//串口已經(jīng)翻開{try{sp.Close();isSetProperty=false;btnOpenCom.Te*t="翻開串口";DisplayPortState(PortState.關(guān)閉);}catch(E*ception){MessageBo*.Show("關(guān)閉串口時發(fā)生錯誤","錯誤提示");}}}//發(fā)送串口數(shù)據(jù)privatevoidbtnSend_Click(objectsender,EventArgse){if(tbSendData.Te*t.Trim()==")//檢測發(fā)送數(shù)據(jù)是否為空{(diào)MessageBo*.Show("請輸入要發(fā)送的數(shù)據(jù)!","錯誤提示");return;}if(sp.IsOpen){DataSend();}else{MessageBo*.Show("串口未翻開!","錯誤提示");}}//點擊端口號選擇下拉框按鈕privatevoidcb*COMPort_SelectedInde*Changed(objectsender,EventArgse){AgainOpenPort();}//點擊波特率選擇下拉框按鈕privatevoidcb*BaudRate_SelectedInde*Changed(objectsender,EventArgse){AgainOpenPort();}//點擊數(shù)據(jù)位選擇下拉框按鈕privatevoidcb*DataBits_SelectedInde*Changed(objectsender,EventArgse){AgainOpenPort();}//點擊停頓位選擇下拉框按鈕privatevoidcb*StopBits_SelectedInde*Changed(objectsender,EventArgse){AgainOpenPort();}//點擊校驗位選擇下拉框按鈕privatevoidcb*Parity_SelectedInde*Changed(objectsender,EventArgse){AgainOpenPort();}//點擊數(shù)據(jù)接收區(qū)清空按鈕privatevoidbtnClearReceived_Click(objectsender,EventArgse){receivedDatas.Clear();tbReceivedData.Te*t=";}//點擊是否按16進制顯示接收數(shù)據(jù)privatevoidcb16Display_CheckedChanged(objectsender,EventArgse){if(cb16Display.Checked)tbReceivedData.Te*t=Methods.ByteTo16Str(receivedDatas.ToArray());elsetbReceivedData.Te*t=Encoding.Default.GetString(receivedDatas.ToArray());}//點擊是否按16進制發(fā)送數(shù)據(jù)privatevoidcb16Send_CheckedChanged(objectsender,EventArgse){if(cb16Send.Checked){tbSendData.Te*t=tbSendData16;}else{tbSendData.Te*t=tbSendDataStr;}}//發(fā)送文本框鍵盤按鍵檢測privatevoidtbSendData_KeyPress(objectsender,KeyPressEventArgse){if(cb16Send.Checked){//正則匹配stringpattern="[0-9a-fA-F]|\b";//\b:退格鍵Matchm=Rege*.Match(e.KeyChar.ToString(),pattern);if(m.Success){if(e.KeyChar!='\b'){if(tbSendData.Te*t.Length%3==2){tbSendData.Te*t+="";tbSendData.SelectionStart=tbSendData.Te*t.Length;}e.KeyChar=Convert.ToChar(e.KeyChar.ToString().ToUpper());}e.Handled=false;}else{e.Handled=true;}}else{e.Handled=false;}}//點擊清空發(fā)送容privatevoidbtnClearSend_Click(objectsender,EventArgse){tbSendData.Te*t=";if(cb16Send.Checked)tbSendData16=";elsetbSendDataStr=";}//點擊清空計數(shù)器數(shù)據(jù)privatevoidbtnClearCount_Click(objectsender,EventArgse){tbReceivedCount.Te*t="0";tbSendCount.Te*t="0";}//點擊是否設(shè)置自動發(fā)送privatevoidcbAutomaticSend_CheckedChanged(objectsender,EventArgse){if(cbAutomaticSend.Checked){timer2.Enabled=true;timer2.Interval=Convert.ToInt32(tbSpaceTime.Te*t);}else{timer2.Enabled=false;}}//自動發(fā)送時間文本框鍵盤按鍵檢測privatevoidtbSpaceTime_KeyPress(objectsender,KeyPressEventArgse){//正則匹配stringpattern="[0-9]|\b";Matchm=Rege*.Match(e.KeyChar.ToString(),pattern);if(m.Success){timer2.Interval=Convert.ToInt32(tbSpaceTime.Te*t);e.Handled=false;}else{e.Handled=true;}}//串口顯示狀態(tài)privatevoidtimer2_Tick(objectsender,EventArgse){if(sp.IsOpen){DataSend();}else{timer2.Enabled=false;cbAutomaticSend.Checked=false;MessageBo*.Show("串口未翻開!","錯誤提示");return;}if(tbSendData.Te*t.Trim()==")//檢測發(fā)送數(shù)據(jù)是否為空{(diào)timer2.Enabled=false;cbAutomaticSend.Checked=false;MessageBo*.Show("請輸入要發(fā)送的數(shù)據(jù)!","錯誤提示");return;}}//關(guān)閉窗口時出發(fā)的事件privatevoidForm1_FormClosed(objectsender,FormClosedEventArgse){try{using(StreamWritersw=newStreamWriter(path,false)){sw.WriteLine("cb*COMPort="+cb*COMPort.Te*t);sw.WriteLine("cb*BaudRate="+cb*BaudRate.Te*t);sw.WriteLine("cb*DataBits="+cb*DataBits.Te*t);sw.WriteLine("cb*StopBits="+cb*StopBits.Te*t);sw.WriteLine("cb*Parity="+cb*Parity.Te*t);sw.WriteLine("cb16Display="+cb16Display.Checked.ToString());sw.WriteLine("tbSpaceTime="+tbSpaceTi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論