工作上需要用到上位机进行数据交互,所以就用C#编制了一个简单的串口信息收发程序。界面如下:
开发过程中遇到的一个问题是串口的接收。串口接收大体来说有两个方式,一个是同步读取,也即利用循环不断的读串口缓存,另外一个就是利用事件触发的方式。第一种方法效率低,不推荐,第二种则需要利用到跨线程的内容。本人就是卡在这里一天,其实也就10来句代码的事,无奈自己玩这个没得请教,只有求助万能的百度。经过一天多断续的摸索,终于解决了这个问题。
在贴上代码前,先解释一下代码中会用到的一些控件的名称。
1、 cmbportname:设置串口号的下拉列表
2、 cmbbaudrate:设置波特率的下来列表
3、 bttopenport:打开/关闭串口的动作按钮
4、 txSend:要发送的数据显示文本框
5、 bttSend:发送那妞
6、 txrecieve:接收到的数据显示文本框
7、 bttClear:清空接收数据的按钮
涂黄的代码关系到异步接收数据,只要照着那几个涂黄的代码改一下,应该就可以实现了功能了。需要完整代码的也可以发邮件给我,。
代码中的SP是从工具箱拖进来的一个serialport控件。
代码:
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void getstring(string dataRe);//定义委托
getstring getmystring;//定义委托变量
private void DoUpdate(string data)
{
tbRecieve.Text = tbRecieve.Text + data;//数据处理,将当前数据与文本框文本合并
if (label5.BackColor == Color.AliceBlue)//改变lable的颜色,提示收到数据
{
label5.BackColor = Color.Black;
}
else label5.BackColor = Color.AliceBlue;
}
void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收事件触发方法
{
try
{
string mystring = SP.ReadExisting();
getmystring = new getstring(DoUpdate);
Invoke(getmystring, mystring);
}
catch (Exception EX)
{
MessageBox.Show(EX.Message, "出错