如何将SerialPort接收数据链接到主UI线程的读取功能?

时间:2011-08-23 02:01:40

标签: c# thread-safety serial-port

我想知道如何将通过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;

}

2 个答案:

答案 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

只需处理您在接收处理方法中收到的数据。