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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Raspberry Pi

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

Q&A

解決済

2回答

8330閲覧

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

GOYOSHI

総合スコア18

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2017/11/08 05:53

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

設備シーケンサーと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を除く全部を試してみて唯一動いた(表示された)今回の方法を選択した次第です。
ヒントなど頂けましたら助かります。よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

接続方法をRS-232C-USBケーブルに変更して対応いたしました。
自動起動も問題なく対応しています。使った機種は以下のものです。
https://www.amazon.co.jp/gp/product/B007SI18VW/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1
ありがとうございました。

投稿2019/07/19 00:32

GOYOSHI

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/08 07:36

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOYOSHI

2017/11/08 23: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を実行時に読み出すからなのではと思います。 そうするとラズパイが完全に起動後に自動実行する方法が必要なのかなと考えているわけですが何かご存知ではありませんか?よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問