C#串口操作小程序工作上需要用到上位机跟板件上的单片机进行数据交互,所以就用C#编制了一个简单的串口信息收发程序。界面如下:因为本人单片机程序就比较熟,WINDOWS编程不大懂,只是之前用C#做过一两个小小的测试程序练过手,而且vs2010进行界面程序开发还是比较简单,所以就果断用这个工具跟C#来进行开发,大神勿喷。开发过程中遇到的一个问题是串口的接收。串口接收大体来说有两个方式,一个是同步读取,也即利用循环不断的读串口缓存,另外一个就是利用事件触发的方式。第一种方法效率低,不推荐,第二种则需要利用到跨线程的内容。本人就是卡在这里一天,其实也就10来句代码的事,无奈自己玩这个没得请教,只有求助万能的百度。经过一天多断续的摸索,终于解决了这个问题。特地写了这个文稿,方便另外一些跟我一样菜的菜鸟。/(ㄒoㄒ)/~~。在贴上代码前,先解释一下代码中会用到的一些控件的名称。1、cmbportname:设置串口号的下拉列表2、cmbbaudrate:设置波特率的下来列表3、bttopenport:打开/关闭串口的动作按钮4、txSend:要发送的数据显示文本框5、bttSend:发送那妞6、txrecieve:接收到的数据显示文本框7、bttClear:清空接收数据的按钮涂黄的代码关系到异步接收数据,只要照着那几个涂黄的代码改一下,应该就可以实现了功能了。需要完整代码的也可以发邮件给我,lmhseason@126.com。代码中的SP是从工具箱拖进来的一个serialport控件。代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}publicdelegatevoidgetstring(stringdataRe);//定义委托getstringgetmystring;//定义委托变量privatevoidDoUpdate(stringdata){tbRecieve.Text=tbRecieve.Text+data;//数据处理,将当前数据与文本框文本合并if(label5.BackColor==Color.AliceBlue)//改变lable的颜色,提示收到数据{label5.BackColor=Color.Black;}elselabel5.BackColor=Color.AliceBlue;}voidSP_DataReceived(objectsender,SerialDataReceivedEventArgse)//接收事件触发方法{try{stringmystring=SP.ReadExisting();getmystring=newgetstring(DoUpdate);Invoke(getmystring,mystring);}catch(ExceptionEX){MessageBox.Show(EX.Message,出错,MessageBoxButtons.OK,MessageBoxIcon.Error);return;}}privatevoidbttOpenPort_Click(objectsender,EventArgse)//打开串口按钮单击事件函数{try{if(SP.IsOpen==true)//如果当前串口是处于打开状态,则单击按钮为关闭串口动作{cmbPortName.Enabled=true;//使能串口号获取控件cmbBaudRate.Enabled=true;//使能波特率设置控件bttSend.Enabled=false;//关闭发送数据按钮SP.Close();//关闭串口bttOpenPort.Text=打开串口;//将打开按钮文字改为打开串口}elseif(SP.IsOpen==false)//如果当前串口是处于关闭状态,则单击按钮为打开串口动作{cmbPortName.Enabled=false;//关闭串口号获取控件cmbBaudRate.Enabled=false;//关闭波特率设置控件bttOpenPort.Text=关闭串口;//将打开按钮文字改为关闭串口SP.BaudRate=Convert.ToInt16(cmbBaudRate.SelectedItem);//设置波特率为对应combox的选择项,强制转换成int型SP.PortName=cmbPortName.SelectedItem.ToString();//串口号设置成串口号获取控件当前选择项,强制转换成stringSP.StopBits=StopBits.One;//停止位1位SP.Parity=0;//校验,无SP.DataBits=8;//数据位,8位SP.ReceivedBytesThreshold=10;//接收数据事件触发门限,设为10,可根据需要设置SP.Open();//打开串口bttSend.Enabled=true;//使能发送数据按钮SP.DataReceived+=newSerialDataReceivedEventHandler(SP_DataReceived);//添加数据接收事件}}catch(ExceptionEX){MessageBox.Show(EX.Message,出错,MessageBoxButtons.OK,MessageBoxIcon.Error);return;}}privatevoidbttSend_Click(objectsender,EventArgse){try{SP.Write(tbSend.Text);}catch(ExceptionEX){MessageBox.Show(EX.Message,出错,MessageBoxButtons.OK,MessageBoxIcon.Error);return;}}//串口号选择combox鼠标点击事件,为了获取电脑当前有的串口号,并将其添加到combox列表中//privatevoidbttGetPort_Click(objectsender,EventArgse){string[]Ports=SerialPort.GetPortNames();Array.Sort(Ports);cmbPortName.Items.AddRange(Ports);cmbPortName.SelectedIndex=cmbPortName.Items.Count0?0:-1;cmbBaudRate.SelectedIndex=cmbBaudRate.Items.IndexOf(9600);tbSend.Text=Ports[1];}privatevoidbttClear_Click(objectsender,EventArgse)//清空数据按钮点击事件{tbRecieve.Text=string.Empty;//清空文本框文本内容}}}