我想知道如何将通过serialport接收的数据链接到在主UI中调用它的函数。
我希望UI从串口发送数据,然后暂停线程或等待直到通过serialport线程接收数据,然后继续主UI线程。
我被告知thread.suspend()不是一个安全的函数,我和thread.resume一起尝试过,但是失败了。
我应该关注lock / mutex吗?
还是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;
}
答案 0 :(得分:0)
如果您要阻止UI线程,那么使用DataReceived事件就没有意义了。只需直接致电SerialPort.Read/Line()。这可能导致用户界面响应的延迟通常是不可取的,但它肯定要容易得多。
答案 1 :(得分:0)
只需创建一个委托并使用它将数据发送到一个方法,您可以在该方法中处理从串行端口收到的数据。我的用例是我通过端口发送数据,我不知道什么时候生病得到回复,它可能是任何时间,但在那个时候数据来了我应该能够得到它并处理它,所以我做以下。认为这是你可能想要的
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
只需处理您在接收处理方法中收到的数据。