возвращение серийного соединения с асинхронным недействительным - PullRequest
0 голосов
/ 28 сентября 2019

В моем коде есть обработчик асинхронных событий для получения и отправки строк через последовательный UART.В приведенном здесь примере я только получаю.Есть ли способ использовать строку rxBuffer вне Serial ()?Я должен использовать значение на другой странице.

Я прочитал, что async void не может вернуть значение.Задача async будет правильным способом.Как изменить код, чтобы это произошло?Мои попытки всегда терпят неудачу.

    using System;
    using Windows.System;                       //ShutdownManager
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.Devices.Enumeration;          //UART Serial
    using Windows.Devices.SerialCommunication;  //UART Serial
    using Windows.Storage.Streams;              //Uart Serial

    //Main
    public MainPage()
    {
        InitializeComponent();
        Serial();
    } //Main


    //Serial
    public async void Serial()
    {
        string aqs = SerialDevice.GetDeviceSelector("UART0");                   /* Find the selector string for the serial device   */
        var dis = await DeviceInformation.FindAllAsync(aqs);                    /* Find the serial device with our selector string  */
        SerialDevice SerialPort = await SerialDevice.FromIdAsync(dis[0].Id);    /* Create an serial device with our selected device */

        /* Configure serial settings */
        SerialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
        SerialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
        SerialPort.BaudRate = 9600;                                             /* mini UART: only standard baudrates */
        SerialPort.Parity = SerialParity.None;                                  /* mini UART: no parities */
        SerialPort.StopBits = SerialStopBitCount.One;                           /* mini UART: 1 stop bit */
        SerialPort.DataBits = 8;

        DataWriter dataWriter = new DataWriter();
        const uint maxReadLength = 1024;
        DataReader dataReader = new DataReader(SerialPort.InputStream);

        while (true)
        {
            //Receive
            uint bytesToRead = await dataReader.LoadAsync(maxReadLength);
            string rxBuffer = dataReader.ReadString(bytesToRead);
            textblock_DebugRx_live.Text = rxBuffer;    
        }
    } //Serial

Я пробовал это и с Задачей.Как видите, я не профессионал.

Что мне не хватает?С этим кодом мой textblock_DebugRx_live отображает:

System.Threading.TasksTask`1 [System.String]

Код:

using System;
using System.Threading;
using System.Threading.Tasks;   //nötig für await Task
using Windows.Devices.Gpio;     //GPIO for Raspberry
using Windows.System;           //ShutdownManager
using Windows.UI;               //Schriftfarbe ändern
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;    //Schriftfarbe ändern
using Windows.Devices.Enumeration;          //UART Seriell
using Windows.Devices.SerialCommunication;  //UART Seriell
using Windows.Storage.Streams;              //Uart Seriell

namespace TAR_Win_IoT
{
    public sealed partial class MainPage : Page
    {

    //Main
    public MainPage()
    {
        InitializeComponent();

        Serial();
        var b = Serial();
        string c = b.ToString();
        textblock_Rx_live.Text = c;
    } //Main


    //Seriell
    public async Task<string> Serial()
    {
        string aqs = SerialDevice.GetDeviceSelector("UART0");                   /* Find the selector string for the serial device   */
        var dis = await DeviceInformation.FindAllAsync(aqs);                    /* Find the serial device with our selector string  */
        SerialDevice SerialPort = await SerialDevice.FromIdAsync(dis[0].Id);    /* Create an serial device with our selected device */

        /* Configure serial settings */
        SerialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
        SerialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
        SerialPort.BaudRate = 9600;                                             /* mini UART: only standard baudrates */
        SerialPort.Parity = SerialParity.None;                                  /* mini UART: no parities */
        SerialPort.StopBits = SerialStopBitCount.One;                           /* mini UART: 1 stop bit */
        SerialPort.DataBits = 8;

        DataWriter dataWriter = new DataWriter();
        const uint maxReadLength = 1024;
        DataReader dataReader = new DataReader(SerialPort.InputStream);

        while (true)
        {
            //Receive
            uint bytesToRead = await dataReader.LoadAsync(maxReadLength);

            string rxBuffer = dataReader.ReadString(bytesToRead);
            textblock_DebugRx_live.Text = rxBuffer;
            return rxBuffer;
        }
       } //Seriell
      }//Main
     }//ENDE
...