版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C#編寫串口調(diào)試小助手設(shè)計(jì)文檔 /*/ /*文檔名稱:C#編寫串口調(diào)試小助手設(shè)計(jì)文檔 */ /*操作系統(tǒng):win7 X64 */ /*編譯軟件:Virtual Studio 2010 */ /*編譯環(huán)境:.Net FrameWork 4.0 */ /*時(shí)間 :2014/7/24 */ /*Author : 軟星包子 */ /*/ 目錄1. 定義程序的的命名空間靜態(tài)主函數(shù)( static main)12. 定義程序會(huì)用到的類包及全局變量23. 初始化窗體,初始化窗體控件屬性與事件24. 點(diǎn)擊 打開串口/關(guān)閉串口 對(duì)應(yīng)的 Click 事件處理2a打開端口/關(guān)閉串口 事件處理所需要的函數(shù)3b.讀取串
2、口的事件處理 ,委托與線程45. 初始化 SerialPort對(duì)象,檢測(cè)當(dāng)前系統(tǒng)下可用端口,檢測(cè)當(dāng)前用戶相關(guān)配置信息66.DataReceived事件委托方法77.數(shù)據(jù)發(fā)送事件處理88. 寫數(shù)據(jù)操作,利用線程循環(huán)發(fā)送數(shù)據(jù)9a. 數(shù)據(jù)轉(zhuǎn)換,將16進(jìn)制數(shù)轉(zhuǎn)化為字節(jié)型數(shù)據(jù)119.復(fù)選框:強(qiáng)制轉(zhuǎn)換為16進(jìn)制事件處理12a.普通文本轉(zhuǎn)換為16進(jìn)制值1210.清空按鈕清空listBox和richTextBox的文本區(qū)1211.點(diǎn)擊“關(guān)于我們按鈕”在主窗體中打開其他窗體1312.窗體布局及消息盒提示1313. 窗體布局及相應(yīng)控件介紹141. 定義程序的的命名空間靜態(tài)主函數(shù)( static main)name
3、space VCCom static class Program / <summary> / 應(yīng)用程序的主入口點(diǎn)。 / </summary> STAThread static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormCOM(); /定義程序啟動(dòng)默認(rèn)加載的窗體 /可以通過修改 FormCOM() 來啟動(dòng)需要默認(rèn)打開的窗體。 2. 定義程序會(huì)用到的類包及全局變量usin
4、g System.IO;using System.IO.Ports;using System.Threading; /定義 SerialPort對(duì)象 SerialPort SerialPortcom; Thread _readThread; /用Thread線程類定義線程對(duì)象 _readThread bool _keepReading;3. 初始化窗體,初始化窗體控件屬性與事件 public FormCOM() InitializeComponent();/該方法中包含窗體中所用空間的屬性和事件4. 點(diǎn)擊 打開串口/關(guān)閉串口 對(duì)應(yīng)的 Click 事件處理 private void button
5、_OpenCOM_Click(object sender, EventArgs e) /button_OpenCOM.Text = button_OpenCOM.Text = "打開串口" ? "關(guān)閉串口" : "打開串口" if (button_OpenCOM.Text = "打開串口") /條件判斷,如果按鈕當(dāng)前的文本為:“打開串口”,則將它的文本改為“關(guān)閉串口”,同時(shí)將pictureBox1.Image屬性更換為D:02.ico,但要保證圖片的路徑正確,否則會(huì)報(bào)異常。 button_OpenCOM.Text
6、= "關(guān)閉串口" button_OpenCOM.BackColor =Color.HotPink; Image img = Image.FromFile("D:02.ico");/路徑要確保正確(位圖文件放在“串口調(diào)試小助手目錄下,需把文件放在D盤,或修改以上路徑?!? / this.pictureBox1.Image. 每次點(diǎn)擊按鈕pictureBox1都對(duì)更換圖片 this.pictureBox1.Image = img; String str_PortName = boBox_ComName.Text.Trim(); SerialPortcom =
7、 new SerialPort(); SerialPortcom.BaudRate = Convert.ToInt32(boBox_Baudrate.Text.Trim();/波特率: 9600;/115200 SerialPortcom.PortName = boBox_ComName.Text.Trim(); try SerialPortcom.Open();/打開串口 catch (UnauthorizedAccessException IOe) /MessageBox.Show(IOe.Message); /textBox_COMStatus.Text=IOe.Message; thi
8、s.listBox_TiShi.Items.Add(IOe.Message); MessageBox.Show(boBox_ComName.Text.Trim() + "串口被占用");/以消息盒的形式彈出警告 return; catch (IOException IOe) /textBox_COMStatus.Text = IOe.Message; /MessageBox.Show(IOe.Message); this.listBox_TiShi.Items.Add(IOe.Message); return; this.listBox_TiShi.Items.Add(st
9、r_PortName + "成功打開串口"); _keepReading = true; _readThread = new Thread(ReadPort); /將讀到的串口數(shù)據(jù)作為參數(shù)送給Thread線程,創(chuàng)建 _readThread 線程對(duì)象,來循環(huán)讀取串口數(shù)據(jù) _readThread.Start(); else button_OpenCOM.Text = "關(guān)閉串口" button_OpenCOM.BackColor =Color.DarkGray; Image img= Image.FromFile("D:01.ico");
10、 this.pictureBox1.Image = img; _keepReading = false; Thread.Sleep(100); ClosePort(SerialPortcom); a打開端口/關(guān)閉串口 事件處理所需要的函數(shù) private void showCOMName() string portList = System.IO.Ports.SerialPort.GetPortNames(); /獲取串口的名稱 comboBox_ComName.Items.Clear(); for (int i = 0; i < portList.Length; +i) string
11、name = portListi; boBox_ComName.Items.Add(name); /關(guān)閉串口的方法 public void ClosePort(SerialPort port) if (port = null) this.listBox_TiShi.Items.Add("串口不存在"); MessageBox.Show("串口不存在,請(qǐng)重新選擇!"); try port.Close(); if (!port.IsOpen) /Console.WriteLine("串口已經(jīng)被關(guān)閉!"); this.listBox_TiS
12、hi.Items.Add(port.PortName + " 成功關(guān)閉"); catch (NullReferenceException) b.讀取串口的事件處理 ,委托與線程 private void ReadPort() while (_keepReading) if (SerialPortcom.IsOpen) try StringBuilder currentline = new StringBuilder(); /循環(huán)接收數(shù)據(jù) while (SerialPortcom.BytesToRead > 0) char ch = (char)SerialPortco
13、m.ReadByte(); currentline.Append(ch); /String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); /在這里對(duì)接收到的數(shù)據(jù)進(jìn)行處理 /-委托 - this.textBox_Read.Invoke( /在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行委托Invoke(Delegate) /即在textBox_ReceiveDate控件的父窗口form中執(zhí)行委托. new MethodInvoker( /*表示一個(gè)委托,該委托可執(zhí)行托管代碼中聲明為 void 且不接受任何參數(shù)
14、的任何方法。 在對(duì)控件的 Invoke 方法進(jìn)行調(diào)用時(shí)或需要一個(gè)簡單委托又不想自己定義時(shí)可以使用該委托。*/ delegate /*匿名方法,C#2.0的新功能,這是一種允許程序員將一段完整代碼區(qū)塊當(dāng)成參數(shù)傳遞的程序代碼編寫技術(shù),通過此種方法可 以直接使用委托來設(shè)計(jì)事件響應(yīng)程序以下就是你要在主線程上實(shí)現(xiàn)的功能但是有一點(diǎn)要注意,這里不適宜處理過多的方法,因?yàn)镃#消息機(jī)制是消息流水線響應(yīng)機(jī)制,如果這里在主線程上處理語句的時(shí)間過長會(huì)導(dǎo)致主UI線程阻塞,停止響應(yīng)或響應(yīng)不順暢,這時(shí)你的主form界面會(huì)延遲或卡死 */ if (currentline.ToString().Length > 0) /
15、this.textBox_Read.Text = currentline.ToString() + "," /this.richTextBox_Read.AppendText(currentline.ToString(); if (checkBox_Show16_1.Checked) this.textBox_Read.Text = ClassFunctions.StrToHexStr(currentline.ToString(); this.richTextBox_Read.AppendText(ClassFunctions.StrToHexStr(currentline
16、.ToString(); else this.textBox_Read.Text = currentline.ToString(); this.richTextBox_Read.AppendText(currentline.ToString(); ) ); /-委托end-/this.textBox_Read.Text = currentline.ToString(); currentline = new StringBuilder(); catch (Exception ex) Console.WriteLine(ex.Message.ToString(); else TimeSpan wa
17、itTime = new TimeSpan(0, 0, 0, 0, 500); /TimeSpan:(系統(tǒng)方法) 將新的 System.TimeSpan 初始化為指定的天數(shù)、小時(shí)數(shù)、分鐘數(shù)、秒數(shù)和 毫秒數(shù)。 Thread.Sleep(waitTime); /主線程休眠500ms等待子線程結(jié)束 try this.listBox_TiShi.Items.Add("線程退出"); catch(Exception) 5. 初始化 SerialPort對(duì)象,檢測(cè)當(dāng)前系統(tǒng)下可用端口,檢測(cè)當(dāng)前用戶相關(guān)配置信息 /初始化SerialPort對(duì)象方法.PortName為COM口名稱,例如&q
18、uot;COM1","COM2"等,注意是string類型 public void InitCOM(string PortName) SerialPortcom = new SerialPort(PortName); SerialPortcom.BaudRate=Convert.ToInt32(boBox_Baudrate.Text.Trim();/波特率 4800,9600,115200,256000 SerialPortcom.Parity = Parity.None;/無奇偶校驗(yàn)位 SerialPortcom.StopBits = StopBits.Two;
19、/兩個(gè)止位 SerialPortcom.Handshake = Handshake.RequestToSend;/控制協(xié)議 SerialPortcom.ReceivedBytesThreshold = 4;/設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù) SerialPortcom.DataReceived+=new SerialDataReceivedEventHandler(port1_DataReceived);/DataReceived事件委托 6.DataReceived事件委托方法 /DataReceived事件委托方法 private void OnDataR
20、eceived(object sender, SerialDataReceivedEventArgs e) try StringBuilder currentline = new StringBuilder(); /循環(huán)接收數(shù)據(jù) while (SerialPortcom.BytesToRead > 0) char ch = (char)SerialPortcom.ReadByte(); currentline.Append(ch); /文本追加 /在這里對(duì)接收到的數(shù)據(jù)進(jìn)行處理 this.textBox_Read.Invoke( /在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行委托Invoke(D
21、elegate) /即在textBox_ReceiveDate控件的父窗口form中執(zhí)行委托. new MethodInvoker( /*表示一個(gè)委托,該委托可執(zhí)行托管代碼中聲明為 void 且不接受任何參數(shù)的任何方法。 在對(duì)控件的 Invoke 方法進(jìn)行調(diào)用時(shí)或需要一個(gè)簡單委托又不想自己定義時(shí)可以使用該委托。*/ delegate /*匿名方法,C#2.0的新功能,這是一種允許程序員將一段完整代碼區(qū)塊當(dāng)成參數(shù)傳遞的程序代碼編寫技術(shù),通過此種方法可 以直接使用委托來設(shè)計(jì)事件響應(yīng)程序以下就是你要在主線程上實(shí)現(xiàn)的功能但是有一點(diǎn)要注意,這里不適宜處理過多的方法,因?yàn)镃#消息機(jī)制是消息流水線響應(yīng)機(jī)制,
22、如果這里在主線程上處理語句的時(shí)間過長會(huì)導(dǎo)致主UI線程阻塞,停止響應(yīng)或響應(yīng)不順暢,這時(shí)你的主form界面會(huì)延遲或卡死 */ this.textBox_Read.Text=currentline.ToString();/輸出到主窗口文本控件 this.richTextBox_Read.AppendText(currentline.ToString();/輸出到主窗口文本控件 +"n" /this.textBox_Read.Text += " " ) ); /this.textBox_Read.Text = currentline.ToString(); cu
23、rrentline = new StringBuilder(); catch (Exception ex) Console.WriteLine(ex.Message.ToString(); / DataReceived事件委托方法 private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e) try StringBuilder currentline = new StringBuilder(); /循環(huán)接收數(shù)據(jù) char ch='0' while (SerialPortcom.Byte
24、sToRead > 0) ch = (char)SerialPortcom.ReadByte(); / currentline.Append(ch); /在這里對(duì)接收到的數(shù)據(jù)進(jìn)行處理 / /- / this.textBox_Read.Invoke( / /在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行委托Invoke(Delegate) / /即在textBox_ReceiveDate控件的父窗口form中執(zhí)行委托. /new MethodInvoker( / /*表示一個(gè)委托,該委托可執(zhí)行托管代碼中聲明為 void 且不接受任何參數(shù)的任何方法。 在對(duì)控件的 Invoke 方法進(jìn)行調(diào)用時(shí)或需要一
25、個(gè)簡單委托又不想自己定義時(shí)可以使用該委托。*/ /delegate / / /*匿名方法,C#2.0的新功能,這是一種允許程序員將一段完整代碼區(qū)塊當(dāng)成參數(shù)傳遞的程序代碼編寫技術(shù),通過此種方法可 以直接使用委托來設(shè)計(jì)事件響應(yīng)程序以下就是你要在主線程上實(shí)現(xiàn)的功能但是有一點(diǎn)要注意,這里不適宜處理過多的方法,因?yàn)镃#消息機(jī)制是消息流水線響應(yīng)機(jī)制,如果這里在主線程上處理語句的時(shí)間過長會(huì)導(dǎo)致主UI線程阻塞,停止響應(yīng)或響應(yīng)不順暢,這時(shí)你的主form界面會(huì)延遲或卡死 */ this.textBox_Read.AppendText(ch.ToString();/輸出到主窗口文本控件 this.textBox_R
26、ead.Text += "kk " currentline = new StringBuilder(); catch(Exception ex) Console.WriteLine(ex.Message.ToString(); 7.數(shù)據(jù)發(fā)送事件處理 private void button_Send_Click(object sender, EventArgs e) String str_Send =this.richTextBox_Send.Text; if (str_Send.Length > 0) / this.WriteCom(SerialPortcom, st
27、r_Send, 3); SendCommand(str_Send, SerialPortcom); /向串口發(fā)送數(shù)據(jù) public void SendCommand(string CommandString, SerialPort port) byte WriteBuffer = Encoding.ASCII.GetBytes(CommandString); /字符編碼,繼承自接口 ICloneable try port.Write(WriteBuffer,0,WriteBuffer.Length);/ port.Write(CommandString); catch(Exception e)
28、 MessageBox.Show("Exception:串口關(guān)閉或被占用n" + e);/如果串口被關(guān)閉或被占用,以消息窗的形式提示“串口被關(guān)閉或被占用”,并打印異常。 8. 寫數(shù)據(jù)操作,利用線程循環(huán)發(fā)送數(shù)據(jù) / <summary> / WriteCom(SerialPort COMport, String CommandString, int num) 寫串口 / 參數(shù):SerialPort COMport:已打開的串口 / String CommandString:需要發(fā)送的數(shù)據(jù), / int num:循環(huán)發(fā)送次數(shù),如果發(fā)送成功則忽略該參數(shù) / 返回值:寫成
29、功則返回"0", / </summary> / <returns></returns> public String WriteCom(SerialPort COMport, String CommandString, int num) String str_Return = "-1" if (COMport = null) | (!COMport.IsOpen) return "Com_Closed" /try / COMport.DiscardInBuffer();/ serialPort.Dis
30、cardInBuffer(); /清空接收緩沖區(qū) COMport.DiscardOutBuffer(); CommandString = CommandString.Trim(); if (CommandString.Length < 1) str_Return = "-1" else byte WriteBuffer = HexStringToByteArray(CommandString); for (int i = 0; i < num; i+) try /COMport.Write(CommandString);/寫指令,該指令返回 00 00 00 6
31、8 00 00 00 53 00 00 AC 67 16 for (int k = 0; k < WriteBuffer.Length && COMport != null; k+) byte WriteBuffer_2 = new byte1; WriteBuffer_20 = WriteBufferk; COMport.Write(WriteBuffer_2, 0, WriteBuffer_2.Length);/ 寫指令,該指令返回 00 00 00 68 00 00 00 53 00 00 AC 67 16/COMport.Write(WriteBuffer, 0,
32、 WriteBuffer.Length);/ 寫指令,該指令返回 00 00 00 68 00 00 00 53 00 00 AC 67 16 /byte WriteBuffer_3 = new byte1; /WriteBuffer_30=Convert .ToByte(WriteBuffer1); /COMport.Write(WriteBuffer_3, 0, WriteBuffer_3.Length); str_Return = "0" break;/發(fā)送成功則跳出for循環(huán) catch (TimeoutException e) str_Return = e.Mes
33、sage; catch (System.IO.IOException e) str_Return = e.Message; return str_Return; a. 數(shù)據(jù)轉(zhuǎn)換,將16進(jìn)制數(shù)轉(zhuǎn)化為字節(jié)型數(shù)據(jù) / <summary> Convert a string of hex digits (ex: E4 CA B2) to a byte array. </summary> / <param name="s"> The string containing the hex digits (with or without spaces).
34、</param> / <returns> Returns an array of bytes. </returns> public static byte HexStringToByteArray(string s) /將 (Hex) 16進(jìn)制的數(shù)據(jù)轉(zhuǎn)化為字節(jié)型數(shù)據(jù) s = s.Replace(" ", ""); /去除空格 if (s.Length < 1) return null; if (s.Length % 2 != 0) s = "0" + s; byte buffer = new
35、bytes.Length / 2;/每兩位為一組,表示1個(gè)字節(jié)。 try for (int i = 0; i < s.Length; i += 2) bufferi / 2 = (byte)Convert.ToByte(s.Substring(i, 2), 16); /將字符轉(zhuǎn)化為字節(jié)類型/每兩位為一組,表示1個(gè)字節(jié)。 SubString 為系統(tǒng)函數(shù),函數(shù)原型如下: public string Substring(int startIndex); / / 摘要: / 從此實(shí)例檢索子字符串。子字符串從指定的字符位置開始且具有指定的長度。 / / 參數(shù): / startIndex: / 此實(shí)
36、例中子字符串的起始字符位置(從零開始)。 / / length: / 子字符串中的字符數(shù)。 / / 返回結(jié)果: / 與此實(shí)例中在 startIndex 處開頭、長度為 length 的子字符串等效的一個(gè)字符串,如果 startIndex 等于此實(shí)例的長度且 length / 為零,則為 System.String.Empty。 / / 異常: / System.ArgumentOutOfRangeException: / startIndex 加 length 之和指示的位置不在此實(shí)例中。- 或 -startIndex 或 length 小于零。 catch (FormatException) return null; return buffer; 9.復(fù)選框:強(qiáng)制轉(zhuǎn)換為16進(jìn)制事件處理private void checkBox_Turn16_1_CheckedChanged(object sender, EventArgs e)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽理工大學(xué)《大學(xué)生心理健康》2021-2022學(xué)年第一學(xué)期期末試卷
- 哈工大建筑工程法規(guī)與合同試題
- 食品安全與營養(yǎng)健康科普大賽
- 2024酒店會(huì)議服務(wù)合同
- 專題11.分析人物形象-2023年四升五語文暑期閱讀專項(xiàng)提升(統(tǒng)編版)
- 2024【外架工操作證】正規(guī)的外架工程班組勞務(wù)包干合同
- 2024家庭保姆雇傭合同新
- 規(guī)劃課題申報(bào)范例:大學(xué)生畢業(yè)實(shí)習(xí)課程化管理的體制機(jī)制建構(gòu)(附可修改技術(shù)路線圖)
- 規(guī)劃課題申報(bào)范例:“雙減”背景下小學(xué)數(shù)學(xué)教學(xué)提質(zhì)增效策略研究(附可修改技術(shù)路線圖)
- 深圳大學(xué)《中國民俗文化》2022-2023學(xué)年第一學(xué)期期末試卷
- 2025屆江蘇省蘇州市第一中學(xué)物理高三第一學(xué)期期末學(xué)業(yè)水平測(cè)試模擬試題含解析
- 企業(yè)財(cái)務(wù)管理數(shù)字化轉(zhuǎn)型實(shí)施方案
- 第九課+發(fā)展中國特色社會(huì)主義文化+課件高中政治統(tǒng)編必修四哲學(xué)與文化
- 牙用漂白凝膠市場(chǎng)環(huán)境與對(duì)策分析
- 2024年山東省濟(jì)南市中考英語試題卷(含答案)
- 人教版七年級(jí)道德與法治上冊(cè) 期中復(fù)習(xí)知識(shí)梳理
- 3.1 農(nóng)業(yè)區(qū)位因素及其變化 課件 高一地理人教版(2019)必修第二冊(cè)
- 建筑施工企業(yè)(安全管理)安全生產(chǎn)管理人員安全生產(chǎn)考試參考題及答案
- 鍋爐應(yīng)急預(yù)案演練方案
- 《11~20各數(shù)的認(rèn)識(shí)》(教案)-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)人教版
- 關(guān)于高技能人才培養(yǎng)問題的思考高技能人才培養(yǎng)方案
評(píng)論
0/150
提交評(píng)論