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