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

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

新規登録して質問してみよう
ただいま回答率
85.46%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

シリアルポート

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

1738閲覧

WPFのPrismでほかのモジュールからもSerialportを使う方法

namekuhito

総合スコア21

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

シリアルポート

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/08/19 06:51

編集2022/01/01 16:41

前提条件

・VisualStudio 2019
・.NET 5
・prism 8.1.97

やりたいこと

ソフトが立ち上がった時点からシリアルポートを開けて、シリアル通信を行いたいです。そのときに、画面が切り替わったとしても切断されずに切り替わった先の画面でも共有できるようにしたいです。

![イメージ説明

現在、SerialPort_SampleのMainWindow.xamlにViewのViewsの中のxamlを表示しています。初めに、Start.xamlが表示され、ボタンを押すことでConfig.xamlに遷移します。そこで、SerialPort_SampleのMainWindow.xamlのコードビハインドにSerialPortを開けて通信するような処理を追加しています。このSerialPortをStart.xamlやConfig.xamlのコードビハインドかViewModelで扱いたいと考えています。
ただ、プロジェクトViewのStart.xaml.csにSerialPortを記述してもエラーになります。UsingやSerialPortを定義したSerialPort_Sampleから書き始めても同様にエラーになります。
また、プロジェクトSerialPort_SampleではプロジェクトViewを参照しているのですが、プロジェクトViewではプロジェクトSerialPort_Sampleは循環してしまうので、できていない状態です。

using System; using System.Windows; using System.Windows.Threading; using System.Windows.Controls; using System.IO.Ports; namespace SerialPort_Sample.Views { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public static SerialPort serialPort = new SerialPort(); private void Window_Loaded(object sender, RoutedEventArgs e) { try { serialPort.PortName = "COM3"; serialPort.BaudRate = 9600; serialPort.Parity = Parity.Odd; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Handshake = Handshake.None; serialPort.NewLine = "\r"; serialPort.ReadTimeout = 500; serialPort.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }

調べたこと

DIコンテナが近いのかなと感じました。ただ、シリアルポートを登録して使うことができるのかわかりませんでした。


言葉足らずの箇所があるかと思いますが、よろしくお願いいたします。

TN8001👍を押しています

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

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

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

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

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

y_waiwai

2021/08/19 07:25

問題が見えません。 コードを提示しましょう
dodox86

2021/08/19 09:54

ご提示のコードはPrismは全然関係ないように思いますが、、、あくまでPrismの使い方、流儀のようなものに沿って使いたいということなのでしょうか。Prismが関係なければ、適切にSerialPortを恒久的なAppやMainWindowのプロパティなりで公開させて、使いまわすだけで良いはずなのですが。
namekuhito

2021/08/19 11:39 編集

知識不足で申し訳ないのですが、適切にSerialPortを恒久的なAppやMainWindowのプロパティなりで公開 を教えていただけると幸いです。 よろしくお願いいたします
guest

回答2

0

そのソフト内での話なら(ソフト内での画面の切り替え)
そのままserialPortは使えるはずです


他のソース/classからでも、MainWindow.serialport でアクセスできますよ

投稿2021/08/19 08:18

編集2021/08/19 11:40
y_waiwai

総合スコア87800

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

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

namekuhito

2021/08/19 11:39

画面切り替えのStart.xaml.csやConfig.xaml.csにserialpPortを記述しようと、UsingでSerialpPort_Sampleを追加しようとしてもできず、どのような方法があるか教えていただけたら幸いです。 よろしくお願いいたします
namekuhito

2021/08/19 12:07

お手数をおかけして申し訳ないのですが、SerialPort_Sample.Views.MainWindow.serialportをView.Views.Start.xaml.csで参照できないのですが、何か不足がありますでしょうか。 View.Start.xaml.csにはMainWindow.serialportと記述したのですが、MainWindowをまず認識しません。また、UsingもSerialPort_Sampleを追加できない状態です。 よろしくお願いいたします
dodox86

2021/08/19 12:42

@質問者さん まず、C#と.NETの基本を学ぶべきな気がしますがそんなことはないですか?
y_waiwai

2021/08/19 12:48

おなじnamespaceからなら、Usingの記述の必要はありません で、違うnamespaceなんでしょうか
namekuhito

2021/08/21 07:02

namespaceは異なります。 SerialpPort_SampleとViewのプロジェクト間をまたいでSerialpPortを使用したいのですが、それでも違いますでしょうか。
y_waiwai

2021/08/21 07:05

なら、ネームスペース名.MainWindow.serialport でアクセスできませんか で、繰り返しになりますが、同じソフトの中なんですよね?
namekuhito

2021/08/22 23:38

ネームスペース名.MainWindow.serialportでアクセスできませんでした。 大変申し訳ないのですが、ソリューションSerialPort_Sampleの中のプロジェクトSerialPort_Sampleで定義したSerialportを同じソリューション内のプロジェクトViewのなかで使いたいのですが、これは同じソフト内にあるという解釈で大丈夫でしょうか。 よろしくお願いいたします。
guest

0

ベストアンサー

ViewプロジェクトからSerialPort_Sampleプロジェクトを見えるようにするには参照の追加が必要ですが、すでにSerialPort_SampleプロジェクトがViewプロジェクトを参照しているので循環参照となり追加できません

ではどうするかですが、Prism Full Appテンプレートに答えが書いてあるのですが見たことはないでしょうか?

以下はPrism Full App(.NET Core)テンプレートで出力されたソリューションです。

Prism Full Appソリューション

プロジェクトが合計5つあります(本題に関係ないテストプロジェクトは削除しました)

  • FullApp1.Modules.ModuleName
    ViewAがあるモジュール
  • FullApp1.Services
    メッセージサービス
  • FullApp1.Services.Interfaces
    メッセージサービスのインターフェース
  • FullApp1
    アプリ本体
  • FullApp1.Core
    共通で使う定数やユーティリティ

依存関係のところをよく見てください。
FullApp1.Modules.ModuleNameプロジェクトとFullApp1プロジェクトは、ともにFullApp1.CoreプロジェクトとFullApp1.Services.Interfacesプロジェクトを参照していますが、循環参照になってるところは一切ありません。

(それを踏まえて)解決法は↓のような方法が考えられます。

  • 共有したい部分を別プロジェクトに切り出す
    一番単純で手間がないのは共有したいものを、FullApp1.Coreに移すことです。
    手軽ですが密結合になってしまいます。
  • 抽象に依存するようにする
    より望ましいのはメッセージサービスのように、インターフェース越しにアクセスすることです。
    しかしどういうインターフェースにすべきか設計し実装しなくてはなりません。
  • Event Aggregatorで通信する
    そのほかの方法としては、Event Aggregatorがありますがどう使い分ければいいのか私はわかりません^^;
    Event Aggregator | Prism

参考
Modular Application Development Using Prism Library | Prism
PrismLibrary/Prism-Samples-Wpf: Samples that demonstrate how to use various Prism features with WPF


もしも上記説明や参考リンクを見ても「ちんぷんかんぷんで1ミリもわからない」場合は、モジュールを使わず1プロジェクトにまとめるべきです(そもそもPrismを使う段階ではないと思います)

投稿2021/08/23 12:17

編集2023/08/14 13:03
TN8001

総合スコア9401

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

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

namekuhito

2021/08/24 01:27

抽象に依存するようにするでインターフェイスの設計をして、通信できるか試してみます。 ご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問