Qiita @mag様のSerialTestをベースにさせていただいて、シリアル受信データの各種処理を学習してます。
今回のその2は、原作は、textBoxに記録しているのですが、これをExcelライクな数表であるDataGridViewに
書込むコードを追加しました。
●特徴
1:受信データは、ASCIIで1行にカンマ区切りで何個でも大丈夫です。
2:データ行数を行ヘッダに表示します。
3:データ行数の限界は、C#のメモリー次第ですので、数万行は大丈夫ですが、3万行付近から表示が遅くなります。
4:コピーしてEXCELにペーストできるので、CSVファイルにしなくても即EXCELでデータ加工できます。(Ctrl-Cでコピー)
5:ボーレートは115200になってます、ご自分でコードを変更してください。button1_Click内です。
6:応答周期はPCの速度次第ですが、遅い機CPUでも10msec周期くらいは大丈夫です。データ長が数十バイトの場合ですが、
以降:その3で、CSVファイルへの保存、読み取り機能もつけます。
以降:その4で、右クリックで、データ行編集機能をつけます。(Delete,Insert,Copy,Paset)
※2022/7/29修正 「DGVをコピー(ctrl-C)してExcelに貼り付けができない場合」
行末にCRLFがついているデータの場合は、コピペがうまくいかないのを修正しました。
参考にさせていただいたサイトに感謝:http://nanoappli.com/blog/archives/7525
※2022/7/29 マイコンと接続時に、通常マイコンでprintln()をすると/r/nなので、C#では、readLineデフォルトは¥nなので正確には
¥r¥nですが、¥nでも受信読み込みはできますが、文字列最後に¥rがついてますので注意です。
serialPort1.NewLine = “¥r¥n”; //WIndowsでは、¥が改行マーク
string str = serialPort1.ReadLine();
改行マークが、arduinoとVBとC#が異なるので、注意です。参照させたいただいたサイト様https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/999envnewline/envnewline.html
●追加したコード
Response関数のelse以下がデータ表示部なので、そこにdgv1を追加しました。
下記コードをコピーすると全角が混じるので、プログラムエラーになるので、
gistからコードコピーしてください。
https://gist.github.com/dj1711572002/33853cb363f159febab9ed6af6e0075c
フォームをつくるのが面倒なら、プロジェクト全部ZIPでダウンロードしてください。
SerialDGV_03
private void Response(string text) { if (textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(Response); BeginInvoke(d, new object[] { text }); } else { // textBox1.AppendText(text + “\n”); //===============データグリッドビュー dgv1へ記録=================== string[] data =( text+”,\n”).Split(‘,’);//カンマ区切りにばらす int cN = data.Length;//列長さ if (rN == 0)//行カウントrN==0のときdgv1定義 rN++; } |
●DataGridViewの設置と使い方
①コントロールですので、フォームに、ツールボックスからドラッグして登録します。
②DataGridView1と長々しい名前が面倒なので、Propertyを開いて、デザイン>nameでdgv1 という名前に変更してください、コードが全部 dgv1になってますので、名前変更しないと走りません。
③初期設定は、プログラム内で全部やっているので、Propertyをいじる必要はありませんが、
サイズをご自分の使い勝手に合わせて調整してみてください。
●dgv1の動作
青太文字で説明
ここでは、受信データ textが1行入ってきたときの動作を書いてあります。
//===============データグリッドビュー dgv1へ記録=================== string[] data =( text+”,\n”).Split(‘,’);//カンマ区切りにばらす int cN = data.Length; //String配列dataの個数cNを得る //rNは、グローバル宣言された整数で現在行のカウンタ if (rN == 0)//行カウントrN==0のときdgv1定義初回だけ実行 { dgv1.ColumnCount = cN ;//列数決める dgv1.RowCount = 2;//初回の行数を2行だけ確保 dgv1.RowHeadersWidth = 100;//行ヘッダ幅を広くとる行番号が桁が大きいため//行末にCRLFがある場合、コピーがうまくいかないので、下記行を追加します dgv1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True; }rN++;//行をカウントアップ dgv1. FirstDisplayedScrollingRowIndex = rN;//最上部の行に現在入力している行を表示する設定だが効いてないdgv1.Rows.Add(data);//行を追加してdata配列を入力dgv1.Rows[rN].HeaderCell.Value = rN.ToString();//行ヘッダーにその行の番号入力 //================================================================= |
●以後
その3でCSV機能とその4で行編集機能をつけます。