菜单

C# 串口接收数据中serialPort.close()死锁

2019年5月9日 - 皇家赌场系统

try
{
serialPort一.Read(InputBuf, 0,六);
//读取缓冲区的多少,每一次读取四个字节的多寡
System.Threading.Thread.Sleep(100);
this.BeginInvoke(disp_delegate,
InputBuf);//disp_delegate是概念的嘱托事件,在信托事件中调用修改UI的先后
}
catch (TimeoutException ex) //超时管理
{
MessageBox.Show(ex.ToString());
}

//更新UI界面
public void DispUI(byte[] InputBuf)
{

string str = System.Text.Encoding.Default.GetString(InputBuf);
// Console.WriteLine(str);
string strW = str.Substring(0,
2);//截取str的子串,从index=0起初截取长度为二的字符串
int OutStrW = int.Parse(strW);
string strS = str.Substring(二,
贰);//截取str的子串,从index=2初叶截取长度为贰的字符串
int OutStrS = int.Parse(strS);
OutstrWen = (OutStrW – 4).ToString();
textBox8.Text = strW;
textBox9.Text = (OutStrW – 4).ToString();
textBox10.Text = strS;
textBox11.Text = (OutStrS – 10).ToString();
}

//接收数据委托
disp_delegate = new Displaydelegate(DispUI);
serialPort1.DataReceived += new
SerialDataReceivedEventHandler(Comm_DataReceived);

SerialPort serialPort1 = new SerialPort(“COM伍”, 115200, Parity.None, 8,
StopBits.One); //初叶化串口设置
//定义委托
public delegate void Displaydelegate(byte[] InputBuf);
Byte[] OutputBuf = new Byte[8];
public Displaydelegate disp_delegate;

//串口读取数据处理函数
public void Comm_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{

眼下在做多少个关于动内衣模特拟仓展现系统的客户端程序,在那几个顺序中要使用串口serialPort传输数据,因为每一回接收数据甘休后要更新UI分界面,所以就用到了的Invoke,将更新UI的程序代码封装到多个主意中,然后通过Incoke调用,程序跑起来未有别的难点,但是当您推行serialPort.close()是程序就能发生死锁,整个程序卡在那边动都动不了。上网查了累累资料,有种种那样的说教,有的说定义二个接收数据的表明,倘若在施行关闭程序是进行决断,如若数据接收完了就倒闭串口,未有的话继续试行,可是经过亲自测试并不曾什么卵用,最终本身钻探invoke的时候开采还有Begininvoke,同时也发觉了他们中间的区别,begininvoke用于后台更新UI数据无需等待的情景,而invoke用于后台更新UI数据要求等待的场合,弄精通那七个里面包车型客车不等之后才领悟原来施行serialPort.close()爆发死锁的缘由正是invoke在作祟,改成begininvoke就不相会世死锁难点。直接上代码:

Byte[] InputBuf = new Byte[8];

}

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图