2

シリアルポート経由で通信する必要があります。2つのデバイスを介したBluetooth通信を許可するために今それをやろうとしていますが、どこにも行きません。

私はシリアル通信を可能にするアプリケーション (Bluetooth Explorer と呼ばれる) をデバイス上に持っており、ご参考までに Stonestreet One スタックを使用して Bluetooth 経由で送信されます :(

設定では、COM ポートが定義された「サービス」を作成できます。

そこで、次のコードを実行してみます (あるデバイスで Write を呼び出し、別のデバイスで Read を呼び出します)。BTExplorer をserialPort.Open()実行するとペアリングアプリが起動します。その中で、使用したい「サービス」を選択します (シリアルポート 1)。

しかし、serialPort.ReadLine()ハングアップし、二度と戻りません。(つまり、本当にハングします。アプリを強制終了するには、デバイスをウォーム ブートする必要があります。プロセスの終了/プロセスの強制終了は機能しません。)

参照用のコードは次のとおりです。

public void WriteSerial()
{
    SerialPort serialPort = new SerialPort("COM4");
    serialPort.Open();
    serialPort.WriteLine("Hello To The Other Side");
    serialPort.Close();
}

public void ReadSerial()
{
    SerialPort serialPort = new SerialPort("COM4");
    serialPort.Open();
    string output = serialPort.ReadLine();
    serialPort.Close();
    MessageBox.Show(output);
}

private void btnWrite_Click(object sender, EventArgs e)
{
    WriteSerial();
}

private void btnRead_Click(object sender, EventArgs e)
{
    ReadSerial();
}

これを機能させる方法は?

MC70 デバイスで Windows Mobile 5 を使用しています。Bluetooth スタックは Stonestreet One です (残念ながら変更できません)。C# Compact Framework .NET 3.5 での開発

4

1 に答える 1

5

APIヘルプには、

デフォルトでは、ReadLine メソッドは行が受信されるまでブロックされます。この動作が望ましくない場合は、ReadTimeout プロパティをゼロ以外の値に設定して、ポートで回線が使用できない場合に ReadLine メソッドが強制的に TimeoutException をスローするようにします。

...だから、ハングを避けたい場合はそうしてください。

ともかく:

  • 2 つのデバイス/ポートが (Bluetooth 経由で) 相互に接続されていることをどのように確認できますか?
  • Open メソッドを呼び出す前に、SerialPortプロパティ (など)を設定していますか?BaudRate
  • どちらを最初に呼び出すか、どちらを呼び出すかによって違いはありますReadLineWriteLine? open/write/close と open/read/close を行う代わりに、open/open/read/write/close/close を行うのはどうですか?
  • BytesToRead送信者が呼び出した後、受信者プロパティは何を返しますWriteLineか?
  • 存在するシリアルポートのサンプルコードを見ましたか ( Stonestreet One Bluetooth SDK FAQによると)

彼らの SDK にサンプル プログラムがある場合は、サンプル プログラムを変更する前、および/または独自のソフトウェアをテストする前に、それを (変更せずに) 使用してテスト セットアップを検証する (たとえば、デバイスが正しく接続されていることを確認する) ことをお勧めします。 (サンプル ソフトウェアで既にテストしたものと同じデバイス/テスト セットアップを使用します)。

于 2009-10-07T22:38:58.150 に答える