質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

2854閲覧

C#を使用してWindowsとRaspberryPi4間でシリアル通信を行いたい.

kanta.sasaki

総合スコア11

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/07/10 14:38

前提・実現したいこと

C#を使用してWindows10HomeとRaspberryPi4BをBluetoothを使用し仮装COMポートを使用したシリアル通信を行いたいと考えています.
C#を使用した場合は一瞬接続が成功したのちにDisconnectedという表示がRaspberryPiのターミナルに表示されてしまいます.
C#で使用したいるコードはマイクロソフトが公式で発表しているコードをそのままコピペして使用しており, 実行するとCOMポートやBaudRateを入力する仕様となっており, これはデバイスマネージャで対象のCOMポートの情報を確認して入力しています.
C#と仮想COMポートを使用してシリアル通信をする方法で参考にすると良い文献コードの問題点などわかることございましたらご教授いただけるとありがたいです.

該当のソースコード

// Use this code inside a project created with the Visual C# > Windows Desktop > Console Application template. // Replace the code in Program.cs with this code. using System; using System.IO.Ports; using System.Threading; public class PortChat { static bool _continue; static SerialPort _serialPort; public static void Main() { string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow the user to set the appropriate properties. _serialPort.PortName = SetPortName(_serialPort.PortName); _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate); _serialPort.Parity = SetPortParity(_serialPort.Parity); _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits); _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits); _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake); // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _continue = true; readThread.Start(); Console.Write("Name: "); name = Console.ReadLine(); Console.WriteLine("Type QUIT to exit"); while (_continue) { message = Console.ReadLine(); if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine( String.Format("<{0}>: {1}", name, message)); } } readThread.Join(); _serialPort.Close(); } public static void Read() { while (_continue) { try { string message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } } } // Display Port values and prompt user to enter a port. public static string SetPortName(string defaultPortName) { string portName; Console.WriteLine("Available Ports:"); foreach (string s in SerialPort.GetPortNames()) { Console.WriteLine(" {0}", s); } Console.Write("Enter COM port value (Default: {0}): ", defaultPortName); portName = Console.ReadLine(); if (portName == "" || !(portName.ToLower()).StartsWith("com")) { portName = defaultPortName; } return portName; } // Display BaudRate values and prompt user to enter a value. public static int SetPortBaudRate(int defaultPortBaudRate) { string baudRate; Console.Write("Baud Rate(default:{0}): ", defaultPortBaudRate); baudRate = Console.ReadLine(); if (baudRate == "") { baudRate = defaultPortBaudRate.ToString(); } return int.Parse(baudRate); } // Display PortParity values and prompt user to enter a value. public static Parity SetPortParity(Parity defaultPortParity) { string parity; Console.WriteLine("Available Parity options:"); foreach (string s in Enum.GetNames(typeof(Parity))) { Console.WriteLine(" {0}", s); } Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), true); parity = Console.ReadLine(); if (parity == "") { parity = defaultPortParity.ToString(); } return (Parity)Enum.Parse(typeof(Parity), parity, true); } // Display DataBits values and prompt user to enter a value. public static int SetPortDataBits(int defaultPortDataBits) { string dataBits; Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits); dataBits = Console.ReadLine(); if (dataBits == "") { dataBits = defaultPortDataBits.ToString(); } return int.Parse(dataBits.ToUpperInvariant()); } // Display StopBits values and prompt user to enter a value. public static StopBits SetPortStopBits(StopBits defaultPortStopBits) { string stopBits; Console.WriteLine("Available StopBits options:"); foreach (string s in Enum.GetNames(typeof(StopBits))) { Console.WriteLine(" {0}", s); } Console.Write("Enter StopBits value (None is not supported and \n" + "raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString()); stopBits = Console.ReadLine(); if (stopBits == "" ) { stopBits = defaultPortStopBits.ToString(); } return (StopBits)Enum.Parse(typeof(StopBits), stopBits, true); } public static Handshake SetPortHandshake(Handshake defaultPortHandshake) { string handshake; Console.WriteLine("Available Handshake options:"); foreach (string s in Enum.GetNames(typeof(Handshake))) { Console.WriteLine(" {0}", s); } Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString()); handshake = Console.ReadLine(); if (handshake == "") { handshake = defaultPortHandshake.ToString(); } return (Handshake)Enum.Parse(typeof(Handshake), handshake, true); } }

試したこと

windows側をC#ではなくTeraTermを使用した場合は, RaspberryPiと仮想COMポートを用いてシリアル通信を行うことが確認できている.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2020/07/10 16:53

・エラーメッセージ等、何も出ていませんか? ・C#側をステップ実行してみて、どの段階で接続が切断されるか調査してみてください。
kanta.sasaki

2020/07/10 22:38

PortName: COM8 BaudRate: 9600 Parity: None DataBits: 8 StopBits: One Handshake: None を全て設定しシリアルポートを開いた瞬間に一瞬だけ接続され一瞬で接続が切れてしまいます.
dodox86

2020/07/10 23:02

> 公式で発表しているコードをそのままコピペして こういったものの場合、あくまでサンプルコードなのでコードの内容を理解してご自分の環境に合わせて修正する必要があることがほとんどです。コードの内容はご理解されていますか? 必要であれば、もっとシンプルなコードにして試した方が良いと思います。 > デバイスマネージャで対象のCOMポートの情報を確認して入力しています. デバイスマネージャーで表示の情報は既定のものなので、そうではなく、接続先相手の通信設定に合わせる必要があります。tereterm で使えるのであれば、teratermで動いているときの設定に合わせてみてください。 > _serialPort.ReadTimeout = 500; > _serialPort.WriteTimeout = 500; この部分が良くない、ということはないですか? 送受信共に、500ミリ秒しか待機していません。
guest

回答2

0

ベストアンサー

例えば、

C#

1SerialPort port= new SerialPort(); 2port.PortName= "COM8"; 3port.Open(); 4Thread.Sleep(10000); 5port.Close();

ぐらいまで絞り込んだ場合には何が起こるでしょう?
これで現象が出ないなら、少しずつ足していってなにが原因か探ることになりますし、
これでも現象が出るようなら、Bluetoothのドライバと.NetFrameworkのシリアルの「相性」とかなんとかいう話になるかも知れません。

投稿2020/07/11 01:33

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanta.sasaki

2020/07/11 04:24

現象は起こってしまうのでBluetoothのドライバと.NetFrameworkのシリアルの「相性」あたりを調査してみようと思います. ありがとうございます.
guest

0

シリアル通信には接続が切れる、という概念はありません。
#通信が中断される、というのはわかっても、切断は検知できない
そのDisconnectedというのはBluetoothによるものでしょう。

C#側のコードはあくまでシリアル通信のコードでしか無いため、Bluetoothに関してはなにも関係がありません

投稿2020/07/10 22:53

編集2020/07/10 22:56
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問