Последовательный порт BytesToRead ожидает асинхронного - PullRequest
0 голосов
/ 16 сентября 2018

Я должен написать DLL, которая отправляет сообщение и ждет ответа, прежде чем он может продолжаться. Пока это часть мая dll:

 public async Task<bool> WaitForRxThread(int TimeOut)
    {
        bool res = await Task.Run(() => WaitForResult(TimeOut));
        return res;
     }

    private bool WaitForResult(int TimeOut)
    {
        _Result = new byte[0];
        int counter = 0;

        double WaitTimeout = TimeOut + DateTime.Now.TimeOfDay.TotalMilliseconds;
        while (!(DateTime.Now.TimeOfDay.TotalMilliseconds >= WaitTimeout))
        {
            counter++;
            int BytesToRead = sPort.BytesToRead;
            if (BytesToRead > 0)
            {
                byte[] Bytes = new byte[BytesToRead];
                sPort.Read(Bytes, 0, BytesToRead);
                Array.Resize(ref _Result, _Result.Length + BytesToRead);
                Array.Copy(Bytes, 0, _Result, (_Result.Length - BytesToRead), BytesToRead);
                if (ResultComplete(Bytes) == true)
                {
                    return true;
                }
            }
        }
        return false;
    }



    public bool ResultComplete(byte[] TestData)
    {
        if (TestData.Length > 4)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

Для проверки этой DLL я написал консольное приложение, например

static void Main(string[] args)
    {
        RS obj = new RS();

        obj.OpenComport();

        obj.SendMessage("Hello");
        Console.WriteLine("Message send");
        var result = obj.WaitForRxThread(5000);
        Console.WriteLine("Read thread executed");
        result.Wait();

        Console.WriteLine("Process result");
        if (result.Result)
        {
            obj.GetResult();
            Console.WriteLine("Result is : " + Encoding.ASCII.GetString(obj.GetResult()));
            Console.WriteLine("Done");
            Console.ReadLine();
        }
        else
        {
            Console.WriteLine("Result is false");
        }

        obj.CloseComport();

    }

Когда я запускаю это приложение и отправляю данные этому приложению в течение периода ожидания, я ничего не обнаруживаю. BytesToRead равно 0. Когда я устанавливаю точку останова на линии

 var result = obj.WaitForRxThread(5000);

Отправить данные в приложение и продолжить я получаю данные, как ожидалось Может кто-нибудь объяснить, что я делаю не так?

...