Как связать полученные данные SerialPort с функцией чтения основного потока пользовательского интерфейса? - PullRequest
2 голосов
/ 23 августа 2011

Я хотел бы знать, как связать данные, полученные через последовательный порт, с функцией, вызывающей их в главном интерфейсе.

Я бы хотел, чтобы пользовательский интерфейс отправлял данные из последовательного порта, затем приостанавливал поток или ожидал получения данных через поток последовательного порта, прежде чем продолжить основной поток пользовательского интерфейса.

Мне сказали, что thread.suspend () не является безопасной функцией, я пробовал ее вместе с thread.resume, но не смог.

Должен ли я смотреть на блокировку / мьютекс?

Или 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 голосов
/ 23 августа 2011

Просто создайте делегата и используйте его для отправки данных в метод, где вы можете обработать данные, полученные из последовательного порта. Мой вариант использования: я отправляю данные через порт и не знаю, когда я получу ответ, это может быть в любое время, но в то время, когда приходят данные, я должен иметь возможность получить и обработать их, поэтому я делаю следующее , Думаю, это то, что вы можете

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

Просто обработайте данные, которые вы получаете в методе обработки получения.

0 голосов
/ 23 августа 2011

Если вы собираетесь заблокировать поток пользовательского интерфейса, то нет смысла использовать событие DataReceived.Просто вызовите SerialPort.Read/Line () напрямую.Задержки, которые это может вызвать в отзывчивости пользовательского интерфейса, обычно нежелательны, но определенно намного легче начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...