【3月27日】Visual Studio2017いじる<シリアル通信サンプルを動かす>

Visual Studio2017にバージョンアップされてますが、WEBや教科書類が2015が多いので2015を使ってます。入門書買ってやり始めているのですが、エラーがでまくっていてばかばかしくなってきたので、mbed式学習に切り替えてます。
mbed式とは、目的に近いサンプルプログラムをWEBから落としてきて実行させて、動作したら、そのソースを自分の目的に合わせてちょい変更して、作ってしまうというやり方です。

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を使ってシリアル通信プログラムを使いたい方は、こちらのページ】

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

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

 

※私のプログラム能力は、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

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

※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

コメントを残す

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