2008年4月15日火曜日

VC++2005/2008 シリアルポートを使用する

VC++2005/2008 シリアルポートを使用する

ボタン1を押すと、listBox1に全ポート名、listBox2に使用可能なポート名を表示します。

[ツールボックス]->[コンポーネント]->[SerialPort]を貼り付けて、以下のソースを使用します。


using namespace System::IO::Ports; // シリアルポート


public: SerialPort port; // シリアルポート宣言


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

listBox1->Items->Clear(); // リストボックス1初期化
array<System::String^>^ names = SerialPort::GetPortNames(); // ポート名取得
listBox1->Items->AddRange( names ); // リストボックス1へ出力する
// listBox1->Items->AddRange( SerialPort::GetPortNames() );

listBox2->Items->Clear(); // リストボックス2初期化
for(char ii=0; iiItems->Count; ii++)
{
System::String^ name;
try
{
name = listBox1->Items[ii]->ToString();
port.PortName = name;
port.Open();
}
catch(Exception^ e)
{
name = System::String::Format("{0}",e);
}
finally
{
port.Close();
if( name != "" )
{
listBox2->Items->Add(name);
}
}
}
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
できるだけ詳しく記述しました。よろしくお願いします。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(1)プロジェクトを simpleUart という名前で新規作成します。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■[ファイル]→[新規作成]→[プロジェクト]→ simpleUart

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(2)Form1 にツールボックスの以下のコントロールを配置し、イベントハンドラを作成します。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

①Button1 (コモンコントロール)
②ListBox1 (コモンコントロール)
③ListBox2 (コモンコントロール)
④serialPort1 (コンポーネント)
⑤Button1のイベントハンドラを作成します。(Button1ダブルクリックで "button1_Click"を作成します)

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(3)Form.h の全ソースコードを以下に示します。
↓追加 ~↑追加で囲まれた部分がデフォルトから追加したところを示します。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// ソースコードの始まり
// ■注意■ ">"と"<"は全角なので半角に置換してください。
// (半角ではHTML表示で問題があるため)

#pragma once


namespace simpleUart {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
// ■■■■■■■■■■■■■■■■■↓追加
using namespace System::IO::Ports; // シリアルポート
// ■■■■■■■■■■■■■■■■■↑追加

/// <summary>
/// Form1 の概要
///
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
/// 変更する必要があります。この変更を行わないと、
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
/// 正しく相互に利用できなくなります。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}

protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::IO::Ports::SerialPort^ serialPort1;
protected:
private: System::Windows::Forms::ListBox^ listBox1;
private: System::Windows::Forms::ListBox^ listBox2;
private: System::Windows::Forms::Button^ button1;
private: System::ComponentModel::IContainer^ components;

private:
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
// ■■■■■■■■■■■■■■■■■↓追加
public: SerialPort port; // シリアルポート宣言
// ■■■■■■■■■■■■■■■■■↑追加


#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->components = (gcnew System::ComponentModel::Container());
this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));
this->listBox1 = (gcnew System::Windows::Forms::ListBox());
this->listBox2 = (gcnew System::Windows::Forms::ListBox());
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// listBox1
//
this->listBox1->FormattingEnabled = true;
this->listBox1->ItemHeight = 12;
this->listBox1->Location = System::Drawing::Point(13, 43);
this->listBox1->Name = L"listBox1";
this->listBox1->Size = System::Drawing::Size(106, 76);
this->listBox1->TabIndex = 0;
//
// listBox2
//
this->listBox2->FormattingEnabled = true;
this->listBox2->ItemHeight = 12;
this->listBox2->Location = System::Drawing::Point(144, 43);
this->listBox2->Name = L"listBox2";
this->listBox2->Size = System::Drawing::Size(106, 76);
this->listBox2->TabIndex = 1;
//
// button1
//
this->button1->Location = System::Drawing::Point(13, 10);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(85, 22);
this->button1->TabIndex = 2;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 266);
this->Controls->Add(this->button1);
this->Controls->Add(this->listBox2);
this->Controls->Add(this->listBox1);
this->Name = L"Form1";
this->Text = L"Form1";
this->ResumeLayout(false);

}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// ■■■■■■■■■■■■■■■■■↓追加
listBox1->Items->Clear(); // リストボックス1初期化
array<System::String^>^ names = SerialPort::GetPortNames(); // ポート名取得
listBox1->Items->AddRange( names ); // リストボックス1へ出力する
listBox2->Items->Clear(); // リストボックス2初期化
for(char ii=0; ii<listBox1->Items->Count; ii++)
{
System::String^ name;
try
{
name = listBox1->Items[ii]->ToString();
port.PortName = name;
port.Open();
}
catch(Exception^ e)
{
name = System::String::Format("{0}",e);
}
finally
{
port.Close();
if( name != "" )
{
listBox2->Items->Add(name);
}
}
}
}
// ■■■■■■■■■■■■■■■■■↑追加
};
}

