У меня может быть самая странная ошибка, которую вы слышали сегодня.
У меня есть один (очень длинный) метод внутри потока, который отправляет отформатированные данные на светодиодный дисплей RS232.
Он должен отображать что-то вроде этого
TITLE
SUBTITLE 1
ELEMENT 1
ELEMENT 2
SUBTITLE 2
ELEMENT 1
ELEMENT 2
ELEMENT 3
ну, у каждого свое сообщение.
Я вызываю Thread.Sleep (N) после каждого сообщения (поэтому каждое сообщение отображается N раз).
Хорошо, все хорошо до сих пор. Дело в том, что если (10 <= N <= 20)
я получу следующий вывод:
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
Я слышу гудок , когда отправляю сообщение. Я даже установил монитор последовательного порта, чтобы проверить, была ли информация, которую я отправлял, одинаковой.
Итак, подведем итог:
Запись на последовательный порт работает после сна потока для n <= 9 или n> = 20. Любое промежуточное значение приведет к ошибочному выводу, например, если вывод был кэширован или что-то еще
Что это может быть?
Обновление
- Хорошо, я знаю, что System.Threading.Sleep принимает в качестве аргументов миллисекунды. просто умножьте число на 1000.
- Всякий раз, когда светодиодный дисплей получает новое хорошо отформатированное сообщение, он издает звуковой сигнал. Я должен был это уточнить.
Вот фрагмент (отправляет первый заголовок)
using (var ld = new LedScreen(COM))
{
ld.AddEffect(LedScreen.Effects.Snow);
ld.AddText(LedScreen.Colors.Red, titulos[ThreadControl.Fase]);
ld.AddEffect(LedScreen.Effects.DSnow);
ld.Write();
}
//Console.WriteLine(titulos[ThreadControl.Fase]);
//esperamos N tiempo (titulo)
Thread.Sleep(TiempoTitulo);
Я написал класс LedScreen. Вот метод записи:
public void Write()
{
//caracteres de terminacion
buffer.AddRange(new byte[] { 0xBF, 0xB1 });
try
{
if (!sp.IsOpen) sp.Open();
sp.Write(buffer.ToArray(), 0, buffer.Count);
}
finally
{
sp.Close();
}
}
Обновление 2
Я наконец-то заставил его работать (некрасиво, но, черт возьми.)
Перед каждой записью в последовательный порт я отправляю «пустое» сообщение без задержки. Это очищает экран перед отправкой фактического сообщения. Ура! и это работает в течение любого количества секунд, я сплю нить