目次
前
次
ボタン処理
ボタンは、7種あります。
- Open Port
- Close Port
- send R
- Save
- Clear
- Exit
- About
各々のボタンで実現する処理を説明します。
Open Port、Close Port
シリアルポートのOpen、Closeに必要な機能を考えます。
Openボタン処理
シリアルポートをOpenするには、以下のコードの実行だけです。
sciDTB.Open();
このOpen処理が成功するためには、該当するCOMポートが存在して
いなければなりません。
Windowsのシステム状態を参照すると、指定したCOMポートが存在する
かは確認できますが、間違えて指定することもあり得ます。
間違えて指定した場合の処理を「try catch」で掴まえ
ユーザーに報告する仕様とします。
エラー発生を「catch」の処理で記述しておき、COMポートを指定する
処理を「try」の中に記述します。
シリアルポート番号指定は、プロパティPortNameに文字列で
入力します。COM4であれば、文字列COM4を入力します。
ポート番号は、NumericUpDownボックスで1〜15のいずれかに
なっているので、その情報を文字列COMと接続した後に、PortName
に代入します。
シリアルポートをOpenしている状態を示すために、ボタンを
灰色表示にします。そのためのフラグをグローバルで用意し
対応します。
上記内容をまとめ、次のコードとなります。
private void btnOpenPort_Click(object sender, EventArgs e)
{
// judge
if ( gPflag == true ) return;
//
try
{
// get COM port number
string com_str;
com_str = "COM" + nudPort.Value;
// set Port Name
sciDTB.PortName = com_str;
//MessageBox.Show(sciDTB.PortName);
// Open Port
sciDTB.Open();
// update button states
gPflag = true;
btnOpenPort.Enabled = false;
btnClosePort.Enabled = true;
}
catch (System.IO.IOException myIOe)
{
MessageBox.Show(myIOe.ToString(), "ERROR:COM port not exists!");
gPflag = false;
btnOpenPort.Enabled = true;
btnClosePort.Enabled = false;
}
}
Closeボタン
シリアルポートのCloseは、次のコードを実行します。
sciDTB.Close();
このOpenしているか否かは、フラグgPflagの論理値で
判定できるので、論理値がtrueの場合だけ、Closeを
実行します。
ボタンの状態を変更するコードを加えておきます。
private void btnClosePort_Click(object sender, EventArgs e)
{
// judge
if ( !gPflag ) return ;
// change flag state
gPflag = false ;
btnOpenPort.Enabled = true ;
btnClosePort.Enabled = false ;
// Close Port
sciDTB.Close();
}
send R
相談者から示されたコマンドは"R\n"ですが、自前の
エミュレータでは"C\r"なので、最初に自前のコマンド
を作成しテストします。
テスト終了後、依頼されたコードに差し替えます。
単純に、文字列をWriteメソッドでポートに出力しますが
ポートがオープン状態でなければ、エラーメッセージで
ユーザーに報告する仕様とします。
private void btnSend_Click(object sender, EventArgs e)
{
if (sciDTB.IsOpen)
{
// after test completed , change this code
//string sendCmd = "R\n";
string sendCmd = "C\r";
sciDTB.Write(sendCmd);
textCmd.Text = sendCmd;
}
else
{
MessageBox.Show("Not valid port");
}
}
ユーザーが、コマンドをポートに出力したかを確認できる
ように、テキストボックスに文字列を表示します。
Save
テキストボックスの内容を、テキストファイルに保存する
処理を実行します。
ファイル名が必要なので、ファイル名がテキストボックスにない
場合は、エラーメッセージを出します。
実際のファイル保存は、独自クラスのテキストボックスで定義して
あるメソッドに、ファイル名を渡して実行します。
そのためInvokeメソッドを使います。
private void btnSave_Click(object sender, EventArgs e)
{
// judge
if (textFileName.Text.Length > 0)
{
// generate file name with path
gFName = textDir.Text + "\\" + textFileName.Text;
//MessageBox.Show(gFName);
Invoke(new SaveText(rMyTextBox.SaveText), new object[] { gFName });
}
else
{
MessageBox.Show("No file name !");
}
}
Invokeメソッドを使うためには、Delegateでどのクラスメソッドに
該当するのかを指定しておきます。
delegate void SaveText(string text);
InvokeとDelegateに関しては、別の章で説明します。
Clear
テキストボックスの内容を、クリアします。
実際のファイル保存は、独自クラスのテキストボックスで定義して
あるメソッドに、依頼して実行します。
そのためInvokeメソッドを使います。
private void btnClear_Click(object sender, EventArgs e)
{
//MessageBox.Show("Clear Text Area");
Invoke(new ClrText(rMyTextBox.ClrText));
}
Invokeメソッドを使うので、DelegateでClrTextを宣言しておきます。
delegate void ClrText();
Exit
アプリケーションを終了します。
COMポートをOpen状態にしたままで終了すると、ゾンビの
スレッドあるいはプロセスが残る可能性があります。
ゾンビをなくすために、COMポートがOpen状態であれば
Closeします。
private void btnExit_Click(object sender, EventArgs e)
{
// judge
if ( sciDTB.IsOpen ) { sciDTB.Close(); }
// End
this.Dispose();
}
About
情報を表示すればよいので、必要な内容を文字列で
記述し、メッセージボックスを使って出力します。
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
/* local string */
string str ;
/* store string to variables */
str = "Serial Transfer\r\n" ;
str += "Copy Right : Kensuke Ooyu\r\n" ;
str += "2010/04/02" ;
/* show */
MessageBox.Show(str);
}
目次
前
次