// ソースコードの終わり

■■■■■■■■■■■■■■■■■■■■■■■■
質問の回答は最新のブログで記載させていただきました。
■■■■■■■■■■■■■■■■■■■■■■■■


■■■■■■■■■■■■■■■■■■■■■
>プログラムの、L"button1";のところの
>Lというのはどういった意味があるのでしょうか?
>初歩的な質問かもしれませんが教えてほしいです。

Lの意味
Lをつけるとコンパイル時に""内の文字を変換なしで実行されるようです。
Lをつけないときはコンパイル時に""内の文字をUnicodeへ変換してから実行されます。
■■■■■■■■■■■■■■■■■■■■■
>private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
>は、どういった動作をさせるために書いているんですか?

ボタン1(button1)を押したときに、させたいことを記述する場所です。
本稿では、ボタン1を押すことで、リストボックスに使用可能なシリアルポートを表示するようにしたものです。
()内にあるのは引数(ひきすう)と呼ばれるものです(とりあえずは使う必要はないと思います)。

■■■■■■■■■■■■■■■■■■■■■
大変失礼なことをお聞きして申し訳ありませんが、
VC++2005/2008 は少し敷居が高いと感じているのではないでしょうか?
VC++2005/2008 という言語は、「C言語」と「C++」の経験が無いとなかなか難しいと思います。
だからといって、「C言語」から勉強するというのも大変ですよね。
でもやはり、「C言語」と「C++」の基本は習得しておいたほうが良いと思います。

私の場合ですが、初心者の頃は以下のサイトの「C言語」と「C++」を活用させていただきました。
毎日1時間程度、サンプルを入力して動かして、という勉強をしていました。
すると、2、3ヶ月で基本がマスターできました。参考まで。

http://www.geocities.jp/ky_webid/index.html
http://wisdom.sakura.ne.jp/programming/

7 件のコメント:

匿名 さんのコメント...

このプログラムについてもう少し詳しく教えていただけませんか?
省略している部分もできれば教えてください。

匿名 さんのコメント...

詳しく書いてくれてありがとうございます。

申し訳ありませんが
(2)Form1 にツールボックスの以下のコントロールを配置し、イベントハンドラを作成します。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

①Button1 (コモンコントロール)
②ListBox1 (コモンコントロール)
③ListBox2 (コモンコントロール)
④serialPort1 (コンポーネント)
⑤Button1のイベントハンドラを作成します。(Button1ダブルクリックで "button1_Click"を作成します)

というふうにあったのですが、

Form1 にツールボックスの以下のコントロールを配置のやり方がわかりません。あとForm1、Form.hの違いもよくわかりません。このような質問で恐縮ですがお答えいただけないでしょうか?
ビルドしてもエラーが出てしまいます。

匿名 さんのコメント...

申し訳ございませんが、また質問したいことがあるのですが

プログラムの、L"button1";のところの
Lというのはどういった意味があるのでしょうか?
初歩的な質問かもしれませんが教えてほしいです。

匿名 さんのコメント...

追加でお願いします。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
は、どういった動作をさせるために書いているんですか?

匿名 さんのコメント...

質問に答えていただきありがとうございました。これから少しずつ、CとC++の基本を勉強していきシリアルポート通信のプログラムを作りたいと思います。

匿名 さんのコメント...

'port' : 定義されていない識別子です。
とか
'.PortName' の左側はクラス、構造体、共用体でなければなりません
のエラーが出るのですが、原因がわかりません。

優瞬会 さんのコメント...

回答します。
port を宣言してください。「宣言する場所は、必要なデザイナ変数です。」の下です。

//■■■■■■■■■■■■■■■■■↓追加
public: SerialPort port; // シリアルポート宣言
//■■■■■■■■■■■■■■■■■↑追加