C#實(shí)現(xiàn)簡(jiǎn)單串口通訊實(shí)例
本文實(shí)例為大家分享了C#實(shí)現(xiàn)簡(jiǎn)單串口通訊的具體代碼,供大家參考,具體內(nèi)容如下
參數(shù)設(shè)置界面代碼:
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 ComDemo { ? ? public partial class ComSet : Form ? ? { ? ? ? ? public ComSet() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? private void ComSet_Load(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? //串口 ? ? ? ? ? ? string[] ports = SerialPort.GetPortNames(); ? ? ? ? ? ? foreach (string port in ports) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? cmbPort.Items.Add(port); ? ? ? ? ? ? } ? ? ? ? ? ? cmbPort.SelectedIndex = 0; ? ? ? ? ? ? //波特率 ? ? ? ? ? ? cmbBaudRate.Items.Add("110"); ? ? ? ? ? ? cmbBaudRate.Items.Add("300"); ? ? ? ? ? ? cmbBaudRate.Items.Add("1200"); ? ? ? ? ? ? cmbBaudRate.Items.Add("2400"); ? ? ? ? ? ? cmbBaudRate.Items.Add("4800"); ? ? ? ? ? ? cmbBaudRate.Items.Add("9600"); ? ? ? ? ? ? cmbBaudRate.Items.Add("19200"); ? ? ? ? ? ? cmbBaudRate.Items.Add("38400"); ? ? ? ? ? ? cmbBaudRate.Items.Add("57600"); ? ? ? ? ? ? cmbBaudRate.Items.Add("115200"); ? ? ? ? ? ? cmbBaudRate.Items.Add("230400"); ? ? ? ? ? ? cmbBaudRate.Items.Add("460800"); ? ? ? ? ? ? cmbBaudRate.Items.Add("921600"); ? ? ? ? ? ? cmbBaudRate.SelectedIndex = 5; ? ? ? ? ? ? //數(shù)據(jù)位 ? ? ? ? ? ? cmbDataBits.Items.Add("5"); ? ? ? ? ? ? cmbDataBits.Items.Add("6"); ? ? ? ? ? ? cmbDataBits.Items.Add("7"); ? ? ? ? ? ? cmbDataBits.Items.Add("8"); ? ? ? ? ? ? cmbDataBits.SelectedIndex = 3; ? ? ? ? ? ? //停止位 ? ? ? ? ? ? cmbStopBit.Items.Add("1"); ? ? ? ? ? ? cmbStopBit.SelectedIndex = 0; ? ? ? ? ? ? //佼驗(yàn)位 ? ? ? ? ? ? cmbParity.Items.Add("無(wú)"); ? ? ? ? ? ? cmbParity.SelectedIndex = 0; ? ? ? ? } ? ? ? ? private void bntOK_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? //以下4個(gè)參數(shù)都是從窗體MainForm傳入的 ? ? ? ? ? ? MainForm.strProtName = cmbPort.Text; ? ? ? ? ? ? MainForm.strBaudRate = cmbBaudRate.Text; ? ? ? ? ? ? MainForm.strDataBits = cmbDataBits.Text; ? ? ? ? ? ? MainForm.strStopBits = cmbStopBit.Text; ? ? ? ? ? ? DialogResult = DialogResult.OK; ? ? ? ? } ? ? ? ? private void bntCancel_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? DialogResult = DialogResult.Cancel; ? ? ? ? } ? ? } }
主界面代碼:
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; using System.IO; using System.Threading; namespace ComDemo { ? ? public partial class MainForm : Form ? ? { ? ? ? ? public MainForm() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? private Thread getRecevice; ? ? ? ? protected Boolean stop = false; ? ? ? ? protected Boolean conState = false; ? ? ? ? private StreamReader sRead; ? ? ? ? string strRecieve; ? ? ? ? bool bAccpet = false; ? ? ? ? SerialPort sp = new SerialPort();//實(shí)例化串口通訊類 ? ? ? ? //以下定義4個(gè)公有變量,用于參數(shù)傳遞 ? ? ? ? public static string strProtName = ""; ? ? ? ? public static string strBaudRate = ""; ? ? ? ? public static string strDataBits = ""; ? ? ? ? public static string strStopBits = ""; ? ? ? ? private void MainForm_Load(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? groupBox1.Enabled = false; ? ? ? ? ? ? groupBox2.Enabled = false; ? ? ? ? ? ? this.toolStripStatusLabel1.Text = "端口號(hào):端口未打開(kāi) | "; ? ? ? ? ? ? this.toolStripStatusLabel2.Text = "波特率:端口未打開(kāi) | "; ? ? ? ? ? ? this.toolStripStatusLabel3.Text = "數(shù)據(jù)位:端口未打開(kāi) | "; ? ? ? ? ? ? this.toolStripStatusLabel4.Text = "停止位:端口未打開(kāi) | "; ? ? ? ? ? ? this.toolStripStatusLabel5.Text = ""; ? ? ? ? } ? ? ? ? //串口設(shè)計(jì) ? ? ? ? private void btnSetSP_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? timer1.Enabled = false; ? ? ? ? ? ? sp.Close(); ? ? ? ? ? ? ComSet dlg = new ComSet(); ? ? ? ? ? ? if (dlg.ShowDialog() == DialogResult.OK) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? sp.PortName = strProtName;//串口號(hào) ? ? ? ? ? ? ? ? sp.BaudRate = int.Parse(strBaudRate);//波特率 ? ? ? ? ? ? ? ? sp.DataBits = int.Parse(strDataBits);//數(shù)據(jù)位 ? ? ? ? ? ? ? ? sp.StopBits = (StopBits)int.Parse(strStopBits);//停止位 ? ? ? ? ? ? ? ? sp.ReadTimeout = 500;//讀取數(shù)據(jù)的超時(shí)時(shí)間,引發(fā)ReadExisting異常 ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //打開(kāi)/關(guān)閉串口 ? ? ? ? private void bntSwitchSP_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if (bntSwitchSP.Text == "打開(kāi)串口") ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (strProtName != "" && strBaudRate != "" && strDataBits != "" && strStopBits != "") ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (sp.IsOpen) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? sp.Close(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? sp.Open();//打開(kāi)串口 ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? sp.Open();//打開(kāi)串口 ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? bntSwitchSP.Text = "關(guān)閉串口"; ? ? ? ? ? ? ? ? ? ? ? ? groupBox1.Enabled = true; ? ? ? ? ? ? ? ? ? ? ? ? groupBox2.Enabled = true; ? ? ? ? ? ? ? ? ? ? ? ? this.toolStripStatusLabel1.Text = "端口號(hào):" + sp.PortName + " | "; ? ? ? ? ? ? ? ? ? ? ? ? this.toolStripStatusLabel2.Text = "波特率:" + sp.BaudRate + " | "; ? ? ? ? ? ? ? ? ? ? ? ? this.toolStripStatusLabel3.Text = "數(shù)據(jù)位:" + sp.DataBits + " | "; ? ? ? ? ? ? ? ? ? ? ? ? this.toolStripStatusLabel4.Text = "停止位:" + sp.StopBits + " | "; ? ? ? ? ? ? ? ? ? ? ? ? this.toolStripStatusLabel5.Text = ""; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? MessageBox.Show("錯(cuò)誤:" + ex.Message, "C#串口通信"); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? MessageBox.Show("請(qǐng)先設(shè)置串口!", "RS232串口通信"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? timer1.Enabled = false; ? ? ? ? ? ? ? ? timer2.Enabled = false; ? ? ? ? ? ? ? ? bntSwitchSP.Text = "打開(kāi)串口"; ? ? ? ? ? ? ? ? if (sp.IsOpen) ? ? ? ? ? ? ? ? ? ? sp.Close(); ? ? ? ? ? ? ? ? groupBox1.Enabled = false; ? ? ? ? ? ? ? ? groupBox2.Enabled = false; ? ? ? ? ? ? ? ? this.toolStripStatusLabel1.Text = "端口號(hào):端口未打開(kāi) | "; ? ? ? ? ? ? ? ? this.toolStripStatusLabel2.Text = "波特率:端口未打開(kāi) | "; ? ? ? ? ? ? ? ? this.toolStripStatusLabel3.Text = "數(shù)據(jù)位:端口未打開(kāi) | "; ? ? ? ? ? ? ? ? this.toolStripStatusLabel4.Text = "停止位:端口未打開(kāi) | "; ? ? ? ? ? ? ? ? this.toolStripStatusLabel5.Text = ""; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //發(fā)送數(shù)據(jù) ? ? ? ? private void bntSendData_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if (sp.IsOpen) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? sp.Encoding = System.Text.Encoding.GetEncoding("GB2312"); ? ? ? ? ? ? ? ? ? ? sp.Write(txtSend.Text);//發(fā)送數(shù)據(jù) ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? MessageBox.Show("錯(cuò)誤:" + ex.Message); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MessageBox.Show("請(qǐng)先打開(kāi)串口!"); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //選擇文件 ? ? ? ? private void btnOpenFile_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? OpenFileDialog open = new OpenFileDialog(); ? ? ? ? ? ? open.InitialDirectory = "c\\"; ? ? ? ? ? ? open.RestoreDirectory = true; ? ? ? ? ? ? open.FilterIndex = 1; ? ? ? ? ? ? open.Filter = "txt文件(*.txt)|*.txt"; ? ? ? ? ? ? if (open.ShowDialog() == DialogResult.OK) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? if (open.OpenFile() != null) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? txtFileName.Text = open.FileName; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch (Exception err1) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? MessageBox.Show("文件打開(kāi)錯(cuò)誤! ?" + err1.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //發(fā)送文件內(nèi)容 ? ? ? ? private void bntSendFile_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? string fileName = txtFileName.Text.Trim(); ? ? ? ? ? ? if (fileName == "") ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MessageBox.Show("請(qǐng)選擇要發(fā)送的文件!", "Error"); ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //sRead = new StreamReader(fileName); ? ? ? ? ? ? ? ? sRead = new StreamReader(fileName,Encoding.Default);//解決中文亂碼問(wèn)題 ? ? ? ? ? ? } ? ? ? ? ? ? timer1.Start(); ? ? ? ? } ? ? ? ? //發(fā)送文件時(shí)鐘 ? ? ? ? private void timer1_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? string str1; ? ? ? ? ? ? str1 = sRead.ReadLine(); ? ? ? ? ? ? if (str1 == null) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? timer1.Stop(); ? ? ? ? ? ? ? ? sRead.Close(); ? ? ? ? ? ? ? ? MessageBox.Show("文件發(fā)送成功!", "C#串口通訊"); ? ? ? ? ? ? ? ? this.toolStripStatusLabel5.Text = ""; ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? ? ? byte[] data = Encoding.Default.GetBytes(str1); ? ? ? ? ? ? sp.Write(data, 0, data.Length); ? ? ? ? ? ? this.toolStripStatusLabel5.Text = " ? 文件發(fā)送中..."; ? ? ? ? } ? ? ? ? //接收數(shù)據(jù) ? ? ? ? private void btnReceiveData_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if (btnReceiveData.Text == "接收數(shù)據(jù)") ? ? ? ? ? ? { ? ? ? ? ? ? ? ? sp.Encoding = Encoding.GetEncoding("GB2312"); ? ? ? ? ? ? ? ? if (sp.IsOpen) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //timer2.Enabled = true; //使用主線程進(jìn)行 ? ? ? ? ? ? ? ? ? ? //使用委托以及多線程進(jìn)行 ? ? ? ? ? ? ? ? ? ? bAccpet = true; ? ? ? ? ? ? ? ? ? ? getRecevice = new Thread(new ThreadStart(testDelegate)); ? ? ? ? ? ? ? ? ? ? //getRecevice.IsBackground = true; ? ? ? ? ? ? ? ? ? ? getRecevice.Start(); ? ? ? ? ? ? ? ? ? ? btnReceiveData.Text = "停止接收"; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? MessageBox.Show("請(qǐng)先打開(kāi)串口"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //timer2.Enabled = false; ? ? ? ? ? ? ? ? bAccpet = false; ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? //停止主監(jiān)聽(tīng)線程 ? ? ? ? ? ? ? ? ? ? if (null != getRecevice) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? if (getRecevice.IsAlive) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!getRecevice.Join(100)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //關(guān)閉線程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? getRecevice.Abort(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? getRecevice = null; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch { } ? ? ? ? ? ? ? ? btnReceiveData.Text = "接收數(shù)據(jù)"; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? private void testDelegate() ? ? ? ? { ? ? ? ? ? ? reaction r = new reaction(fun); ? ? ? ? ? ? r(); ? ? ? ? } ? ? ? ? //用于接收數(shù)據(jù)的定時(shí)時(shí)鐘 ? ? ? ? private void timer2_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? string str = sp.ReadExisting(); ? ? ? ? ? ? string str2 = str.Replace("\r", "\r\n"); ? ? ? ? ? ? txtReceiveData.AppendText(str2); ? ? ? ? ? ? txtReceiveData.ScrollToCaret(); ? ? ? ? } ? ? ? ? //下面用到了接收信息的代理功能,此為設(shè)計(jì)的要點(diǎn)之一 ? ? ? ? delegate void DelegateAcceptData(); ? ? ? ? void fun() ? ? ? ? { ? ? ? ? ? ? while (bAccpet) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? AcceptData(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? delegate void reaction(); ? ? ? ? void AcceptData() ? ? ? ? { ? ? ? ? ? ? if (txtReceiveData.InvokeRequired) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? DelegateAcceptData ddd = new DelegateAcceptData(AcceptData); ? ? ? ? ? ? ? ? ? ? this.Invoke(ddd, new object[] { }); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch { } ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? try ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? strRecieve = sp.ReadExisting(); ? ? ? ? ? ? ? ? ? ? txtReceiveData.AppendText(strRecieve); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? catch (Exception ex) { } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? private void bntClear_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? txtReceiveData.Text = ""; ? ? ? ? } ? ? ? ? private void button3_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? string path = Directory.GetCurrentDirectory() + @"\output.txt"; ? ? ? ? ? ? ? ? string content = this.txtReceiveData.Text; ? ? ? ? ? ? ? ? FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); ? ? ? ? ? ? ? ? StreamWriter write = new StreamWriter(fs); ? ? ? ? ? ? ? ? write.Write(content); ? ? ? ? ? ? ? ? write.Flush(); ? ? ? ? ? ? ? ? write.Close(); ? ? ? ? ? ? ? ? fs.Close(); ? ? ? ? ? ? ? ? MessageBox.Show("接收信息導(dǎo)出在:" + path); ? ? ? ? ? ? } ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MessageBox.Show(ex.Message); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
效果圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
unity通過(guò)Mesh網(wǎng)格繪制圖形球體
這篇文章主要為大家詳細(xì)介紹了unity通過(guò)Mesh網(wǎng)格繪制圖形球體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線性化PDF
線性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。這篇文章主要介紹了如何通過(guò)C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線性化PDF,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12C#獲取HTML文本的第一張圖片與截取內(nèi)容摘要示例代碼
在日常web開(kāi)發(fā)的時(shí)候,經(jīng)常會(huì)遇到需要獲取保存的HTML文本中的第一張圖片,并且截取內(nèi)容摘要的效果,例如織夢(mèng)的后臺(tái)添加完詳細(xì)內(nèi)容后就是自動(dòng)讀取內(nèi)容摘要,并保存第一張圖片為縮略圖,那么這篇文章跟大家分享下利用C#如何實(shí)現(xiàn),感興趣的朋友們下面來(lái)一起看看吧。2016-10-10C#內(nèi)置隊(duì)列類Queue用法實(shí)例
這篇文章主要介紹了C#內(nèi)置隊(duì)列類Queue用法,實(shí)例分析了C#內(nèi)置隊(duì)列的添加、移除等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04C#中DataSet,DataTable,DataView的區(qū)別與用法
這篇文章介紹了C#中DataSet,DataTable,DataView的區(qū)別與用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡(jiǎn)單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07