分類:[C#]
2016/08/02(Tue) 19:55:02 編集(投稿者)
2016/08/02(Tue) 19:52:39 編集(投稿者)
2016/08/02(Tue) 19:52:19 編集(投稿者)
政吉と申します。
SDKはVisual Studio Comunity 2015を使用しています。
現在マイコンを搭載した基板とPCをUSB通信ケーブルで接続し、マイコンとシリアル通信を行うPC側のアプリを
作成しています。
USBを使用していますが、マイコンメーカが提供しているUSBを仮想COMポートとして認識するドライバにより、
PC側アプリはCOM Portに対してシリアル通信を行う形式です。
別途、PC側のアプリ内で、グラフ表示してグラフ上の線をマウスやタッチパネルで掴んで操作みたいなことを
やりたいので、基本的にはWPFでプログラミングしています。
ここで、マイコン側の問題か、仮想COMポートドライバの問題か、COMポートのオープン処理に1分程度の時間が
かかります。
具体的には、
serialPort.Open();
の処理を実行すると、この処理が1分程度、返ってきません。
この為、この間に別WindowでProgressBarを表示したいと思い、下記のようなコードを作成してみました。
↓COMポートオープン処理時
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string ComPort = "COM3";
frmProgressBar f = new ParamSettingWPF.frmProgressBar();
f.Show(); // ProgressBarのFormを開く
serialPort = new SerialPort(ComPort, 115200, Parity.None, 8, StopBits.One);
serialPort.Open(); // シリアルポートオープン
// f.Dispose(); // ProgressBarのForm閉じる
〜以下省略
↓ProgressBarが貼り付けてあるForm
timer1のインターバルは1秒設定で、60秒ProgressBarで進捗表示させると共に
label1に60秒のカウントダウン数字を表示させようとしています。
public partial class frmProgressBar : Form
{
public frmProgressBar()
{
InitializeComponent();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
int cnt;
if (progressBar1.Maximum < progressBar1.Value)
{
progressBar1.Value++;
}
cnt = int.Parse(label1.Text);
cnt--;
label1.Text = cnt.ToString();
}
}
ですが、実際に実行させてみると、ProgressBarのFormは表示されるのですが、serialPort.Open();の処理に
入った後、timer1_Tickにブレークを張っても引っかからず、ProgressBarやLabelの値が進捗しません。
serialPort.Open();の処理を抜けた後から、timer1_Tickに張ったブレークに引っかかるようになり、
ProgressBarやLabelの値が進捗するようになります。
serialPort.Open()がアプリの処理を握ってしまっている為、ProgressBar等の表示更新はできないのでしょか?
ちなみに、serialPort.Open()の処理が1分かかっている状態でもタスクマネージャを開いて確認したところ、
CPU使用率は6%〜8%程度なのでCPU的に空きがない状態ではなさそうです。
何か良い方法はありませんでしょうか?