【C#】Visual Studio2022いじる<シリアル通信サンプルを動かす>

※VS初心者がシリアル受信Pgmを作ろうとして悪戦苦闘している記事です。
※.NET6.0環境では、シリアル受信モジュールがデフォルトでは含まれなくなってしまいました。
対策1:NET6.0に外部からシリアルモジュールをインストールする。方法はこちら

対策2:NET.6.0でなくFramework4.xxでプロジェクトを作れば含まれてます。

※2023年11月 Pythonでシリアル受信するプログラム作りました。IMUの動作を機械学習させる実験用です。
PythonよりVB,C#は、基本的に重要です。Pythonは、Excelみたいに手軽に大規模統計計算ができるメリットがありますが。
一般的なデスクトッププログラムには、速度遅いし、フォームアプリが作りにくいので、VB,C#を優先して学習したほうがいいです。
【Python学習】BTシリアル受信してCSVファイル保存<Pythonのメリットデメリット>

※2023年8月21日音声読み上げをいじり始めました。【C#】 Text To SpeechサンプルPgmで音声読み上げ動作できた<VisualStudio2019に戻す>
※2023年7月シリアル送受信プログラム【STA23】C#BlueToothシリアルでRTKログ操作Pgm作った<マルチスレッドで小技有>
※2023年4月動くグラフシリーズ最新 【STA23】C#動くグラフ SkiTracer rev07動画部分<プロット方法備忘録>
※2023/4/10 chatGPTを使って、C#のプログラムを生成してみました。使えます。もう検索しまくる学習方法でなく、chatしながら、学習する時代に突入しました。従来のgoogle検索の100倍も効率いいです。
【VS2022】シリアル受信中に送信する方法<chatGPTに教えてもらった>
【VS2022】chatGPTでC#Serial受信サンプルプログラム作る<Google検索は古い>※2023/4/9追記:マルチスレッドのプログラム作れなくても、シングルスレッドのアプリを作って、複数個立ち上げて処理すればマルチタスクになります。BlueToothSPP 2CHを同時受信モニタする単純なプログラム
STA23】Win10でアプリ2個立ち上げてマルチスレッド代替<スマホ操作>
●意味の分からない命令の解説LINK(いつまでたっても、頭に入ってないまま使ってます)
Delegateとは、未確認飛行様の解説記事が分かり易いです。MS解説は、いまいち
Invokeとは、未確認飛行様の解説、Delgateの呼び出しに使うそうです。
Delegate再入門も分かり易いです。感謝。
MSの基本解説がどうも理解できないです。SerialDtaReceivedイベント
イベントの処理と発生を見ろとたらい回しにされて分らなくなってしまいます。

こちらさまの解説が一番理解しやすいかも、感謝です
②VisualStudioでシリアルを受信しよう☆【Arduino / Visual Studio】

※2022/7/14@mag様のサンプルをDataGridViewへ記録するようにしました。
Excelに即コピペできます。シリアル受信したデータはExcelコンパチの表で扱ったほうが後が楽です。
※2022/7/29 マイコンと接続時に、通常マイコンでprintln()をすると/r/nなので、C#では、readLineデフォルトは¥nなので正確には
serialPort1.NewLine = “¥r¥n”;  //WIndowsでは、¥が改行マーク
string str = serialPort1.ReadLine();
改行マークが、arduinoとVBとC#が異なるので、注意です。参照させたいただいたサイト様https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/999envnewline/envnewline.html

【C#】VisualStudio2022いじる その2<DataGridViewで表示>
=>2020年代は、C++でなくC#を使うのが当たり前になってきたので、C#に乗り換え中です。サンプルPgmがC#ばかりですので、
本記事も、C#へ模様替え中で、C#のシリアル通信入門LINKのご紹介をさせていただいてます。
●C#シリアルプログラム解説してあるリンク
①QIITAの@mag2さまの投稿記事シンプルでわかりやすいです。感謝です。
https://qiita.com/mag2/items/d15bc3c9d66ce0c8f6b1

②本家MS HPでのSerialPort.DataReceived イベントを使ったプログラム例
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.datareceived?view=dotnet-plat-ext-3.1

