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

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

ただいまの
回答率

90.86%

  • Python 3.x

    4805questions

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

  • Raspberry Pi

    666questions

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

ラズベリーパイ3でttyUSBが切れる?

受付中

回答 1

投稿

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

GOYOSHI

score 9

いつもお世話になります。
設備シーケンサーがRS-232C経由で吐き出すデータをラズベリーパイ3で受け取り、ファイルに書き込む処理を作成しています。
当方の環境はラズベリーパイ3 MODEL B、2017-09-07-raspbian-stretch、python3.5.3となります。
シーケンサーとラズパイはエレコムのUC-SGTと言うUSB・RS232変換ケーブルで接続していて、ケーブルのUSB側をラズパイのUSBに挿しています。UC-SGTはラズパイでは自動的に認識されました。
python3で利用するために/etc/udev/rules.d/99-local.rulesに必要事項を記入して固定して使えるようにしています。
これで連続してシーケンサーからのデータを受信できていますが、ごくまれに以下のような例外エラーが発生いたします。

read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
[Errno 2] could not open port /dev/ttyUSB_UC-SGT: [Errno 2] No such file or directory: '/dev/ttyUSB_UC-SGT'


処理プログラムは以下のようになります。

import sys
import serial
import time
import re
import datetime as dt

def setfilenm(pNow):
    rFnm = ''   #変数初期化
    #日付の替わる時間
    dHh = dt.datetime.strptime(str(pNow.year) + '-' + str(pNow.month) + '-' + str(pNow.day) + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
    #開始日時
    dSt = dt.datetime.strptime(str(pNow.year) + '-' + str(pNow.month) + '-' + str(pNow.day) + ' 08:00:00', '%Y-%m-%d %H:%M:%S')
    #終了日時
    dEd = dt.datetime.strptime(str(pNow.year) + '-' + str(pNow.month) + '-' + str(pNow.day) + ' 21:00:00', '%Y-%m-%d %H:%M:%S')
    #日付の変更時から朝8時までは前日の夜勤となる
    if pNow >= dHh and pNow < dSt:
        #取得日時より1日減算
        pNow = pNow - dt.timedelta(days=1)
        rFnm = str(pNow.year) + '-' + str(pNow.month).zfill(2) + '-' + str(pNow.day).zfill(2) + '-Y.CSV'
    else:
        # 当日の日勤範囲内であれば日勤となる
        if pNow >= dSt and pNow < dEd:
            rFnm = str(pNow.year) + '-' + str(pNow.month).zfill(2) + '-' + str(pNow.day).zfill(2) + '-D.CSV'
        else:
            #そうでなければ夜勤となる
            rFnm = str(pNow.year) + '-' + str(pNow.month).zfill(2) + '-' + str(pNow.day).zfill(2) + '-Y.CSV'

    return rFnm

def recdata(rFn, rDt):
    # データをファイルに書き込む(追記モード)
    fs = open(rFn, 'a')
    fs.write(rDt + '\n')
    fs.flush()
    fs.close()

def main():
    try:
        # デバイスIDは固定しておくこと
        ser = serial.Serial('/dev/ttyUSB_UC-SGT', 9600, timeout=3)
        time.sleep(2)
        #print(ser.portstr)

        while 1:
            # 通信データバッファクリア
            rStr = ''
            # シリアル通信でデータを受信
            rStr = ser.readline()
            # ヌル文字と改行コードを取り去る
            rStr = rStr.decode('utf-8').replace('\x00','')
            rStr = re.sub(r'[\n\r]+','',rStr)
            #print(len(rStr))
            if len(rStr.replace(' ', '')) == 0:
                continue
            else:
                # 作業時刻を取得
                dNow = dt.datetime.today()
                # 作業時間を文字列に変換
                rDT = dt.datetime.strftime(dNow, '%Y-%m-%d %H:%M:%S')
                # 作業時刻と取得データを連結する
                rTxt = rDT + ',' + rStr
                # 読み込んだデータの表示
                print(rTxt)
                # 作業時刻よりファイル名を設定
                fnm = setfilenm(dNow)
                # データを書き込む
                recdata(fnm, rTxt)
                #print(fnm)
    except KeyboardInterrupt:
        pass
    except:
        # 例外エラーが発生してもエラー内容を記録して処理は続行させる
        print("例外エラー:", sys.exc_info()[1])
        main()

if __name__ == '__main__':
    main()


『例外が発生しても処理を続ける』記述がこれで良いのかはわかりませんが、rStr = ser.readline()でエラーが発生してもその後は復帰し、データは取り続けているいることは確認できています。
エラーの内容からラズパイ側でないかと思い調べましたが解決に至っていません。
エラーの発生するタイミングがランダムであり、それがデータ受信のタイミングであるとうまくありませんので解決策を探しています。お心当たりの情報がありましたらご教授いただきたくよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+2

Windows7+Teratermの環境ですが、UC-SGT使ってます。
時々文字化けが発生したりするのでUC-SGT自体または周囲のノイズなどの問題ではないでしょうか?
(同じデバイスをPCのCOMポートに直結した場合は問題は発生したことはないです)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/13 15:39

    ご回答ありがとうございます。
    ご指摘通りでさもありなんと思い、社内にたまたまありましたOMRONのCS1W-CIF31という非常に高価なUSBシリアル変換ケーブルでテストを行うつもりで努力しました。
    が、lsusbではOMRONと返すのですが/dev/に自動認識されてきません。ドライバーが必要なのでしょう。
    別のものを購入しようかとも思いましたがあきらめましてGPIOでのシリアル通信に切り替えてロングランテストを行っています。
    これでエラーが出なければ、こちらで進めていきたいと思います。ありがとうございました。

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    4805questions

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

  • Raspberry Pi

    666questions

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