Почему бы не использовать таймер? Поместите его в метод InitializeComponent соответствующей формы,
using System.Timers;
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "Form1";
Timer timer = new Timer();
timer.Interval = 5000;
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
//timer.Enabled = true; // you may need this, but probably not if you are calling the start method.
timer.Start();
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
// put your code here to read the COM port
}
Единственная другая проблема с этим кодом состоит в том, что вы получите исключение. Межпотоковая операция недопустима.
Вы должны будете изменить свой код следующим образом,
private void ProcessBuffer(List<byte> bBuffer)
{
int numberOfBytesToRead = 125;
if (bBuffer.Count >= numberOfBytesToRead)
{
this.Invoke(new Action(() =>
{
listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + " " + " HR: " + (bBuffer[103].ToString()));
});
// Remove the bytes read from the list
bBuffer.RemoveRange(0, numberOfBytesToRead);
}
}
Причина в том, что метод ProcessBuffer будет работать в фоновом потоке. Фоновые потоки не могут получить доступ к компонентам пользовательского интерфейса в потоке пользовательского интерфейса. Поэтому вы должны вызвать this.Invoke, который запустит это обновление в список в потоке пользовательского интерфейса.
Посмотрите здесь, если хотите узнать больше о методе Invoke,
http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
UPDATE:
Итак, в методе TimerElapsed вы захотите вызвать свой код, но мне не ясно, какую часть вашего кода он должен вызывать? Для чего нужен метод «datareceived», нет ничего вызывающего его в вашем фрагменте кода.
Так что я предполагаю, что это будет,
void TimerElapsed(object sender, ElapsedEventArgs e)
{
Update();
}
public void Update()
{
while (serialPortN.BytesToRead > 0)
buffer.Add((byte)serialPortN.ReadByte());
ProcessBuffer(buffer);
}
Не имеет смысла вызывать метод ProcessBuffer, потому что откуда берется буфер?
Если я не на правильном пути, возможно, расширьте ваш пример кода, и я буду рад помочь вам.
Обратите внимание на некоторые изменения стиля, которые я сделал в вашем коде (не стесняйтесь брать их или оставлять их), метод в C # должен начинаться с заглавной буквы, а вызов переменной bBuffer не является стандартным в C #. Другой момент, если этот метод вызывается только из класса, он должен быть закрытым.