概述 : C# 串口向下位机发送 命令.下位机返回的数据出发接受事件,在辅助线程上控制住窗体中的控件!
1 声明委托 ,属性通过属性控制控件
2 主窗体 实例化 外部类时传入 this
3 外部类中 方法实现 对出窗体的属性赋值.
4 请使用 Invoke 回发更改请求 frmmain.Invoke(deleuid,UID);
public event SerialPortDataReceiveEventArgs DataReceived;//串口接收事件在子线程上进行详细见
从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。 由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。 如果有必要修改主 Form 或 Control 中的元素,请使用 Invoke 回发更改请求,这将在正确的线程上执行。(参考MSDN)
进入正题
主窗体代码 :声明委托 ,属性 通过属性来赋值 实例化xtcmds类时讲this传入
public delegate void deleReturnUID(string UID); public partial class frmMain { public string UID { get { return txt_uid.Text; } set { txt_uid.Text = value; } } } private void btn_Check_Click(object sender, EventArgs e) { xt.common.xtcmd xcmd = new xt.common.xtcmd(this); xcmd.CMD_GEEUID(); }
xtcmd.cs中的代码
1 构造函数 通过构造函数将主窗体的对象付给xtcmd类
frmMain frmmain;
public xtcmd(frmMain fm)
{
frmmain = fm;
Comx.DataReceived += new Comhelp.SerialPortDataReceiveEventArgs(Comx_DataReceived);
}
接收事件内 处理接收到的数据
void ReceiveInfoHandel(string Str)
{
if (Str.Substring(0, 4) == "4$$$")
{
string UID = Str.Substring(4, 8);
XT.Drivinglicense.deleReturnUID deleuid;
deleuid = SetUID;
frmmain.Invoke(deleuid,UID);
}
}
void SetUID(string uid)
{
frmmain.UID = uid;//这里可以直接饮用主窗体的对象 赋值即可
}