c#怎么使用线程对串口serialPort进行收发数据
导读:本文共7220字符,通常情况下阅读需要24分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 具体如下:一共写了四种方法,窗体界面都是一样的:方法一:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;u... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。具体如下:
一共写了四种方法,窗体界面都是一样的:
方法一:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceserialPort_0620{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();//不进行跨线程安全检查System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;}privatevoidForm1_Load(objectsender,EventArgse){//检查是否含有串口string[]str=SerialPort.GetPortNames();for(inti=0;i<str.Length;i++){comboBox1.Items.Add(str[i]);}button2.Enabled=false;button3.Enabled=false;button4.Enabled=false;dataGridView1.Rows.Add(68);//标序号for(inti=0;i<69;i++){dataGridView1.Rows[i].Cells[0].Value=i;}}///<summary>///打开串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){if(serialPort1.IsOpen){MessageBox.Show("串口已打开");}elseif(comboBox1.Text==""){MessageBox.Show("请选择端口!");}elseif(textBox1.Text==""){MessageBox.Show("请输入波特率!");}else{serialPort1.PortName=comboBox1.Text;serialPort1.BaudRate=Convert.ToInt16(textBox1.Text);serialPort1.Open();button1.Enabled=false;button2.Enabled=true;button3.Enabled=true;button4.Enabled=true;}}///<summary>///发送数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton3_Click(objectsender,EventArgse){if(textBox1.Text==""){MessageBox.Show("请输入要发送的数据");}else{serialPort1.WriteLine(textBox2.Text);stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);inta=listBox1.Items.Count;listBox1.SelectedIndex=listBox1.Items.Count-1;}}///<summary>///接收数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton4_Click(objectsender,EventArgse){}///<summary>///关闭串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton2_Click(objectsender,EventArgse){serialPort1.Close();button1.Enabled=true;}Threadthread;///<summary>///开始///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton5_Click(objectsender,EventArgse){if(false==serialPort1.IsOpen){MessageBox.Show("端口未打开");}else{thread=newThread(newThreadStart(PrintEven));thread.Start();}}privatevoidPrintEven(){while(true){if(textBox2.Text==""){MessageBox.Show("请输入要发送的数据");}else{if(serialPort1.IsOpen){serialPort1.WriteLine(textBox2.Text);stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);listBox1.SelectedIndex=listBox1.Items.Count-1;for(inti=0;i<47;i++){string[]result=data.Split(',');dataGridView1.Rows[i].Cells[1].Value=result[i+1];dataGridView1.Rows[i].Cells[2].Value=Convert.ToDouble(result[i+1])*5.0/1024.0;}}Thread.Sleep(5000);}}}///<summary>///结束///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton6_Click(objectsender,EventArgse){thread.Abort();}}}//不进行跨线程安全检查
方法二:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceserialPort_0620{publicpartialclassForm2:Form{publicForm2(){InitializeComponent();}privatevoidForm2_Load(objectsender,EventArgse){string[]str=SerialPort.GetPortNames();for(inti=0;i<str.Length;i++){comboBox1.Items.Add(str[i]);}button2.Enabled=false;button3.Enabled=false;button4.Enabled=false;dataGridView1.Rows.Add(68);//标序号for(inti=0;i<69;i++){dataGridView1.Rows[i].Cells[0].Value=i;}}///<summary>///打开串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){if(serialPort1.IsOpen){MessageBox.Show("串口已打开");}elseif(comboBox1.Text==""){MessageBox.Show("请选择端口!");}elseif(textBox1.Text==""){MessageBox.Show("请输入波特率!");}else{serialPort1.PortName=comboBox1.Text;serialPort1.BaudRate=Convert.ToInt16(textBox1.Text);serialPort1.Open();button1.Enabled=false;button2.Enabled=true;button3.Enabled=true;button4.Enabled=true;}}privatevoidbutton2_Click(objectsender,EventArgse){serialPort1.Close();button1.Enabled=true;}privatevoidbutton3_Click(objectsender,EventArgse){if(textBox1.Text==""){MessageBox.Show("请输入要发送的数据");}else{serialPort1.WriteLine(textBox2.Text);}}privatevoidbutton4_Click(objectsender,EventArgse){stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);inta=listBox1.Items.Count;listBox1.SelectedIndex=listBox1.Items.Count-1;}//创建线程Threadthread;//建立委托publicdelegatevoidSetTextHandler(stringresult);privatevoidsetItem(stringresult){if(listBox1.InvokeRequired==true){SetTextHandlersetTextHandler=setItem;listBox1.Invoke(setTextHandler,newobject[]{result});}else{listBox1.Items.Add(result);listBox1.SelectedIndex=listBox1.Items.Count-1;}}privatevoidbutton5_Click(objectsender,EventArgse){if(false==serialPort1.IsOpen){MessageBox.Show("端口未打开");}else{thread=newThread(newThreadStart(PrintEven));thread.Start();}}privatevoidPrintEven(){while(true){if(textBox2.Text==""){MessageBox.Show("请输入要发送的数据");}else{if(serialPort1.IsOpen){serialPort1.WriteLine(textBox2.Text);stringdata=serialPort1.ReadLine();setItem(data);for(inti=0;i<47;i++){string[]result=data.Split(',');dataGridView1.Rows[i].Cells[1].Value=result[i+1];dataGridView1.Rows[i].Cells[2].Value=Convert.ToDouble(result[i+1])*5.0/1024.0;}}Thread.Sleep(5000);}}}///<summary>///结束///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton6_Click(objectsender,EventArgse){thread.Abort();}}}//建立委托(参考网上很规范的写法)
方法三:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceserialPort_0620{publicpartialclassForm3:Form{publicForm3(){InitializeComponent();}privatevoidForm3_Load(objectsender,EventArgse){string[]str=SerialPort.GetPortNames();for(inti=0;i<str.Length;i++){comboBox1.Items.Add(str[i]);}button2.Enabled=false;button3.Enabled=false;button4.Enabled=false;dataGridView1.Rows.Add(68);//标序号for(inti=0;i<69;i++){dataGridView1.Rows[i].Cells[0].Value=i;}}///<summary>///打开串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){if(serialPort1.IsOpen){MessageBox.Show("串口已打开");}elseif(comboBox1.Text==""){MessageBox.Show("请选择端口!");}elseif(textBox1.Text==""){MessageBox.Show("请输入波特率!");}else{serialPort1.PortName=comboBox1.Text;serialPort1.BaudRate=Convert.ToInt16(textBox1.Text);serialPort1.Open();button1.Enabled=false;button2.Enabled=true;button3.Enabled=true;button4.Enabled=true;}}///<summary>///关闭串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton2_Click(objectsender,EventArgse){serialPort1.Close();button1.Enabled=true;}///<summary>///发送数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton3_Click(objectsender,EventArgse){if(textBox1.Text==""){MessageBox.Show("请输入要发送的数据");}else{serialPort1.WriteLine(textBox2.Text);}}///<summary>///接收数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton4_Click(objectsender,EventArgse){stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);inta=listBox1.Items.Count;listBox1.SelectedIndex=listBox1.Items.Count-1;}//创建线程Threadthread;///<summary>///开始///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton5_Click(objectsender,EventArgse){if(false==serialPort1.IsOpen){MessageBox.Show("端口未打开");}else{thread=newThread(newThreadStart(PrintEven));thread.Start();}}privatevoidPrintEven(){while(true){if(textBox2.Text==""){MessageBox.Show("请输入要发送的数据");}else{if(serialPort1.IsOpen){serialPort1.WriteLine(textBox2.Text);stringdata=serialPort1.ReadLine();//setItem(data);listBox1.Invoke(newAction(()=>{listBox1.Items.Add(data);listBox1.SelectedIndex=listBox1.Items.Count-1;for(inti=0;i<47;i++){string[]result=data.Split(',');dataGridView1.Rows[i].Cells[1].Value=result[i+1];dataGridView1.Rows[i].Cells[2].Value=Convert.ToDouble(result[i+1])*5.0/1024.0;}}));}Thread.Sleep(5000);}}}privatevoidbutton6_Click(objectsender,EventArgse){}}}//第二种委托更常用
方法四:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Threading;usingSystem.IO.Ports;namespaceserialPort_0620{publicpartialclassForm4:Form{publicForm4(){InitializeComponent();}privatevoidForm4_Load(objectsender,EventArgse){string[]str=SerialPort.GetPortNames();for(inti=0;i<str.Length;i++){comboBox1.Items.Add(str[i]);}button2.Enabled=false;button3.Enabled=false;button4.Enabled=false;dataGridView1.Rows.Add(68);//标序号for(inti=0;i<69;i++){dataGridView1.Rows[i].Cells[0].Value=i;}}///<summary>///打开串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){if(serialPort1.IsOpen){MessageBox.Show("串口已打开");}elseif(comboBox1.Text==""){MessageBox.Show("请选择端口!");}elseif(textBox1.Text==""){MessageBox.Show("请输入波特率!");}else{serialPort1.PortName=comboBox1.Text;serialPort1.BaudRate=Convert.ToInt16(textBox1.Text);serialPort1.Open();button1.Enabled=false;button2.Enabled=true;button3.Enabled=true;button4.Enabled=true;}}///<summary>///关闭串口///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton2_Click(objectsender,EventArgse){serialPort1.Close();button1.Enabled=true;}///<summary>///发送数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton3_Click(objectsender,EventArgse){if(textBox1.Text==""){MessageBox.Show("请输入要发送的数据");}else{serialPort1.WriteLine(textBox2.Text);}}///<summary>///接收数据///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton4_Click(objectsender,EventArgse){stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);inta=listBox1.Items.Count;listBox1.SelectedIndex=listBox1.Items.Count-1;}//创建线程Threadthread;///<summary>///开始///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton5_Click(objectsender,EventArgse){if(false==serialPort1.IsOpen){MessageBox.Show("端口未打开");}else{thread=newThread(newThreadStart(PrintEven));thread.Start();}}privatevoidPrintEven(){while(true){if(textBox2.Text==""){MessageBox.Show("请输入要发送的数据");}else{if(serialPort1.IsOpen){listBox1.Invoke(newAction(set));}Thread.Sleep(5000);}}}voidset(){serialPort1.WriteLine(textBox2.Text);stringdata=serialPort1.ReadLine();listBox1.Items.Add(data);listBox1.SelectedIndex=listBox1.Items.Count-1;for(inti=0;i<47;i++){string[]result=data.Split(',');dataGridView1.Rows[i].Cells[1].Value=result[i+1];dataGridView1.Rows[i].Cells[2].Value=Convert.ToDouble(result[i+1])*5.0/1024.0;}}///<summary>///结束///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton6_Click(objectsender,EventArgse){thread.Abort();}}}//建立委托,invoke的第二种写法
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
c#怎么使用线程对串口serialPort进行收发数据的详细内容,希望对您有所帮助,信息来源于网络。