2010-01-11 3 views
1

У меня есть устройство (цифровой индикатор), с которым я связываюсь с использованием класса SerialPort. В документации устройства указано, что мне требуется иметь задержку в 250 миллисекунд между записью. Есть ли способ обеспечить это, не внося лишней задержки в систему? Я знаю, это, вероятно, звучит так, будто я слишком много беспокоюсь о чем-то, что действительно мало, но есть три из этих показателей, и они читают их довольно часто, но не все время. В принципе, есть хороший способ обеспечить, чтобы вы не отправляли повторно менее чем за 250 миллисекунд, но если это было 5 секунд, и я пытаюсь отправить, я не хочу задерживать дополнительные 250 миллисекунд без причины.Как обеспечить 250-миллисекундную задержку между записью на последовательном порту?

Мысли?

ответ

2

У вас должен быть какой-то класс для записи в последовательный порт, возможно, в одной точке записи (функция WriteToPort или что-то еще).

В этом случае вы можете сохранить текущее время каждый раз, когда будете писать, а затем использовать логику для задержки. SO:

DateTime lastWritten; 
TimeSpan timeBetweenWrites = new Timespan(0,0,0,0,250); 
void WriteToDevice(string data) 
{ 
    TimeSpan sinceLastWrite=DateTime.Now-lastWritten; 
    if(sinceLastWrite<timeBetweenWrites) 
     Thread.Sleep(timeBetweenWrites-sinceLastWrite); 
    SerialPort.Write(data); 
    lastWritten=DateTime.Now; 
} 
+0

Это то, что я планировал делать. Я надеялся, что есть еще более элегантный способ сделать это, но я думаю, что, вероятно, нет. спасибо –

+0

В качестве альтернативы, если вы готовы сделать ваши записи не обязательно «серийными» и готовы отправить их асинхронно, вы можете создать поток для представления, который будет спать 250 мс между каждой отправкой, а затем просто ждать блокировки до отправить, чтобы отправить. Я не писал это, потому что он немного сложнее, и для использования Serial Port требуется, чтобы данные обрабатывались синхронно. – Erich

+0

Да, к сожалению, это должно быть сделано синхронно. –

1

Приостановка нить должна работать для вас:

System.Threading.Thread.Sleep(250); 

Однако, это может быть немного неточными, так как вы не можете гарантировать следующий раз, когда ваш поток будет запланирован. Если вам нужны точные тайминги, вам лучше использовать ожидание вращения.

+0

Это не отвечает на вопрос. Это заставит его ждать 250 миллисекунд, несмотря ни на что. –

+0

@Max: вы можете использовать «Секундомер» для вычисления времени, прошедшего с момента последнего написания порта и соответствующим образом отрегулировать задержку. –

0

Извлечь временную метку перед каждой передачей. Сон за 250- (сейчас - тогда) миллисекунды (очевидно, зажат на ноль). Кажется, это то, о чем вы просите.

Если вы вместо этого беспокоитесь о вещах, таких как проблемы с планированием ОС, создавая время, не равное 250 мс, или больше, чем крошечный бит с 250 мс, тогда у вас есть более сложная проблема на нашей руке, и вы будете необходимо прочитать на жестких методах реального времени (и, возможно, приобрести дополнительное оборудование).