フォト
2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  
無料ブログはココログ

« Arduinoで美咲フォントを使った8x8ドットマトリクスLED(3) | トップページ | 日本語フォントROM GT20L16J1Y Breakoutを試してみました »

2014年3月 2日 (日)

arduinoがシリアル通信時にリセットされる原因が分かりました

ここ数日、Arduinoとパソコン間でシリアル通信を行う際に
   1)初期通信が不安定
  2)Arduinoにリセットがかかる
の件で悩んでいました。

これが解決できないと、arduinoを連続稼働したままでパソコンとのシリアル通信が
出来ないし、通信でエラーが発生します。

パソコン側はLinux (CentOS)で通信ソフトを作成していたのですが、
操作性の良いWindows環境に作り変えることにし、その際Arduinoの仕様を
見直したところ、本家arduino.ccのホームページのArduino UNOの仕様において
に「Automatic (Software) Reset」なる記事を見つけました。
(ヒントはeggshell blueさんHP「DTR と Arduino の関係」から頂きました:感謝!)

結論及び仕様の要点をいうと
Arduino UNOにおいてUSB経由でシリアル通信する際、DTR端子の状態がLOWの
場合はリセットがかかり、HIGHの場合はリセットがかからないです。

この仕様はArduino IDEからのソフトウェア書き込み&再起動のための仕様でです。

今回、パソコン側の通信ソフトをVisual Basic 2013で作り直しました。
シリアル通信はSerialPortというモジュールを使いました。
このモジュールのプロパティにDtrEnableという項目があり、DTRの利用の指定ができます。

DtrEnableをFlaseに設定することで、USB経由でのシリアル通信開始時に
リセットが発生せず、安定した通信ができました。

これでarduinoとのシリアル通信は自分が意図するイメージで行えるようになりました。
Arduino接続の外部EEPROMの書き込みソフトが完成しました。

Visual Basic 2013で作成したアプリはこんな感じです。
データファイルを指定して任意のアドレスにデータを書き込みます。

03

データが正しく書き込めたかのチェックは2バイトのチェックサムを比較しています。
書込みはスレッドにてバックグラウンドで行い、進捗表示、中断ができます。

スレットからUI関連のAPIを使うとエラーとなることにちょっとハマりましたが、
こんな感じで
                Me.BeginInvoke( _
                Sub()
                    Lbl_status.Text = "状況: 通信中 [" & cnt & "/" & data.Length & "]"
                    Lbl_status.Update()
                End Sub)

Invokeを使うことで解決できました。

VBのソース ダウンロード EEPROMWrite.zip (178.0K)

arduino側はシリアル通信においてはスレーブ動作でパソコンから受信したコマンド
に応じて処理を行います。TeraTerm等で対話的にデータの参照もできます。
arduino UNO用のソース  ダウンロード download.zip (3.1K)


arduinoにTeraTermで接続し"i"と入力するとI2Cバス接続デバイスのアドレスを表示
04

"p10000,100FFF"と入力してEEPROMの指定範囲のデータを表示
05

Visual Basicでのプログラミングは久しぶりですが、シリアル通信のSerialPort
は使いやすくで良いです。以後ツールはVisual Basicで作成します。
開発環境も無料ですし。作成も1日程度でできました。



« Arduinoで美咲フォントを使った8x8ドットマトリクスLED(3) | トップページ | 日本語フォントROM GT20L16J1Y Breakoutを試してみました »

arduino」カテゴリの記事

AVR」カテゴリの記事

コメント

同じ内容で1日悩んでました。DTRをHIGHにするということで。ありがとう👍

> 同じ内容で1日悩んでました。DTRをHIGHにするということで。ありがとう👍

ご連絡ありがとうございます。お役に立てて、光栄です

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: arduinoがシリアル通信時にリセットされる原因が分かりました:

« Arduinoで美咲フォントを使った8x8ドットマトリクスLED(3) | トップページ | 日本語フォントROM GT20L16J1Y Breakoutを試してみました »