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.Text.RegularExpressions; using System.IO.Ports; namespace SerialPort { public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void CmdSend_Click(object sender, EventArgs e) { string outdata = TextSend.Text; if (!string.IsNullOrEmpty(outdata)) { serialPort1.Write(outdata); } } private void Form3_Load(object sender, EventArgs e) { serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; serialPort1.Open(); serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string SDateTemp = this.serialPort1.ReadExisting(); if (!string.IsNullOrEmpty(SDateTemp)) { SDateTemp = GetValue(SDateTemp, "GS", "kg").Trim(); //多少kg } //读取串口中一个字节的数据 this.TextReceive.Invoke( //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate) //即在textBox_ReceiveDate控件的父窗口form中执行委托. new MethodInvoker( /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 * 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/ delegate { /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术, * 通过此种方法可 以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意, * 这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制, * 如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */ this.TextReceive.AppendText(SDateTemp);//输出到主窗口文本控件 this.TextReceive.Text += " "; } ) ); } private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); } } #region 获得字符串中开始和结束字符串之间的值 /// <summary> /// 获得字符串中开始和结束字符串之间的值 /// </summary> /// <param name="str">字符串</param> /// <param name="s">开始</param> /// <param name="e">结束</param> /// <returns></returns> public static string GetValue(string str, string s, string e) { Regex rg = new Regex("(?<=(" + s + "))[.\s\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline); return rg.Match(str).Value; } #endregion } }