c#怎么使用线程对串口serialPort进行收发数据(serialport,开发技术)

时间:2024-05-06 07:46:34 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

具体如下:

c#怎么使用线程对串口serialPort进行收发数据

一共写了四种方法,窗体界面都是一样的:

方法一:

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进行收发数据的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:c语言如何实现数组循环左移m位下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18