アプリ版:「スタンプのみでお礼する」機能のリリースについて

ラズベリーパイ B でgpioを使ったuartをしたいのですが、どうしようもなくなりまして、質問させて頂きます。
※serialをインポートしています。
※python 3.4.2を使用しています

二つ、問題があります。
わかりにくいかもしれませんが、出来るだけ詳しく書きます。回答、よろしくお願いします。

一つ目は、write()の中にstr型を入れると、
タイプエラーと返され、バイト列を代入しないと動いてくれません。
encodeで変換して代入すると動きました。

二つ目は、文字列送信時に、先頭の2文字しか正常に送ることが出来ず、そのあとは文字化けしてしまう摩訶不思議な問題です。

受信はread lineを用い、printして、出来ていることは確認できました。
こちらから送信して受信を画面表示してからこちらにそのまま送り返すプログラムで試したところ、どうも2文字までしかできません。

一つ目で挙げた、encodeして代入するやり方で出力だけ試してみても、結果は同じで、2文字までしか正常に動いてくれません。

このままですと、2文字までしか送れない悲しい事態に陥ります。だれか、助けてください(泣)

受信出力するプログラムを載せておきます。

import serial
import time

sel= serial.Serial('/dev/ttyS0',baudrate=9600)
while 1:
st=sel.readline()
print(st)
sel.write(st)

A 回答 (2件)

#「送る」とか「受信」の主語が書かれていないので、現象がどちら向きの通信のことを仰っているのか理解しにくいです。




> 二つ目は、文字列送信時に、先頭の2文字しか正常に送ることが出来ず、そのあとは文字化けしてしまう

ご提示のソースには、ポートと通信速度しか書かれておりませんが、その他のパラメータはラズパイと通信相手側と一致しているのでしょうか?
また、serial.Serialにはフロー制御のパラメータ(下記)もあるので、そちらを使用してみては如何ですか?


https://pythonhosted.org//pyserial/pyserial_api. … より
> class serial.Serial
> __init__(port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None)


> xonxoff (bool) – Enable software flow control.
> rtscts (bool) – Enable hardware (RTS/CTS) flow control.
> dsrdtr (bool) – Enable hardware (DSR/DTR) flow control.

> Note that enabling both flow control methods (xonxoff and rtscts) together may not be supported. It is common to use one of the methods at once, not both.
> dsrdtr is not supported by all platforms (silently ignored). Setting it to None has the effect that its state follows rtscts.
    • good
    • 0

>write()の中にstr型を入れると、タイプエラーと返され、バイト列を代入しないと動いてくれません。


>encodeで変換して代入すると動きました。
なら解決したんじゃないの。

詳しくはないですけど
str型ってのは「ストリング」つまり「文字列」なので
使ってない値が入れば拒否、コンパイルの段階なら「あんた使い方間違ってますよ」というエラーでしょう。

>そのまま送り返すプログラムで試したところ、どうも2文字までしかできません。
受信側のハード能力が原因かもですね。
シリアルデータの受信は、「ちょっと待って今忙しいから」というプロトコルと信号線による制御方法がありますけど
それらのどちらも使ってないなら
2文字程度ならバッファ(「緩衝域」)により受け取れますけどそれ以上は無理だったりします。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
こんなに早くしてくださるとは思いませんでした。

write()に関してはたしかに解決したと言ってもいいかもしれません。ただ、ネットの記事などを見るに、文字列を代入しているものですから、これでいいのかと思った次第です。
成る程、緩衝域なるものがあるのですね。思い返してみれば、picでやっていた時も、同じようなことになっていました..
picですと、1文字ごとに少し時間をおいてということが出来ますが、ラズベリーパイでそういうことはできるのか、僕の検索力では分からなかったです...
出来れば解決策などご存知でしたら、教えて頂けないでしょうか。

お礼日時:2018/09/02 01:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!