2つのボタンがあります。ボタン接続(オープンcomポート)&切断(ポートを閉じる)。接続ボタンをクリックすると、タイマは数秒ごとにCOMポートからListboxのデータを表示します。&切断をクリックしてもう一度「接続」ボタンをクリックすると、データはリストボックスに表示されず、タイマーはトリガーされません。どうしてこんなことに?ここでCOMポートからリストボックスにデータを表示
は私のコードです:
List<byte> buffer = new List<byte>(125);
private void btnConnect_Click(object sender, EventArgs e)
{
if (serialPortN.IsOpen)
serialPortN.Close();
try
{
{
serialPortN.PortName = "COM8";
serialPortN.BaudRate = 9600;
serialPortN.Parity = Parity.None;
serialPortN.DataBits = 8;
serialPortN.StopBits = StopBits.One;
serialPortN.Encoding = System.Text.Encoding.ASCII;
serialPortN.ReadTimeout = 500;
}
serialPortN.Open();
label1.Text = "COM8" + " is opened";
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 5000;
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
timer.Start();
serialPortN.DataReceived += new SerialDataReceivedEventHandler(datareceived);
btnDisconnect.Enabled = true;
btnConnect.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
void datareceived(object sender, SerialDataReceivedEventArgs e)
{
myDelegate d = new myDelegate(update);
listBox1.Invoke(d, new object[] { });
}
public void update()
{
while (serialPortN.BytesToRead > 0)
buffer.Add((byte)serialPortN.ReadByte());
// Call a routine to process the data.
ProcessBuffer(buffer);
}
private void ProcessBuffer(List<byte> buffer)
{
int numberOfBytesToRead = 125;
if (buffer.Count >= numberOfBytesToRead)
{
this.Invoke(new Action(() =>
Console.WriteLine(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}",
buffer[43].ToString(),
buffer[103].ToString(),
DateTime.Now.ToString()
))));
buffer.RemoveRange(0, numberOfBytesToRead);
}
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
int numberOfBytesToRead = 125;
if (buffer.Count >= numberOfBytesToRead)
{
this.Invoke(new Action(() =>
listBox1.Items.Add(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}",
buffer[43].ToString(),
buffer[103].ToString(),
DateTime.Now.ToString()
))));
buffer.RemoveRange(0, numberOfBytesToRead);
}
はすべてをありがとう!
それはあなたがルーチンを入力し、完了していることを見てきた例外はbtnConnect_Clickとデバッガで発生していないと言うことは安全ですか?もしそうなら、私は物事をトリミングして、タイマーがシリアルコードなしで動くようにすることができるかどうかを見ていきます。 – nmjohn
SerialPort.Close()のMSDN記事の備考のセクションを読む –
こんにちはハンス、私はそれを読んだ..それは言う:すべてのアプリケーションのベストプラクティスは、試みる前にCloseメソッドを呼び出した後、ある程度の時間を待つことですポートが即座に閉じられない可能性があるため、Openメソッドを呼び出す必要があります。だから私はそれを開いた後にポートが閉鎖されているかどうかをどのように知っていますか?私のコードからわかるように。私はbtnConnectにif else文を入力しました。 – fb69