012.c串口操作系列入門篇一個簡陋例子_第1頁
012.c串口操作系列入門篇一個簡陋例子_第2頁
012.c串口操作系列入門篇一個簡陋例子_第3頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、我假設(shè)讀者已經(jīng)了解了c#的語法,本文是針對剛打算解除串口編程的朋友閱讀的,作為串口編程的入門范例,也是我這個系列的基礎(chǔ)。我們的開發(fā)環(huán)境假定為vs2005(雖然我在用vs2010,但避免有些網(wǎng)友用2005,不支持lambda,避免不兼容,就用2005來做例子)一個基本的串口程序,既然是個程序了。我們就先從功能說起,包含串口選擇波特率選擇打開關(guān)閉接受數(shù)據(jù)顯示發(fā)送數(shù)據(jù)輸入發(fā)送數(shù)據(jù)數(shù)據(jù)量提示以及歸零好吧,有了這些功能,我們就先畫出界面。例如:這里,波特率就定死幾種好了。直接界面上添加2400,4800,9600,19200,38400,57600,115200comboPortName這里,為了我們的

2、軟件能通用所有電腦避免每次查詢的效率損失,我們使用微軟提供的枚舉方式,代碼如下:c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?stringports=SerialPort.Ge

3、tPortNames();Array.Sort(ports);comboPortName.Items.AddRange(ports);顯然,我們需要定義一個SerialPort對象。添加DataReceived事件響應(yīng)收到數(shù)據(jù),還有一個重點(diǎn),我們需要記得設(shè)置NewLine屬性哦。好想有的版本不設(shè)置的時候,WriteLine和Write效果一樣。所以,我們需要初始化SerialPort對象,例如:c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article

4、/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?/初始化SerialPort對象 comm.NewLine=/r/n;comm.RtsEnable=true;/根據(jù)實(shí)際情況吧。 /添加事件注冊 comm.DataReceived+=comm_DataReceived;初始化好串口,簡單的編寫打開,關(guān)閉方法,編寫界面響應(yīng)的是否自動換行,如何復(fù)位計(jì)數(shù)器,發(fā)送方法。以及數(shù)據(jù)處理。因?yàn)?/p>

5、我已經(jīng)寫了完整注視,我就直接貼代碼了。 c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?usingSystem;usingSystem.Collections.Generic;u

6、singSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;usingSystem.Text.RegularExpressions;namespaceSerialportSamplepublicpartialclassSerialportSampleForm:FormprivateSerialPortcomm=newSerialPort();privateStringB

7、uilderbuilder=newStringBuilder();/避免在事件處理方法中反復(fù)的創(chuàng)建,定義到外面。 privatelongreceived_count=0;/接收計(jì)數(shù) privatelongsend_count=0;/發(fā)送計(jì)數(shù) publicSerialportSampleForm()InitializeComponent();/窗體初始化 privatevoidForm1_Load(objectsender,EventArgse)/初始化下拉串口名稱列表框 stringports=SerialPort.GetPortNames();Array.Sort(ports);comboP

