




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實用標準文案c#上位機串口通信助手源代碼實例詳解一、功能1軟件打開時,自動檢測有效com端口2軟件打開時,自動復原到上次關閉時的狀態3不必關閉串口,即可直接進行更改初始化設置內容(串口號、波特率、數據位、停止位、校驗位),可按更改后的信息自動將串口重新打開4可統計接收字節和發送字節的個數5接收數據可按16進制數據和非16進制數據進行整體轉換6可將接收到數據進行保存7可設置自動發送,發送時間可進行實時更改8可按字符串、16進制字節、文件方式進行發送,字符串和16進制字節可分別進行存儲,內容互不干擾9按16進制發送時,可自動校驗格式,不會輸錯10可清空發送或接收區域的數據二、使用工具visuals
2、tudio2015三、程序詳解1界面創建精彩文檔實用標準文案圖1用winform創建如圖1所示界面,控件名字分別為:端口號:cbxcomport波特率:cbxbaudrate數據位:cbxdatabits停止位:cbxstopbits校驗位:label5打開串口按鈕:btnopencom發送(byte):tbsendcount接收(byte):tbreceivedcount清空計數按鈕:btnclearcount按16進制顯示:cb16display接收區清空內容按鈕:btnclearreceived保存數據按鈕:btnsavefile接收數據框:tbreceiveddata發送數據框:tbs
3、enddata自動發送:cbautomaticsend間隔時間:tbspacetime按16進制發送:cb16send發送區清空內容按鈕:btnclearsend讀入文件按鈕:btnreadfile發送按鈕:btnsend2創建一個方法類按ctrl+shift+a快捷鍵創建一個類,名字叫methods,代碼為:usingsystem;usingsystem.collections;usingsystem.collections.generic;usingsystem.io.ports;usingsystem.linq;usingsystem.text;usingsystem.threading
4、.tasks;namespace串口助手sddclassmethods/獲取有效的com口publicstaticstringactiveports()arraylistactiveports=newarraylist();foreach(stringpnameinserialport.getportnames()activeports.add(convert.toint32(pname.substring(3);activeports.sort();stringmystr=newstringactiveports.count;精彩文檔實用標準文案inti=0;foreach(intnumin
5、activeports)mystri+=com+num.tostring();returnmystr;/16進制字符串轉換為byte字符數組publicstaticbyte_16strtohex(stringstrvalues)stringhexvaluessplit=strvalues.split();bytehexvalues=newbytehexvaluessplit.length;console.writeline(hexvaluessplit.length);for(inti=0;ihexvaluessplit.length;i+)hexvaluesi=convert.tobyte(
6、hexvaluesspliti,16);returnhexvalues;/byte數組以16進制形式轉字符串publicstaticstringbyteto16str(bytebytes)stringrecdata=null;/創建接收數據的字符串foreach(byteoutbyteinbytes)/將字節數組以16進制形式遍歷到一個字符串內recdata+=outbyte.tostring(x2)+;returnrecdata;/16進制字符串轉換字符串publicstaticstring_16strtostr(string_16str)stringoutstr=null;bytestre
7、ambyte=_16strtohex(_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.text;usingsystem.text.regularexp
8、ressions;usingsystem.threading.tasks;usingsystem.windows.forms;usingsystem.io;usingsystem.collections;namespace串口助手sddpublicpartialclassform1:form/聲明變量serialportsp=newserialport();boolissetproperty=false;/串口屬性設置標志位privateenumportstate/聲明接口顯示狀態,枚舉型打開,關閉stringpath=appdomain.currentdomain.basedirectory
9、+confing.ini;/聲明配置文件路徑stringtbsenddatastr=;/發送窗口字符串存儲stringtbsenddata16=;/發送窗口16進制存儲listreceiveddatas=newlist();/接收數據泛型數組/接收串口數據privatevoidsp_datareceived(objectsender,serialdatareceivedeventargse)bytereceiveddata=newbytesp.bytestoread;/創建接收字節數組sp.read(receiveddata,0,receiveddata.length);/讀取所接收到的數據r
10、eceiveddatas.addrange(receiveddata);tbreceivedcount.text=(convert.toint32(tbreceivedcount.text)+receiveddata.length).tostring();if(cb16display.checked)tbreceiveddata.text=methods.byteto16str(receiveddatas.toarray();elsetbreceiveddata.text=encoding.default.getstring(receiveddatas.toarray();sp.discard
11、inbuffer();/丟棄接收緩沖區數據/發送串口數據privatevoiddatasend()tryif(cb16send.checked)bytehexbytes=methods._16strtohex(tbsenddata16);sp.write(hexbytes,0,hexbytes.length);tbsendcount.text=(convert.toint32(tbsendcount.text)+hexbytes.length).tostring();精彩文檔實用標準文案elsesp.writeline(tbsenddatastr);tbsendcount.text=(conv
12、ert.toint32(tbsendcount.text)+tbsenddatastr.length).tostring();catch(exceptionex)messagebox.show(ex.message.tostring();return;/設置串口屬性privatevoidsetportproperty()sp.portname=cbxcomport.text.trim();/設置串口名sp.baudrate=convert.toint32(cbxbaudrate.text.trim();/設置波特率switch(cbxstopbits.text.trim()/設置停止位case
13、1:sp.stopbits=stopbits.one;break;case1.5:sp.stopbits=stopbits.onepointfive;break;case2:sp.stopbits=stopbits.two;break;default:sp.stopbits=stopbits.none;break;sp.databits=convert.toint32(cbxdatabits.text.trim();/設置數據位switch(cbxparity.text.trim()/設置奇偶校驗位case無:sp.parity=parity.none;break;case奇校驗:sp.par
14、ity=parity.odd;break;case偶校驗:sp.parity=parity.even;break;default:sp.parity=parity.none;break;sp.readtimeout=5000;/設置超時時間為5scontrol.checkforillegalcrossthreadcalls=false;/這個類中我們不檢查跨線程的調用是否合法(因為.net2.0以后加強了安全機制,,不允許在winform中直接跨線程訪問控件的屬性)/定義datareceived事件的委托,當串口收到數據后出發事件sp.datareceived+=newserialdatare
15、ceivedeventhandler(sp_datareceived);/設置端口顯示狀態privatevoiddisplayportstate(portstateportstate)toolstripstatuslabel1.text=cbxcomport.text+端口處于+portstate+狀態+cbxbaudrate.text+cbxdatabits.text+cbxstopbits.text+cbxparity.text;/重新打開串口privatevoidagainopenport()if(sp.isopen)精彩文檔實用標準文案trysp.close();setportprop
16、erty();issetproperty=true;sp.open();catch(exception)issetproperty=false;btnopencom.text=打開串口;displayportstate(portstate.關閉);messagebox.show(串口無效或已被占用!,錯誤提示);return;displayportstate(portstate.打開);elsedisplayportstate(portstate.關閉);publicform1()initializecomponent();/軟件啟動時加載事件privatevoidform1_load(obj
17、ectsender,eventargse)#region加載配置文件hashtableht=newhashtable();if(file.exists(path)trystringmyline=;stringstr=newstring2;using(streamreadersr=newstreamreader(path)myline=sr.readline();while(myline!=null)str=myline.split(=);ht.add(str0,str1);myline=sr.readline();精彩文檔實用標準文案catch(exceptionex)messagebox.s
18、how(ex.message.tostring();#endregion#region設置窗口為固定大小且不可最大化this.maximumsize=this.size;this.minimumsize=this.size;this.maximizebox=false;#endregion#region列出常用的波特率cbxbaudrate.items.add(1200);cbxbaudrate.items.add(2400);cbxbaudrate.items.add(4800);cbxbaudrate.items.add(9600);cbxbaudrate.items.add(19200)
19、;cbxbaudrate.items.add(38400);cbxbaudrate.items.add(43000);cbxbaudrate.items.add(56000);cbxbaudrate.items.add(57600);cbxbaudrate.items.add(115200);if(ht.containskey(cbxbaudrate)cbxbaudrate.selectedindex=cbxbaudrate.items.indexof(htcbxbaudrate.tostring();elsecbxbaudrate.selectedindex=3;cbxbaudrate.dr
20、opdownstyle=comboboxstyle.dropdownlist;#endregion#region列出停止位cbxstopbits.items.add(1);cbxstopbits.items.add(1.5);cbxstopbits.items.add(2);if(ht.containskey(cbxstopbits)cbxstopbits.selectedindex=cbxstopbits.items.indexof(htcbxstopbits.tostring();elsecbxstopbits.selectedindex=0;cbxstopbits.dropdownsty
21、le=comboboxstyle.dropdownlist;#endregion#region列出數據位cbxdatabits.items.add(8);cbxdatabits.items.add(7);cbxdatabits.items.add(6);cbxdatabits.items.add(5);if(ht.containskey(cbxdatabits)cbxdatabits.selectedindex=cbxdatabits.items.indexof(htcbxdatabits.tostring();else精彩文檔實用標準文案cbxdatabits.selectedindex=0
22、;cbxdatabits.dropdownstyle=comboboxstyle.dropdownlist;#endregion#region列出奇偶校驗位cbxparity.items.add(無);cbxparity.items.add(奇校驗);cbxparity.items.add(偶校驗);if(ht.containskey(cbxparity)cbxparity.selectedindex=cbxparity.items.indexof(htcbxparity.tostring();elsecbxparity.selectedindex=0;cbxparity.dropdownst
23、yle=comboboxstyle.dropdownlist;#endregion#regioncom口重新加載cbxcomport.items.clear();/清除當前串口號中的所有串口名稱cbxcomport.items.addrange(methods.activeports();if(ht.containskey(cbxcomport)&cbxcomport.items.contains(htcbxcomport.tostring()cbxcomport.selectedindex=cbxcomport.items.indexof(htcbxcomport.tostring();el
24、secbxcomport.selectedindex=0;cbxcomport.dropdownstyle=comboboxstyle.dropdownlist;#endregion#region初始化計數器tbsendcount.text=0;tbsendcount.readonly=true;tbreceivedcount.text=0;tbreceivedcount.readonly=true;#endregion#region初始化當前時間toolstripstatuslabel3.text=datetime.now.tostring();#endregion#region初始化串口狀
25、態toolstripstatuslabel1.forecolor=color.blue;if(!issetproperty)/串口未設置則設置串口屬性setportproperty();issetproperty=true;trysp.open();btnopencom.text=關閉串口;displayportstate(portstate.打開);catch(exception)/串口打開失敗后,串口屬性設置標志位設為falseissetproperty=false;精彩文檔實用標準文案messagebox.show(串口無效或已被占用!,錯誤提示);#endregion#region初始
26、化間隔時間if(ht.containskey(tbspacetime)tbspacetime.text=httbspacetime.tostring();elsetbspacetime.text=1000;#endregion#region初始化按16進制顯示狀態if(ht.containskey(cb16display)&htcb16display.tostring()=true)cb16display.checked=true;elsecb16display.checked=false;#endregion#region初始化按16進制發送狀態if(ht.containskey(cb16s
27、end)&htcb16send.tostring()=true)cb16send.checked=true;elsecb16send.checked=false;#endregion#region初始化發送區文本if(ht.containskey(tbsenddata16)&ht.containskey(tbsenddatastr)tbsenddata16=httbsenddata16.tostring();tbsenddatastr=httbsenddatastr.tostring();if(cb16send.checked)tbsenddata.text=httbsenddata16.to
28、string();elsetbsenddata.text=httbsenddatastr.tostring();#endregiontbsenddata.focus();/顯示當前時間privatevoidtimer1_tick(objectsender,eventargse)toolstripstatuslabel3.text=datetime.now.tostring();精彩文檔實用標準文案/點擊打開串口按鈕privatevoidbtnopencom_click(objectsender,eventargse)if(!sp.isopen)/串口沒有打開時if(!issetproperty
29、)/串口未設置則設置串口屬性setportproperty();issetproperty=true;trysp.open();btnopencom.text=關閉串口;displayportstate(portstate.打開);catch(exception)/串口打開失敗后,串口屬性設置標志位設為falseissetproperty=false;messagebox.show(串口無效或已被占用!,錯誤提示);else/串口已經打開trysp.close();issetproperty=false;btnopencom.text=打開串口;displayportstate(portsta
30、te.關閉);catch(exception)messagebox.show(關閉串口時發生錯誤,錯誤提示);/發送串口數據privatevoidbtnsend_click(objectsender,eventargse)if(tbsenddata.text.trim()=)/檢測發送數據是否為空messagebox.show(請輸入要發送的數據!,錯誤提示);return;if(sp.isopen)datasend();精彩文檔實用標準文案elsemessagebox.show(串口未打開!,錯誤提示);/點擊端口號選擇下拉框按鈕privatevoidcbxcomport_selectedi
31、ndexchanged(objectsender,eventargse)againopenport();/點擊波特率選擇下拉框按鈕privatevoidcbxbaudrate_selectedindexchanged(objectsender,eventargse)againopenport();/點擊數據位選擇下拉框按鈕privatevoidcbxdatabits_selectedindexchanged(objectsender,eventargse)againopenport();/點擊停止位選擇下拉框按鈕privatevoidcbxstopbits_selectedindexchang
32、ed(objectsender,eventargse)againopenport();/點擊校驗位選擇下拉框按鈕privatevoidcbxparity_selectedindexchanged(objectsender,eventargse)againopenport();/點擊數據接收區清空按鈕privatevoidbtnclearreceived_click(objectsender,eventargse)receiveddatas.clear();tbreceiveddata.text=;/點擊是否按16進制顯示接收數據privatevoidcb16display_checkedcha
33、nged(objectsender,eventargse)if(cb16display.checked)精彩文檔實用標準文案tbreceiveddata.text=methods.byteto16str(receiveddatas.toarray();elsetbreceiveddata.text=encoding.default.getstring(receiveddatas.toarray();/點擊是否按16進制發送數據privatevoidcb16send_checkedchanged(objectsender,eventargse)if(cb16send.checked)tbsend
34、data.text=tbsenddata16;elsetbsenddata.text=tbsenddatastr;/發送文本框鍵盤按鍵檢測privatevoidtbsenddata_keypress(objectsender,keypresseventargse)if(cb16send.checked)/正則匹配stringpattern=0-9a-fa-f|b;/b:退格鍵matchm=regex.match(e.keychar.tostring(),pattern);if(m.success)if(e.keychar!=b)if(tbsenddata.text.length%3=2)tbs
35、enddata.text+=;tbsenddata.selectionstart=tbsenddata.text.length;e.keychar=convert.tochar(e.keychar.tostring().toupper();e.handled=false;elsee.handled=true;elsee.handled=false;/點擊清空發送內容privatevoidbtnclearsend_click(objectsender,eventargse)tbsenddata.text=;if(cb16send.checked)精彩文檔實用標準文案tbsenddata16=;e
36、lsetbsenddatastr=;/點擊清空計數器數據privatevoidbtnclearcount_click(objectsender,eventargse)tbreceivedcount.text=0;tbsendcount.text=0;/點擊是否設置自動發送privatevoidcbautomaticsend_checkedchanged(objectsender,eventargse)if(cbautomaticsend.checked)timer2.enabled=true;timer2.interval=convert.toint32(tbspacetime.text);e
37、lsetimer2.enabled=false;/自動發送時間文本框鍵盤按鍵檢測privatevoidtbspacetime_keypress(objectsender,keypresseventargse)/正則匹配stringpattern=0-9|b;matchm=regex.match(e.keychar.tostring(),pattern);if(m.success)timer2.interval=convert.toint32(tbspacetime.text);e.handled=false;elsee.handled=true;/串口顯示狀態privatevoidtimer2
38、_tick(objectsender,eventargse)if(sp.isopen)datasend();elsetimer2.enabled=false;cbautomaticsend.checked=false;messagebox.show(串口未打開!,錯誤提示);精彩文檔實用標準文案return;if(tbsenddata.text.trim()=)/檢測發送數據是否為空timer2.enabled=false;cbautomaticsend.checked=false;messagebox.show(請輸入要發送的數據!,錯誤提示);return;/關閉窗口時出發的事件priva
39、tevoidform1_formclosed(objectsender,formclosedeventargse)tryusing(streamwritersw=newstreamwriter(path,false)sw.writeline(cbxcomport=+cbxcomport.text);sw.writeline(cbxbaudrate=+cbxbaudrate.text);sw.writeline(cbxdatabits=+cbxdatabits.text);sw.writeline(cbxstopbits=+cbxstopbits.text);sw.writeline(cbxparity=+cbxparity.text);sw.writeline(cb16display=+cb16display.checked.tostring();sw.writeline(tbspac
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 輸血方面的論文
- 產后婦女專案管理制度
- 食品制造業采購管理制度
- 企業研發費用管理制度
- 業主裝飾裝修管理制度
- 鄉村旅館衛生管理制度
- 義齒行業規章管理制度
- 傳媒公司流程管理制度
- 中鐵一局公司管理制度
- 京東自營評價管理制度
- 2025年外研版(2024)初中英語七年級下冊期末考試測試卷及答案
- 2024年貴州貴州貴安發展集團有限公司招聘筆試真題
- 2025年中考語文押題作文范文10篇
- 《老年人運動認知風險綜合征健康管理中國專家共識2025》解讀
- 紅木文化知到智慧樹期末考試答案題庫2025年廣西大學
- 國家開放大學本科《商務英語4》一平臺機考真題及答案(第三套)
- 敦煌學智慧樹知到期末考試答案章節答案2024年西北師范大學
- 汽車行走的藝術智慧樹知到期末考試答案章節答案2024年吉林大學
- JJG 643-2024標準表法流量標準裝置
- 安徽淮南市職工生育保險待遇申請表
- 三甲醫院護理部規培計劃
評論
0/150
提交評論