プロが教える店舗&オフィスのセキュリティ対策術

インターフェース2012年6月号付属FM3マイコン基板を使いPCとのUSB通信を試みております。

インターフェース6,7月号との基盤特集ページ(http://www.kumikomi.net/interface/contents/fm3.php)を参考に、マイコンにUSB通信プログラム(仮想シリアルデバイス、PCから送信された文字をエコーバックするプログラム)を書き込み、特集ページの64ビットデバイスドライバをPC(win7、64bit)にインストール、Tera Termで接続しました。ここでTera Termではエラー無く接続でき送信した文字列はエコーバックされて画面上に表示されました。

次にTera TermではなくPC側のプログラムを自作したいと考え、色々なHPを参考に下記の様なコードをVisual C# 2010 Expressで書きました。(また構成マネージャを編集し64ビットに対応(したつもりです)しました)

これで実行すると、「システムに接続されたデバイスが機能していません」というエラーが出てしまい、どうにも先に進めなくなってしまいました。

原因をご存知のかたや解決のアイデアのあるかたアドバイスをいただければ幸いです。
どうぞよろしくお願いいたします。


////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace SerialTest01
{
class Program
{
static SerialPort port = new SerialPort();
static void Main(string[] args)
{
//if (IntPtr.Size == 4)
//{
// Console.WriteLine("32ビット");
//}
//else if (IntPtr.Size == 8)
//{
// Console.WriteLine("64ビット");
//}

SerialInitialization();

Console.ReadLine();

port.Close();
port.Dispose();
}

static void SerialInitialization()
{
try
{
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
Console.Write(ports[0] + "に接続します。\n\n");

port.PortName = ports[0];
port.BaudRate = 9600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.ReadTimeout = 30000;
port.WriteTimeout = 30000;
port.DtrEnable = true;
port.RtsEnable = true;

if (port.IsOpen) Console.Write("ERROR: " + ports[0] + "は既に開いています。");
else port.Open();
}
catch (Exception ex)
{
Console.Write("ERROR:\n" + ex);
}

}
}
}
////////////////////////////////////////////////////////////////

A 回答 (4件)

>実機で試して頂いてありがとうございます。



実機と行っても、別のマイコンですから……
ドライバ部分の問題はわからないままです。

TeraTermで動作しているのに.NET Framework(C#)だと動かない。
というのはおかしいと思われます。
ドライバが影響しそうではなさそうですし……。
# というワケで、こちらでは判らないままです。 該当の書籍は…買う予定もありませんし…。
# ダメ元で発行元に確認くらいでしょうか。
    • good
    • 0

>私のC#の使い方に問題があると思うのですが・・・



見る限り、きわめて普通の使い方…かと思います。
まぁ私なら…
>static SerialPort port = new SerialPort();
のnew以降はコンストラクタとか、初期化処理の中(このソースだと…SerialInitialization()の中でしょうか)でやると思いますが…。
ちなみに、XPとarduinoで掲示されたコードでは普通に動作しています。

デバイスドライバ側の問題…でしょうかねぇ……。

>if (port.IsOpen) Console.Write("ERROR: " + ports[0] + "は既に開いています。");

IsOpenの仕様的にこちらには流れないものと思われます。
他のアプリでオープンしていた場合はIsOpenでは判定できないみたいです。
# 例外が飛ぶのでcatchの方に行くでしょう。

この回答への補足

実機で試して頂いてありがとうございます。プログラムアドバイスありがとうございます!

むぅ・・・手がかりが少なくて難しい

補足日時:2012/07/12 11:15
    • good
    • 0

>(また構成マネージャを編集し64ビットに対応(したつもりです)しました)



関係ないかも知れませんが……32Bit(x86)にした場合はどうなんでしょうか?

TeraTermでは通信できているようですので、C#からのCOMポートの扱いに問題がある……んでしょうかね。

この回答への補足

私のC#の使い方に問題があると思うのですが・・・
特にドライバまわりがよくわかりません。


構成マネージャで32bitにした場合、64bitの時と同じ「システムに接続されたデバイスが機能していません」というエラーが出ます。


マイコンのプログラムをエコーバックありのものと無しのもので試したところ、TeraTermでちゃんとエコーバックなしの場合は画面上に文字が表示されないことも確認しました。(エコーバックありの時はちゃんと表示されます)

接続されてないポート(例えば"COM3")を指定すると「ポート'COM3'は存在しません。」というエラーがかえってきます。

補足日時:2012/07/09 18:10
    • good
    • 0

port.PortName = ports[0];


などの文字列の扱いがへんなのでは。

この回答への補足

ports[0]にはマイコンと通信するためのポート名(わたしの環境でCOM5)が正しく入っています。

補足日時:2012/07/08 00:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!