UWP C# Windows IoT Core UART RS485 Ошибка после многократной передачи - PullRequest
0 голосов
/ 24 февраля 2020

Это пост, связанный с моим предыдущим вопросом относительно Буфера данных RS485 . Я намеревался передавать на несколько ведомых устройств от 1 до, может быть, 50. В настоящее время у меня установлено только 6 ведомых устройств. Я тестирую подпрограмму transmit all, где у меня есть dispatchertimer с интервалом timespan из 10ms для передачи 6 bytes данных в 4800baudrate каждому ведомому устройству. Я start dispatchertimer при запуске для передачи и stop dispatchertimer после отправки на последнее ведомое устройство.

enter image description here Я сталкиваюсь с кодом ошибки 0x80004005 External components has thrown an exception, когда вторая transmit all запускается в моей tx485 процедуре следующим образом;

            // Configure serial settings
            serialPort.WriteTimeout = TimeSpan.FromMilliseconds(-1);//10 //1000
            serialPort.ReadTimeout = TimeSpan.FromMilliseconds(-1);//100 //1000
            //serialPort.BaudRate = 9600;
            serialPort.BaudRate = 4800;
            serialPort.Parity = SerialParity.None;
            serialPort.StopBits = SerialStopBitCount.One;
            serialPort.DataBits = 8;
            serialPort.Handshake = SerialHandshake.None;

private async void Tx485()
    {
        if (serialPort != null)
        {


            List<byte> data = new List<byte>();

            data.Add(F5);
            data.Add(TxAdr);
            data.Add(TxCommand);
            data.Add(TxData);
            data.Add(comTxData);

            TxChkSum = 0;
            foreach (byte a in data)
            {
                TxChkSum += a;
            }

            TxChkSum = (byte)(TxChkSum - 0x80);
            data.Add(TxChkSum);

            try
            {
                // Create the DataWriter object and attach to OutputStream
                dataWriteObject = new DataWriter(serialPort.OutputStream);

                dataWriteObject.WriteBytes(data.ToArray());

                Task<UInt32> storeAsyncTask;
                // Launch an async task to complete the write operation
                storeAsyncTask = dataWriteObject.StoreAsync().AsTask();

                UInt32 bytesWritten = await storeAsyncTask;

            }
            catch (Exception ex)
            {
                MainStatusDisplay.Text = ex.Message;
            }

        }
        else
        {
            MainStatusDisplay.Text = "No UART port found";
        }
    }

Спасибо.

Отредактировано 2020-02-25

Чтобы добавить .. передача 485 запускается timeschedule. После срабатывания timescheudle он будет передавать сигнал on на все устройства и одновременно воспроизводить аудиофайл. как только аудиофайл mediaended .. будет start с таймером задержки 2 с, затем снова передаст сигнал off на все устройства. У меня нет проблем при передаче сигнала on, но только при передаче сигнала off во время mediaended и программы.

private async void Schedule_MediaEnded(MediaPlayer sender, object args)
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            try
            {
                scheduleEndedTxOff = true;
                commsDelay.Start();    //commsdelay delays 2 seconds before starting transmitting `OFF` signal
            } catch (Exception ex)
            {
                MainStatusDisplay.Text = ex.Message;
            }
        });
    }

private void CommsDelay_Tick(object sender, object e)
    {
        try
        {
            if (scheduleEndedTxOff)
            {
                scheduleEndedTxOff = false;
                if (allDecoderOn == true)
                {
                    commsDelay.Stop();
                    txAll = true;
                    DecoderAddress = maxDecoder;
                    allOff = true;
                    allOn = false;
                    TestTxToDecoder.IsEnabled = false;
                    commsTimer.Start();  //CommsTimer_Tick
                }
            }
        } catch (Exception ex)
        {
            MainStatusDisplay.Text = ex.Message;
        }

    }

private async void CommsTimer_Tick(object sender, object e)
    {
        if (txAll)
        {
            if (allOn)
            {
                try
                {
                    var a = DecoderAddress | 128;
                    TxAdr = Convert.ToByte(a);
                    TxCommand = TxUpdateSts;
                    TxData = 0x0F;
                    comTxData = (byte)(~TxData);
                    Tx485();
                    DecoderAddress--;

                    if (DecoderAddress == 0)
                    {
                        DecoderAddress = maxDecoder;
                        txAll = false;
                        allOn = false;
                        allOff = false;
                        allDecoderOn = true;
                        commsTimer.Stop();
                    }
                }
                catch (Exception ex)
                {
                    commsTimer.Stop();

                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        MainStatusDisplay.Text = ex.Message;
                    });
                }
            }

            if (allOff)
            {
                try
                {
                    var a = DecoderAddress | 128;
                    TxAdr = Convert.ToByte(a);
                    TxCommand = TxUpdateSts;
                    TxData = 0x00;
                    comTxData = (byte)(~TxData);
                    Tx485();
                    DecoderAddress--;

                    if (DecoderAddress == 0)
                    {
                        DecoderAddress = maxDecoder;
                        txAll = false;
                        allOn = false;
                        allOff = false;
                        allDecoderOn = false;
                        commsTimer.Stop();
                    }
                }
                catch (Exception ex)
                {
                    commsTimer.Stop();

                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        MainStatusDisplay.Text = ex.Message;
                    });
                }
            }

        }
    }

private void initCommsTimer()
    {
        commsTimer = new DispatcherTimer();
        commsTimer.Interval = TimeSpan.FromMilliseconds(10);
        commsTimer.Tick += CommsTimer_Tick;
    }

Exception thrown: 'System.IO.FileNotFoundException' in 485comms.exe WinRT information: Slave address was not acknowledged. Exception thrown: 'System.IO.FileNotFoundException' in 485comms.exe WinRT information: Slave address was not acknowledged. The thread 0x11c4 has exited with code 0 (0x0). The thread 0x11cc has exited with code 0 (0x0). The thread 0x1794 has exited with code 0 (0x0). The thread 0x12f0 has exited with code 0 (0x0). The thread 0x12e8 has exited with code 0 (0x0). The thread 0x12f8 has exited with code 0 (0x0). The thread 0x1044 has exited with code 0 (0x0). The program '[0x170C] 485comms.exe' has exited with code -1073741811 (0xc000000d).

Обновление: 2020- 02-26 Я загрузил пример кода здесь. https://1drv.ms/u/s! AnzY25r C -8ZkmO1SAOGwLj28HOlKxg? Е = 2mOEz2

1 Ответ

0 голосов
/ 25 февраля 2020

Когда вы обновляете содержимое компонента в потоке, не являющемся пользовательским интерфейсом, вам необходимо использовать CoreDispatcher , который можно использовать для маршалинга вызовов, поступающих из потоков, не связанных с пользовательским интерфейсом. Вот ваш код, DispatcherTimer в потоки без пользовательского интерфейса.

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        MainStatusDisplay.Text = ex.Message;
    });

Обновление :

Когда я запускаю ваш проект, приложение вылетает с ошибкой Value does not fall within the expected range.. Мы рекомендуем добавлять try catch к каждому методу для устранения проблемы. Я предполагаю, что ошибка System.IO.FileNotFoundException, вызванная аудиофайлами или другими ресурсами, используемыми в вашем приложении, отсутствует в вашем решении.

...