質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • Python 3.x

    4118questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    614questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

ラズベリーパイ3でpython3シリアル通信を自動起動させるとエラーになる

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 347

GOYOSHI

score 9

いつもお世話になります。よろしくお願いいたします。
奇妙な症状が出て、苦慮しています。

設備シーケンサーとRS-232C経由でラズベリーパイ3と接続してデータを取得し、データベースへ登録するプログラムをPythonで書き、動かし始めました。
プログラム自体は問題なく動作していますので次のステップとしてラズパイが再起動したときに、かのプログラムを自動起動させるように設定しようとしていますがそこでエラー(read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?))が発生します。

ラズパイの設定から説明いたします。(GPIOピンの8番と10番を使います)
(1). ブルートゥースを無効化
/boot/condif.txt
にdtoverlay=pi3-miniuart-btを追加する

(2).以下のファイルを修正する
/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

(3).コンソールのシリアル通信を無効にする
sudo raspi-configを実行
5 Interfacing Optionsを選択する
P6 Serialを選択
『Would you like a login shell to be accessible over serial?』に『いいえ』を選択
『Would you like the serial port hardware to be enabled?』に『はい』を選択

(4).サービス停止
$ sudo systemctl stop serial-getty@ttyAMA0.service
$ sudo systemctl disable serial-getty@ttyAMA0.service

(5).getdataserial.pyというプログラムを作成し、問題なく動作することを確認

(6).デスクトップにgetdata.shというファイルを作成し、実行権を付与
内容は以下の通り

#!/bin/bash
sudo python3 /home/pi/PyPrg/getdataserial.py


これでgetdata.shをダブルクリックし、『端末で実行』をクリックするとPythonのプログラムは問題なく動きます。
次に自動起動の設定ですが/home/pi/にユーザー権限でautostartというフォルダーを作成、autostartフォルダーにルート権限でgetdata.desktopというファイルを作成しました。ファイルの内容は以下の通りです。

[Desktop Entry]
Name=getdataserial
Exec=lxterminal -e "/home/pi/Desktop/getdata.sh"
Type=Application


これでラズパイを再起動するとターミナルが開き、プログラムは動作するのですがread failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)というエラーが発生します。getdataserial.pyはエラーが起きてもループするようにしてあって、ターミナルを見ているとたまにまとものなデータを返す時もありますがほとんどはread failed:以下のエラーを返します。
しょうがないので.config/autostart内のdesktopファイルを削除して再起動し、デスクトップのgetdata.shを実行すると問題なく動作します。
デバイス関係のファイルなどの読込タイミングが影響しているのでしょうか、困っています。
ちなみにDHT11という温湿度センサーを使ったPythonプログラムを同じような設定で自動起動させるとこちらは問題なく動きました。
自動起動につきましてはhttp://hendigi.karaage.xyz/2016/11/auto-boot/を参考にさせていただき、とりあえず/etc/init.dを除く全部を試してみて唯一動いた(表示された)今回の方法を選択した次第です。
ヒントなど頂けましたら助かります。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

雑音の影響は考えられないでしょうか?

rapsberryのシリアル通信の速度は115.2Kbps(毎秒11万5200ビット)という高速(1ビットが8.6マイクロ秒)なので、高周波パルスのような雑音がRS^232Cの信号線に混ざると通信エラーが起きます。

シリアル通信の信号は、通信が行われていない間はずっと1(高電圧)です。通信の最初に1ビット分(8.6μs)0(低電圧)になること(スタートビット)でデータ転送が始まり、続いて8ビット分のデータが送られ、最後に1~2ビット分1になって(ストップビット)、1バイトのデータの伝送が終わります。複数バイトの場合には、スタートビットからストップビットまでの信号が繰り返されます。
シリアル通信 -第1回:シリアル通信とはに、信号の説明図があります。

RS-232Cの信号線に乗ったパルス状のノイズがスタートビットと解釈された場合、とりあえず「何かデータが来ました」という状態にはなりますが、正しいタイミングでストップビットが現れない等のエラー(パリティエラー、フレーミングエラー等)で受信できたデータが無いという事が起こります。

”たまにまともなデータを返す”という症状からも、プログラムのエラーよりもノイズの影響のほうが原因である可能性が高いように思われます。

設備シーケンサを使われているという現場では、電力消費の大きな機器が稼働するために電源ラインにノイズが乗ったり、周囲に電磁的ノイズを発散する可能性も高いかとも思われます。

=確認すべき点=
ラズパイのシリアル通信の受信信号を観測してください。電圧レベルが安定しない、ノイズが乗っているといった事はないでしょうか? 
長いRS-232-Cのケーブルが使われていないでしょうか?RS-232-Cのケーブルは、シールド付きツイストペア(送信信号の電線と受信信号の電線のより線の外側にシールド編線)程度のノイズに強くないものが多いです。 
設備シーケンサ、制御される設備、ラズパイの接地は、ちゃんととられているでしょうか?

また、UART番外編の記事も参考にしてください。

=改善方法=
もしもノイズが原因だとすると、RS-232-Cをもっとノイズに強いRS-422(送信、受信に差動信号線を使う方式)に変えるといった物理的対策が有効だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/09 08:59

    ご回答ありがとうございます。また、詳細な解説等もありがとうございます。このあたりの知識は乏しく、大変助かりました。
    ただ、pythonプログラムをIDLEで呼び出し、pythonシェルで実行しても、また、それを.shファイルで呼び出すようにして長時間動かしてもエラーは全くでないのでノイズは考えていませんでした。もしノイズであればどのような呼び出し方でも発生すると思うのです。
    更に別なプログラムでGPIOピンにLEDを接続して点灯するプログラムで以下のように初期化していますが
    # ピンヘッダー接続設定
    LEDG = 23 # パワーLED(橙)
    LEDB = 24 # オーケーLED(緑)
    LEDR = 25 # エラーLED(赤)
    BZZP = 22 # ブザーピン
    # GPIOのピンアサインモードをBCMに設定
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LEDG, GPIO.OUT)
    GPIO.output(LEDG, GPIO.LOW)
    GPIO.setup(LEDB, GPIO.OUT)
    GPIO.output(LEDB, GPIO.LOW)
    GPIO.setup(LEDR, GPIO.OUT)
    GPIO.output(LEDR, GPIO.LOW)
    GPIO.setup(BZZP, GPIO.OUT)
    これをターミナルで自動実行するようにし、再起動して呼び出すとGPIO.OUTの行でalready in useという警告を発します。pythonシェルや.shにしたものを再起動後に動かしても出ません。
    なので.desktopファイルが.config/autostartで実行されるときというのはデバイス系の設定が終わっていない状態なのではないかと思われるのです。
    https://qiita.com/Fendo181/items/469469d143d3568fc692を参考にしたDHT11という温湿度センサーが問題なく動いたのはdht11.pyを実行時に読み出すからなのではと思います。
    そうするとラズパイが完全に起動後に自動実行する方法が必要なのかなと考えているわけですが何かご存知ではありませんか?よろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4118questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    614questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。