如何连接串口接收数据到主UI线程的读函数
本文关键字:UI 线程 函数 数据 何连接 连接 串口 | 更新日期: 2023-09-27 18:06:18
我想知道如何将通过串行端口接收的数据链接到在主UI中调用它的函数。
我希望UI从串行端口发送数据,然后挂起线程或等待,直到通过串行端口线程接收数据,然后再继续主UI线程。
我被告知thread.suspend()不是一个安全的函数,我尝试了它和thread一起使用。继续,但失败。
我应该看锁/互斥吗?
或EventWaitHandles吗?
我完全糊涂了!我不熟悉线程,所以任何帮助将非常感激!谢谢你。
下面的代码:public static int SerialCOM_Read(uint tRegisterAddress, out byte[] tRegisterValue, uint nBytes){
int retVal = 1;
tRegisterValue = new byte[nBytes];
byte[] nBytesArray = new byte[4];
NBytes = nBytes;
try {
ReadFunction = true;
YetToReceiveReadData = true;
byte[] registerAddress = BitConverter.GetBytes(tRegisterAddress);
int noOfBytesForRegAdd = 1;
if (registerAddress[3] > 0) noOfBytesForRegAdd = 4;
else if (registerAddress[2] > 0) noOfBytesForRegAdd = 3;
else if (registerAddress[1] > 0) noOfBytesForRegAdd = 2;
nBytesArray = BitConverter.GetBytes(nBytes);
{
Append_Start();
Append_Operation_with_NoOfBytesForRegAdd(OPERATION.I2C_READ, noOfBytesForRegAdd);
Append_RegAdd(noOfBytesForRegAdd, tRegisterAddress);
Append_NoOfBytesOfData(nBytesArray);
Send_DataToWrite();
//Need to Suspend Thread here and Continue once the
//ReadData[i] global variable has been assigned.
for(int i=0; i<nBytes; i++)
tRegisterValue[i] = ReadData[i];
}
catch(Exception ex) {}
return retVal;
}
如果要阻塞UI线程,那么使用DataReceived事件是没有意义的。只需直接调用SerialPort.Read/Line()。这可能会导致用户界面响应延迟,这通常是不希望的,但它确实更容易进行。
只需创建一个委托并使用它将数据发送到可以处理从串行端口接收的数据的方法。我的用例是我通过端口发送数据,我不知道什么时候会得到响应,它可能是任何时间,但在那个时候数据来了,我应该能够得到它并处理它,所以我做以下操作。我想这就是你想要的
Public Delegate Sub recieveDelegate()
Private Sub datareceived1(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPrt.DataReceived
buffer = buffer & SerialPrt.ReadExisting()
If InStr(1, rxbuff, EOF) > 0 Then
Rxstring = rxbuff
rxbuff = ""
BeginInvoke(New recieveDelegate(AddressOf recieveHandlingMethod), New Object() {})
End If
End Sub
在接收处理方法中处理接收到的数据。