お世話になっております。
行いたいこと
シリアル通信ができる機器から任意のタイミングで最新の値を受信したいと思っています。
ボタンを押した際にその時の最新の値を出力する。 といったイメージです。
行ったこと
以下のように考えて実装してみました。
・受信用のクラスを作成して、受信があるたびにプロパティを更新する。
・ボタンが押された際に、受信用クラスのGetプロパティにアクセスする。
質問
下記にコードを提示ますが、なにか問題はあるでしょうか。
DataReceivedで値更新と受信用クラスのGetプロパティに同時にアクセスしてしまった場合など…
調べたところlockステートメントがあるとのことですが、intに対しては使用できないと怒られてしまいました。
また、より良い実装方法などがあれば、教えていただければ幸いです。
コード
```C#
public class Receiver
{
private SerialPort Port;
public int Value { get; private set; }
public void Connect(string dviceName) { if (Port != null) return; Port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); Port.Open(); Port.DataReceived += Port_DataReceived; } public void Disconnect() { if (Port != null && Port.IsOpen) { Port.DataReceived -= Port_DataReceived; Port.Close(); Port = null; } } private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); int val; Value = int.TryParse(indata, out val) ? val : Value; } } public partial class MainWindow : Window { Receiver rec; public MainWindow() { InitializeComponent(); rec = new Receiver(); rec.Connect(); this.Closing += (s, e) => { rec.Disconnect }; } private void Button_Click(object sender, RoutedEventArgs e) { Console.WriteLine(rec.Value); } }
**環境** C#, .NET 4.6, VS 2017 Pro
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/29 04:42
2017/12/29 15:14
2017/12/30 11:10