8、ortName.Items.AddRange(ports);comboPortName.SelectedIndex=comboPortName.Items.Count0?0:-1;comboBaudrate.SelectedIndex=comboBaudrate.Items.IndexOf(9600);/初始化SerialPort對象 comm.NewLine=/r/n;comm.RtsEnable=true;/根據(jù)實(shí)際情況吧。 /添加事件注冊 comm.DataReceived+=comm_DataReceived;voidcomm_DataReceived(objectsender,Ser

9、ialDataReceivedEventArgse)intn=comm.BytesToRead;/先記錄下來,避免某種原因,人為的原因,操作幾次之間時間長,緩存不一致 bytebuf=newbyten;/聲明一個臨時數(shù)組存儲當(dāng)前來的串口數(shù)據(jù) received_count+=n;/增加接收計(jì)數(shù) comm.Read(buf,0,n);/讀取緩沖數(shù)據(jù) builder.Clear();/清除字符串構(gòu)造器的內(nèi)容 /因?yàn)橐L問ui資源,所以需要使用invoke方式同步ui。 this.Invoke(EventHandler)(delegate/判斷是否是顯示為16禁止 if(checkBoxHexView

10、.Checked)/依次的拼接出16進(jìn)制字符串 foreach(bytebinbuf)builder.Append(b.ToString(X2)+);else/直接按ASCII規(guī)則轉(zhuǎn)換成字符串 builder.Append(Encoding.ASCII.GetString(buf);/追加的形式添加到文本框末端,并滾動到最后。 this.txGet.AppendText(builder.ToString();/修改接收計(jì)數(shù) labelGetCount.Text=Get:+received_count.ToString(););privatevoidbuttonOpenClose_Click(o

11、bjectsender,EventArgse)/根據(jù)當(dāng)前串口對象,來判斷操作 if(comm.IsOpen)/打開時點(diǎn)擊,則關(guān)閉串口 comm.Close();else/關(guān)閉時點(diǎn)擊,則設(shè)置好端口,波特率后打開 comm.PortName=comboPortName.Text;comm.BaudRate=int.Parse(comboBaudrate.Text);trycomm.Open();catch(Exceptionex)/捕獲到異常信息,創(chuàng)建一個新的comm對象,之前的不能用了。 comm=newSerialPort();/現(xiàn)實(shí)異常信息給客戶。 MessageBox.Show(ex.Me

12、ssage);/設(shè)置按鈕的狀態(tài) buttonOpenClose.Text=comm.IsOpen?Close:Open;buttonSend.Enabled=comm.IsOpen;/動態(tài)的修改獲取文本框是否支持自動換行。 privatevoidcheckBoxNewlineGet_CheckedChanged(objectsender,EventArgse)txGet.WordWrap=checkBoxNewlineGet.Checked;privatevoidbuttonSend_Click(objectsender,EventArgse)/定義一個變量,記錄發(fā)送了幾個字節(jié) intn=0;

13、/16進(jìn)制發(fā)送 if(checkBoxHexSend.Checked)/我們不管規(guī)則了。如果寫錯了一些,我們允許的,只用正則得到有效的十六進(jìn)制數(shù) MatchCollectionmc=Regex.Matches(txSend.Text,(?i)/da-f2);Listbuf=newList();/填充到這個臨時列表中 /依次添加到列表中 foreach(Matchminmc)buf.Add(byte.Parse(m.Value);/轉(zhuǎn)換列表為數(shù)組后發(fā)送 comm.Write(buf.ToArray(),0,buf.Count);/記錄發(fā)送的字節(jié)數(shù) n=buf.Count;else/ascii編碼

14、直接發(fā)送 /包含換行符 if(checkBoxNewlineSend.Checked)comm.WriteLine(txSend.Text);n=txSend.Text.Length+2;else/不包含換行符 comm.Write(txSend.Text);n=txSend.Text.Length;send_count+=n;/累加發(fā)送字節(jié)數(shù) labelSendCount.Text=Send:+send_count.ToString();/更新界面 privatevoidbuttonReset_Click(objectsender,EventArgse)/復(fù)位接受和發(fā)送的字節(jié)數(shù)計(jì)數(shù)器并更新界面。 send_count=received_count=0;labelGetCount.Text=Get:0;labelSendCount.Text=Send:0;至此,一個標(biāo)準(zhǔn)的串口調(diào)試助手就完成了。留下一個思考題,如果接收數(shù)據(jù)后,更新界面的時候,尚未操作完成,此時并發(fā)了關(guān)閉串口的操作。程序會如何呢?敬請閱讀C# 串口操作系列(2) - 如何避免關(guān)閉串口偶爾軟件死鎖。 HYPERLINK /down/2360835/wuyazhe VS

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論