前提・実現したいこと
VisualStudioでRS232Cでシリアル通信を行うプログラムを作成しております。
COMポートの接続・送信・受信自体は問題が無い状態で、同様のプログラムを入れたパソコンで動作を確認済みです。
実現したいことが、serialportで送信→受信待ち→受信したら送信を行いたいです。
発生している問題・エラーメッセージ
serialportメソッドのwritelineで送信しておりまして、受信待ちがうまくいっておりません。
while文で受信データボックスが空で無い間は、待機という考えなのですがどうにも待機せずに
送信されてしまいます。
理想:1回目のデータ送信→受信ボックスにデータが来る→自動でxxxデータを送る
現状:1回目のデータ送信→xxxデータを送ってしまう
該当のソースコード
ソースコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) { serialPort1.Encoding = Encoding.ASCII; } private void sendButton_Click(object sender, EventArgs e) { //シリアルポートがオープンしていない場合、処理しない if(serialPort1.IsOpen==false) { return; } //受信データボックスを空にする// rcvText.Text = ""; //テキストボックスからデータを取り出す String data = sndText.Text; //送信データがない場合、データを送信しない if(string.IsNullOrEmpty(data) ==true) { return; } try { //シリアルポートからデータ送信 data = data + "\r"; serialPort1.WriteLine(data); //受信データがくるまで待機// while (rcvText.Text != "") ; //2回目のデータ送信// string xxx = "xxx"; serialPort1.WriteLine(xxx); //送信データテキストボックスクリア sndText.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void readButton_Click(object sender, EventArgs e) { if(serialPort1.IsOpen == true) { //シリアルポートをクローズする! serialPort1.Close(); //切断ボタンを xxxx 表示に変える! exitButton.Text = "xxxx"; } else { //オープンするシリアルポートをテキストボックスから取り出す! serialPort1.PortName = comPort.Text; try { //シリアルポートをオープンにする serialPort1.Open(); //ボタンの表示を変更 exitButton.Text = "切断"; readButton.Text = "xxxx"; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void exitButton_Click(object sender, EventArgs e) { //シリアルポートをクローズ serialPort1.Close(); //ボタン表示の変更 exitButton.Text = "xxxx"; readButton.Text = "接続"; } private void deleteButton_Click(object sender, EventArgs e) { //受信データのクリア rcvText.Text = ""; } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { //シリアルポートがオープンしていない場合、処理をなし if(serialPort1.IsOpen==false) { return; } try { //受信データの読み込み string data = serialPort1.ReadLine(); data = data +"\r"; if (!string.IsNullOrEmpty(data)) { Invoke((MethodInvoker)(() => rcvText.AppendText(data))); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
}
試したこと
while (rcvText.Text != "") ;
で受信データ待機が出来ていない
補足情報(FW/ツールのバージョンなど)
Visual Studio 2015
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/27 11:52
2020/01/27 12:04 編集
2020/01/27 12:09
2020/01/27 12:36
2020/01/27 12:38
2020/01/28 10:37