③渥美様という方が丁寧に書かれてます。感謝です。
https://www.atsumitakeshi.com/csharp_arduino1.html

④Tomoソフトというプロの方の解説記事 わかりやすいです。感謝です。
https://tomosoft.jp/design/?p=11200

●すぐ動くC#のシリアルサンプルQIITAの@mag2さまの投稿記事のリンクがあります。GITHUBからソリューションZIPをダウンロードして、https://github.com/mag02243/SerialTest 
=>SerialTest.slnファイルをダブルクリックすれば、VSが起動して、バージョンを更新するか聞かれますので、新しいバージョンに更新OK=>フォームプログラムが立ち上がるので、緑三角マークを開始を押せばコンパイルして立ち上がるので、マイコンから115200bpsでASCIIデータをいれれば、TextBoxにASCIIデータがでてきます。
=>C#は、VBと違って、構成ファイルの数が一桁多いのでメインで使うファイルがどこか探すのが大変です。
ソリューションエクスプローラ>Form1.cs>Form1Designer.cs>Form1>Form1()にプログラム(Form1.csのコード)があります。
このサンプルでは、private void Response(string text)下に、TextBox1にデータ書き込んでますが
表示部分を追加していけば改造できます。例えば、RichTextBoxにすれば、スクロールバーがつくので、便利に
なりますす、splitを使ってデータをばらしてから、DataGridViewに書き込めばEXCEL風の表ができます。

 

