解決済み

ラズパイ3のSPI通信で文字列出力

  • すぐに回答を!
  • 質問No.9287630
  • 閲覧数432
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 78% (884/1122)

現在、ラズパイ3とアトメルのマイコン搭載の基板とをSPI通信で通信するためのコードをpythonで作成しています。

https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py

前回まで、サンプルのコードを参考に”hello”とい文字列をラズパイ3のSPI1ポートから出力していたのですが、
(中略)
print "writing data"
#hello spi (ASCII)
data = [104, 101, 108, 111, 32]
#str(spi.xfer2(data))
spi.xfer2(data)
(中略)


文字列をSPIポートから出してみたいと思い、次のようにコードしました。
(中略)
print "writing data"
#hello spi (ASCII)
data = "abcdefg"
spi.xfer2(data)
(中略)


しかしこの場合、

$ sudo python test20161202.py
test20161202.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(16, GPIO.OUT)
writing data

このようなエラーがでてpythonでコードを実行できません。
data = "abcdefg"

このような文字配列で文字列を出力するコードを書くことはできないのか、ご教示よろしくお願い致します。

質問者が選んだベストアンサー

  • 回答No.1

ベストアンサー率 58% (445/756)

 もしかすると、python3の文字列がらみかなぁ。
 というわけで、確認。
 data=b"abcdefg"
 と治してください。文字列の前のbの文字は、このリテラルが普通の文字列では無く、バイト配列であることを表すプレフィックスです。

 もし、これで動くようなら、そのからくりは
 http://python.civic-apps.com/python3-bytes-str-convert/
 あたりを参照してみてください。
 または、「phthon3 文字列 バイト列 変換」あたりでググると参考になる文献はたくさん出てきます。
 簡単に言うと、xfer2は、引数としてバイト配列を要求します。そして、文字列はバイト配列では「ありません」ということです。だから、文字列を送るためにはバイト配列としてリテラルを宣言するか、バイト配列に変換する必要があると言うことです。

 もし、ちゃんと動いていたプログラムのdata=の行だけを変更したのなら、多分コレでしょう。
 もし違ったら、(中略)の部分で、多分引用プログラムの前。spiとgpioの初期化の部分のコードの補足が必要です。
補足コメント
techhouse

お礼率 78% (884/1122)

一応の解決方法が見つかりましたので、メモがてら報告させて頂きます。


(中略)
data03 = "abcdefg"
commSpi(data03)
(中略)

def commSpi(data03):

(中略)

list0203 = list()
list0203 = []

i = 0
for x in data03:
list0203.insert(i,ord(x))
i += 1

(中略)
str(spi.xfer2(list0203))

このような感じで、文字列変数をリストに変換することで、spi.xfer2()でのSPIでのデータ送信でエラーは出なくなりました。
投稿日時 - 2017-02-09 08:46:30
お礼コメント
techhouse

お礼率 78% (884/1122)

回答頂きありがとうございます。

https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py

こちらのpythonコードで

data=b"abcdefg"

これをやってみたのですが、

$ sudo python test20161202.py
test20161202.py:18: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(16, GPIO.OUT)
writing data


このようなエラーが戻ってきて動作しない状態です。
エラー内容をググってみたところ、


Raspberry PiでPythonのRPi.GPIOを使ってLチカする by @ma6ato on @Qiita http://qiita.com/masato/items/715e28e0c0c945a54297


こちらのサイトにて、同様のエラー内容が発生する場合の対処方法として、

コードの最後に


GPIO.cleanup()


これを行うこと良いということなので、やってみたのですが、やはり同様のエラーが戻ってくる状態です。

もしよければ、教えて頂けると幸いです。
投稿日時 - 2017-01-31 10:50:01
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