C#之windows桌面软件第三课:完整的串口调试助手
生活随笔
收集整理的這篇文章主要介紹了
C#之windows桌面软件第三课:完整的串口调试助手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接上一節,這節來編寫一個完整的串口調試助手!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;using System.IO.Ports; namespace SerialCommunicate {public partial class Form1 : Form{public Form1(){InitializeComponent();System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;button3.Enabled = false;}private void button1_Click(object sender, EventArgs e)//打開串口{try{serialPort1.PortName = comboBox1.Text;//把選擇的串口名賦給串口serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text,10);//波特率一開始讀出的是字符串形式,所以要把字符串轉換成十進制數據。serialPort1.Open();//打開串口button1.Enabled = false;//打開串口按鈕不可用button2.Enabled = true;//關閉串口}catch {MessageBox.Show("端口錯誤,請檢查串口", "錯誤");}}private void Form1_Load(object sender, EventArgs e){for (int i = 1; i < 20; i++)//添加19個串口號。也可以在,屬性-》items集合 中添加。{comboBox1.Items.Add("COM" + i.ToString());}comboBox1.Text = "COM1";//串口號多額默認值comboBox2.Text = "4800";//波特率默認值/*****************非常重要************************/serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必須手動添加事件處理程序}/******************接收部分**********************************/private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口數據接收事件{if (!radioButton3.Checked)//如果接收模式為字符模式{string str = serialPort1.ReadExisting();//字符串方式讀textBox1.AppendText(str);//添加內容。AppendText函數等同:textBox1.Text += str;即在尾部添加,不清空前面接收的字符}else { //如果接收模式為數值接收byte data;data = (byte)serialPort1.ReadByte();//此處需要強制類型轉換,將(int)類型數據轉換為(byte類型數據,不必考慮是否會丟失數據string str = Convert.ToString(data, 16).ToUpper();//轉換為大寫十六進制字符串textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位補“0” //上一句等同為:if(str.Length == 1)// str = "0" + str;// else // str = str;// textBox1.AppendText("0x" + str);}}private void radioButton2_CheckedChanged(object sender, EventArgs e){}private void button2_Click(object sender, EventArgs e)//關閉串口{try{serialPort1.Close();//關閉串口button1.Enabled = true;//打開串口按鈕可用button2.Enabled = false;//關閉串口按鈕不可用}catch//一般情況下關閉串口不會出錯,所以不需要加處理程序{}}/******************發送部分**********************************/private void button3_Click(object sender, EventArgs e){byte[] Data = new byte[1];//單字節發送if (serialPort1.IsOpen)//判斷串口是否打開,如果打開執行下一步操作{if (textBox2.Text != "")//如果發送內容為空,不做反應{button3.Enabled = false;}else{button3.Enabled = true;if (!radioButton1.Checked)//如果發送模式是字符模式{try{serialPort1.WriteLine(textBox2.Text);//寫數據}catch{MessageBox.Show("串口數據寫入錯誤", "錯誤");//出錯提示serialPort1.Close();button1.Enabled = true;//打開串口按鈕可用button2.Enabled = false;//關閉串口按鈕不可用}}else//如果發送模式是數值模式{/****處理偶數個數****/for (int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i++)//取余3運算作用是防止用戶輸入的字符為奇數個{Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);serialPort1.Write(Data, 0, 1);//循環發送(如果輸入字符為0A0BB,則只發送0A,0B)}/****處理奇數個數****/if (textBox2.Text.Length % 2 != 0)//剩下一位單獨處理{//Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - TextBox2.Text.Length % 2, TextBox2.Text.Length % 2), 16);Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);//單獨發送B(0B)serialPort1.Write(Data, 0, 1);//發送}} }}}private void textBox1_TextChanged(object sender, EventArgs e)//文本控件內容改變事件{//textBox1.ScrollToCaret();//將滾動條調至最下。但此版本默認此功能。}} }
www.DoYoung.net(部分代碼來至杜洋工作室)
總結
以上是生活随笔為你收集整理的C#之windows桌面软件第三课:完整的串口调试助手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微分先行PID控制算法用C语言实现!
- 下一篇: 迟来的二维数组基础