■C++のサンプルは、十数年前のサンプルです。{WEBでさがして、Visual Studio2008版のシリアル通信サンプルがありました。現在、動作するかどうかわかりません。作者はソフトウエアのプロAltemaSoftのHaseko様が皆さまのためにgithubにアップしていただきました。
[https://github.com/hasekou/SerialCommVS/]
これは、ソリューションファイルからまるごとサンプルzipとなっていて、Visual Studio2015でソリューションファイルだけ読み込んで、VS内で自動でバージョンの違いを修正してくれて、WARNINGだらけになりますが、とりあえず、ビルドが通って、実行すれば、
WINDOWS FORM画面が現れて、シリアルのポートNoとボーレートを設定しすれば、mbedからのデータを表示してくれました。}

やり方 VisualStudio2015は、入手が大変なので2017でもできるかやってみました。

Aコース:【VSを使ったことがある方は、下記を飛ばして、ここをクリックして進んでください】

Bコース:【VisualBasic.NETを使ってシリアル通信プログラムを使いたい方は、こちらのページ】

フォーム作ってコピペして5分でシリアル接続Pgmできました。

この動画解説を詳細解説して、基本プログラムがつくれるまで解説してあります。

【VS2019】初めてVisualBasicで1時間でシリアル受信Pgmできた<CONTEC社様へ感謝>

 

VB.NETの学習が進んで4CHのシリアルポート同時受信機能も追加しました

【VB.NET】USB_Serial_5ポート同時受信実験<4ポートまでOK>

Cコース:【私と同じくVSが使えないがマイコンとPCでシリアル通信を急いでしたい方】
この下の記事から順にご覧ください
●急いでいるならCPLTとEXCELでの処理が一番早いです。

【パワーメーター】リアルタイムグラフで優れモノソフトあった<CPLT>

 

 

Dコース:RS232Cとかシリアル通信の基礎を調べたい方は、こちらへジャンプ

 

Eコース:VS脱落者の私が使っている方式です。Processingでシリアル受信してデータ処理を行います。
メリットは、WINDOWSで作ったプログラムをちょい変更してAndroidスマホでも動作させることができます。
ArduinoIDEに似たProcessingのIDEと書き方なので、Arduinoに慣れた方が愛用されてます。
2020年からは、有線シリアル通信でなく無線でのデータ送信のほうが楽なので、無線化をはかってます。
5G時代が到来してくるので、有線シリアル通信から無線に引っ越す時代になってきてます。
●やり方は、

STEP1:マイコンからのデータをUSBシリアルで受信して、データ処理するProcessingプログラムを作ってデバッグ
STEP2:マイコンとPC側Processingのプログラムのデバッグがおちついたら、スマホ用にProcessingプログラムを変更
STEP3:USBシリアル受信部分をAndroidスマホではBluetooth SPPに置き換える(数行で変更できる)
STEP4:マイコン側もBlueToothSPPモジュールをつけて、スマホへ送信する、これはシリアルピンをUSBからBlueToothモジュールへつけかえるだけ。スマホのBT発信は、スマホのBlueTermで受信チェックできる。
STEP5:スマホでマイコンからBlueTooth受信できているかデバッグ(115200bps以下が無難です)
●最近の事例1:2時間でシリアル受信してリアルタイムグラフを描くプログラムサンプル作れました。
基本的な作り方解説してあります。Arduino風なので、Arduinoユーザーは入りやすいです。

【PowerMeter2020】ProcessingでリアルタイムグラフサンプルPgm<2時間で出来た>


●最近の事例2:RTKcm級GNSSを遊んでます。UbloxF9PのMobingBaseモードからの3次元測位データをスマホでモニタするシステムなど、スマホだとPCにはない楽しいアプリが作れます。Processingは超便利です。
本ブログの検索でProcessing Processing Android modeと検索すれば作例たくさんでてきます。
私がお世話になったProcessingの師匠は、MSLABO様です。こちらのブログです

【L-RTK】スマホRTK Monitor試運転動画<MovingBaseの座標が見える>

 

 

※私のプログラム能力は、arduino,mbedのCプログラムを作る程度、ライブラリーは作れません、PC言語だとProcessingとVBA程度ですが、C++をVS2017で使うことについて、記事があるのですが、あまりお勧めではないようです。
https://qiita.com/tadnakam/items/be20c836a122f7fa1b69

ですので、素人が手をだすものではないのかもしれませんので、VB.NETなどもっと
素人が手をだせる言語で、シリアル通信を高速に使える方法を絶えず探してます。

■本記事の読者様の中でVSでC++を使う必然性が無い方へ
私は、VS脱落者なので、マイコンとのシリアル通信は、3つの手段で行っています。

①アプリCPLTを使って迅速にデータを確認。

【パワーメーター】リアルタイムグラフで優れモノソフトあった<CPLT>

 

②VBAでシリアル受信する、EXCELなのでデータ処理がいろいろできるが、受信速度が115200bpsでは無理。=>VB.NETで作れば高速なので検討してます。
CONTEC社様のブログでVB.NETでシリアル通信プログラムを丁寧解説されてますので

https://www.contec.com/jp/support/basic-knowledge/daq-control/serial-communicatin/application/

これを見ながら、フォームアプリ作ったら1時間で完成しました。その記事です。VS2017でもVS2019でも出来ました。ZIPでソリューションファイル添付しました。VS環境済みの方はこのソリューションで動作できるはずですが、だめだったら、下記作成記事をみて修正してください。
Serial_WindowsApp1

https://shinshu-makers.net/shinshu_makers/2019/07/29/%e3%80%90vs2019%e3%80%91vb6%e3%81%a7%ef%bc%91%e6%99%82%e9%96%93%e3%81%a7%e3%82%b7%e3%83%aa%e3%82%a2%e3%83%ab%e5%8f%97%e4%bf%a1pgm%e3%81%a7%e3%81%8d%e3%81%9f%ef%bc%9ccontec%e7%a4%be%e6%a7%98%e3%81%b8/

※VBの使い方を丁寧に解説しているHPはあるにはあるのですが、VBAほど多くないので、わからなくなったら立ち止まってしまいます。その辺がVBAよりマイナーなVB.NETの課題だと思います。
金沢ソフト様:https://kana-soft.com/tech/sample_0008.htm

NonSoft様:http://nonsoft.la.coocan.jp/SoftSample/CS.NET/SampleRs232c.html

あるプログラマー様のHP

③Processingでシリアル通信プログラム使うと460800bps程度の高速シリアル通信が超簡単に実現できます。Processingをインストールして短いサンプルプログラムで走らせるまで2時間もあればOKです。VBAとかC++をやったことがあれば、プログラムは読めます。関心のある方はこちらのProcessingでシリアルの記事へどうぞ。
※JAVAをそのまま使って簡単に扱えるようにしているのでVB.NETより解説HPが多いです。
特に海外ユーザーで研究者が多いので、解説が丁寧で助かります。

【シリアル通信】Processingで460800bps通信できた<超簡単>

※追記2019年11月のテーマ
回転体の3か所から無線で送信されてくる7msec周期の10CHデータの各位相をμsec単位で管理して計測する作業をしてます。」
膨大な準備作業があるので、VB .NETを学習している暇があったら、慣れているProcessingでプログラムを作ったほうが10倍速いので
最近はProcessingにしてます。USBシリアル4ポートからの大量のCHデータを時系列でRapi3 B+で受信してます。Processingの凄さは、PCで動作チェックしたプログラムをそのままRaspiにコピペしてRaspi用のProcessingでそのまま動作可能な点です。計測用途では、PCで計測システム全体のプログラムをまず作成して机上で各マイコンボードと無線通信のテストを行います。無線通信は、エラーが多いので、FLOW制御が必須です。デバッグが終えたらフィールドで計測の本番を行いますが、フィールドでは、小型で単純に動いてくれるRasPIをPC代わりにロガーとして4ポートのUSBシリアルからのデータを同時受信してまとめてCSVファイルでログさせます。
各マイコンのクロックが違うので、高精度水晶発振器TCXOで1ppm以下の時間精度でマイコンから正確な周期で測定データを無線送信してます。
こうしないと数十分も連続測定すると回転体の周期がずれてしまってデータ間で計算処理ができなくなって実験にならなかったので、マイコンボードを何度も改良してきました。マイコン内でデータをまとめると処理能力が小さいためデータ落ちが発生してダメなので、RASPI3 B+程度のCPU速度がないとUSBシリアルのマルチポート受信ができないというのが結論です。
このようなタフな計測でも、Processingは、PCとRAPIで動作してくれます。さらに、モバイルならandroidでも同様に移植性が抜群です。
VisualStudioの縛り
に拘わらないで、仕事、テーマを完成させたい場合
Processingは、JAVAの一つのソリューションとして研究開発では
大きなTOOLとなると確信してます。

———————————————————————————————-

■シリアルインターフェースってなんだと思ったら
昔からRS232Cって有名ですが、最近は、あまり使われませんが、計測器などはまだRS232C規格のIFで接続されるので、RS232Cが残ってますが、RS232CとマイコンのUARTシリアル通信は、電圧レベルが全く異なります。RS232C規格
RS232Cと接続するものの規格  USB  マイコンArduino  マイコンmbedと違う

 

 

RS232C USB5V TTL,LVTTL  mbed3.3v系 arduino5V系
受信0レベル +3V~+13V(0電位高い)  0.8V以下  0.8V以下
受信1レベル -3V~-13V(1電位低い)  2V以上  2V以上
送信0レベル +5V~+15V(0電位高い)  0.8V以下  0.8V以下
送信1レベル -5V~-15V (1電位低い)  2V以上  2V以上


USBシリアル変換ケーブルではRS232CとUSBの電圧レベル変換をした上に、プロトコルもUSBフォーマットに変換して、USBホストであるPCと通信してます。USBホスト変換が結構ボリュームがあるので、変換ケーブルの使用ICチップ(FTxxとかPL23xx)にあわせたドライバをPCへインストールしないと通信できないという手間が介在してます。

シリアル通信で、マイコンーマイコン間、センサーマイコン間は、レベル変換は不必要ですが、
RS232CーPCではPCにシリアルポートがついていればいいですが、現在はシリアルポートは希少品なので
PCとのシリアル通信は、USBシリアル変換ケーブルを使ってRS232C機器とかマイコンと接続してます。

※ここで注意しないとけないのは、マイコンとRS232C機器を接続してシリアル通信をする場合は、
レベル変換ICを介して接続しないと電圧レベルが全く違うので接続できない点が基本です。
レベル変換ICは、アナログデバイスのADM3202が有名です。秋月で変換ボード売ってます。
 http://akizukidenshi.com/catalog/g/gK-06464/

 

 

東芝に判り易い解説がありました。

https://toshiba.semicon-storage.com/jp/design-support/e-learning/mcupark/village/serial-interface-2.html

■シリアル通信って簡単だといわれていますが、いざ接続すると
通信できなかったりデータが化けたり初心者にとっては難解なIFだと感じてます。IFモノは初心者には扱いにくいです。ですので、基本を学習してからプログラムをいじったほうが将来的には良いと感じてます。
※大事なのはシリアル通信って非同期通信だということです。VisualStudioの学習よりシリアル通信の原理の学習が重要だとおもいます。こちらのブログ様の説明が分かり易かったです。
http://www5b.biglobe.ne.jp/~kouta_y/news/newsvb/vb14.html
以前からVisual Studio2015でkinektをいじっていたのですが、初心者用の教科書も買って用意してあったのですが、教科書通りにやったつもりでもエラー続出でちっとも進捗しませんでした。
そうこうしてるうちに、Visual Studio2017に移行してしまいました。VSに限らず、PCマイコンプログラム業界は、次々とバージョンアップして改良改善してくるので、使い方チュートリアル記事が役にたたなくなってしまうことが多々あって、初心者は、困惑してしまいます。いたちごっこを何とかこなす手として
本記事のやり方もありかと思います。

=>接続トラブルに遭遇した場合
<IFモノは原因箇所が多数あるので大変手間がかかります。慌てずに余裕をもって対策>
私の経験1:PCのDriverがおかしくなった=>再起動、再インストール
私の経験2:マイコンプログラムのシリアル設定とPCがあってない=>ボーレート,PORT番号
私の経験3:マイコンプログラムが動かない=>サンプルプログラムで動作確認する
私の経験4:USBシリアルケーブルの接触不良=>予備ケーブルでテスト
私の経験5:マイコンピンがクロス接続になってない=>通信はクロスが原則
私の経験6:どうしようもないときはオシロで信号をみる=>TXとRXをみて動いているかみる

●学習方針変更
手間と時間がもったいないので、mbed式(Rapid Prototyping)というべき方法で習うより慣れろということで方針を変更しました。
①目的の機能を持ったサンプルプログラムをWEB上で検索
②Visual Studioで使うときのことも説明してあるものに絞ってダウンロード Solutionファイルごとダウンロードできるものがあればラッキーです。
③見つかればダウンロードしてビルドしてOKならソースを見ながら自分の仕様に変更するだけです。

ということで今回も運よくプログラム発見しました。

Visual C++ 2008 を用いたシリアル通信サンプル
//================================
=>2019年7月29日記
HDDが故障して、新たにVS2017をインストールしたら、2年前のようにビルドが通らなくなりました。現在再現できるように詳細調査してますので、エラーが発生した場合は、こちらを参考にして、検討をお願いいたします。下記MS DOCの記事を読んで再現検討してます。

●サンプルプログラムがVS2008なので古いプロジェクトの使い方を調べてます。

「Visual Studio でネイティブ マルチターゲットを利用し、古いプロジェクトを作成する」(2016/11/4 MS DOC)

●プラットフォームのツールのバージョンが違うというエラーがでてますので、下記を見てます。

「方法: ターゲットフレームワークおよびプラットフォームのツールセットを変更する」(2019/7/24 MS DOC)

//================================

作者AltemaSoftのHasekou様からリンク先変更のご連絡をいただきました。githubに設置していただけたようです。皆さんダウンロードして活用していただければ幸いです。

https://github.com/hasekou/SerialCommVS/

 

古いのですが、ソリューションファイルごとプロジェクト全部提供してくれてあるので
ダウンロードして読み込むだけで、面倒なプロジェクトの設定を自分でしなくて済みます。Visual系は、プログラミング以前に設定作業が大変でそれを学習するだけ時間と手間がかかってしまっていけません。
では、手順をご説明します。
①VisualStudio2017を起動してファイルー開くープロジェクト/ソリューションで
ダウンロードして解凍したフォルダを開いてソリューションファイル 「SerialCommSample.sln」を開く。

②するとバージョンをアップする自動処理がはいります。OKすると

WEBで処理するみたいでブラウザーに変換結果 移行レポートが表示されます。
エラーがないので良しとして次に進みます

③プログラムをビルドする
VS2017のツールバー真ん中下部にある ローカルWindowsデバッガーボタンを押すと
コンパイル、リンク、ビルドが走り始めます。

④ビルドが終わるとプログラムが走り出します。SerialCommSampleのフォームが現れて切断中となってますので、接続ボタンをおすとシリアルポート設定フォームが現れます、mbedと接続しているCOMポート番号とボーレートをいれてOKします。

⑤mbedからのデータが表示されます。

●自分の目的にあった変更を加える
シリアル受信のプログラムは、form1.hにあります。
送受信formオブジェクトのコードとして記述されてました。

270行めからのSerialDataRecieved()を書き換えれば所望のデータがえられると思います。

private: System::Void serialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
SerialDataRecievedDelegate^ dlgte = gcnew SerialDataRecievedDelegate( this, &SerialCommSample::Form1::SerialDataRecieved );
String^ RecievedData = serialPort->ReadExisting();

//1バイトずつ受信することを前提
if(serialPort->IsOpen == true) { //シリアルポートが開いていることを確認してから。

COMRevieveBuffer = COMRevieveBuffer + RecievedData; //受信バッファに追加
//改行コードを検出する
if(RecievedData == “”\r”” ) {
RecievedData = RecievedData + “”\n””;
COMRevieveBuffer = COMRevieveBuffer + RecievedData;

//受信した一行をテキストボックスに転送する。テキストボックスの操作は別スレッドの関数にする。
this->Invoke(dlgte, COMRevieveBuffer);

COMRevieveBuffer = “”””;
}
if(RecievedData == “”\n”” ) {
RecievedData = RecievedData + “”\n””;
COMRevieveBuffer = COMRevieveBuffer + RecievedData;

//受信した一行をテキストボックスに転送する。テキストボックスの操作は別スレッドの関数にする。
this->Invoke(dlgte, COMRevieveBuffer);
COMRevieveBuffer = “”””;
}
//エコーを返す
serialPort->Write(RecievedData);

●デバッガー
mbedにはないデバッガーがついてますので、ブレークポイントで止めてシリアル受信データとバッファの内容を確認しながらデバッグしながらプログラムできますので、初めてでも試行錯誤で完成させられるのではないかと感じました。
デバッグーブレークポイント設定/解除で止めたい行の左横で赤い●をつけて
F5で1周まわって、F11で1行ステップで進みます。止まっているときに
変数にカーソルをあてれば中身が見えます、

デバッガーの解説は下記リンクなどたくさんあります。

http://qiita.com/hart_edsf/items/85cacfa28a7e97fdb2be

●以後
できるだけ早くVC++で高速で安定したモニタープログラムを作って
パワーメーターと6分力計、スキー活動量計の開発ツールとして役立てたいです。

●追伸(2018年1月20日)
シリアル通信は、非同期通信と言われてますが、他の同期通信と
どう違うのかを知っておくことが重要です。

●【2018年を迎えて(2018年1月9日 記)】
本記事にご来訪の大勢の皆様、本年も宜しくお願いいたします。VisualStudio2017は、ご無沙汰してしまってます。
なぜかというともっと、簡単にRP(RapidPrototyping)できることが分かったからです。このAI時代にバージョンアップごとに使い勝手が変わって無駄な時間を消費するという作業は、AI化とともに消えていくと期待してます。ですので、苦労してVSを覚えるよりも楽して目標に早く到達する開発を心がけてます。
①シリアル通信を受信してグラフにするなら
CPLTというソフトを使えば高速で8CHまでグラフが思い通りに描けます。EXCELよりはるかに高速です。
http://www.datatecno.co.jp/cplt/cplt-download.htm

●【2019年6月を迎えて】2019年6月25日記
CPLTは常用してますが、横軸が時間軸でないので、時間をみたいときは、不便です。速い現象は、やはりマイコン上ですべて処理して、結果をログしてそのログデータをPCへ転送する方法しかありません。マイコンのロガーだとarduinoでも16MHzクロックで専用に回せば、2CHで50Kサンプル(20μsec)まで測定できます。
九州工業大学でarduinoでオシロを作った記事が有名です。
https://www.iizuka.kyutech.ac.jp/faculty/physicalcomputing/pc_kitscope#i-4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です