
ラズベリーパイ 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件)
- 最新から表示
- 回答順に表示
No.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.

No.1
- 回答日時:
>write()の中にstr型を入れると、タイプエラーと返され、バイト列を代入しないと動いてくれません。
>encodeで変換して代入すると動きました。
なら解決したんじゃないの。
詳しくはないですけど
str型ってのは「ストリング」つまり「文字列」なので
使ってない値が入れば拒否、コンパイルの段階なら「あんた使い方間違ってますよ」というエラーでしょう。
>そのまま送り返すプログラムで試したところ、どうも2文字までしかできません。
受信側のハード能力が原因かもですね。
シリアルデータの受信は、「ちょっと待って今忙しいから」というプロトコルと信号線による制御方法がありますけど
それらのどちらも使ってないなら
2文字程度ならバッファ(「緩衝域」)により受け取れますけどそれ以上は無理だったりします。
回答、ありがとうございます。
こんなに早くしてくださるとは思いませんでした。
write()に関してはたしかに解決したと言ってもいいかもしれません。ただ、ネットの記事などを見るに、文字列を代入しているものですから、これでいいのかと思った次第です。
成る程、緩衝域なるものがあるのですね。思い返してみれば、picでやっていた時も、同じようなことになっていました..
picですと、1文字ごとに少し時間をおいてということが出来ますが、ラズベリーパイでそういうことはできるのか、僕の検索力では分からなかったです...
出来れば解決策などご存知でしたら、教えて頂けないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
jsp~jspにhiddenを使って変数...
-
[VBS]変数を定数に変換する方法...
-
エラーの意味は? Lvalue req...
-
stdpicture型の変数に、、
-
Excel VBAでイコール二回使えま...
-
gridViewの行選択解除
-
EXCEL/VBA 変数の値をクリップ...
-
JavaScriptをURLから直接実行し...
-
rubyにおける変数と代入のメモ...
-
C言語において、=と==の違...
-
プログラミング Pythonを使って...
-
定数の設定について。
-
変数4つに一括で0を挿入する方...
-
processing エラーで、 "cannot...
-
最小二乗法
-
C言語 exitの使い方
-
ラジオボタンの値の取得につい...
-
Accessで文字列のバイト数読み込み
-
VBA コンボボックスの値をスピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jsp~jspにhiddenを使って変数...
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
EXCEL/VBA 変数の値をクリップ...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
整数xxxが大き過ぎますというエ...
-
Accessコンボボックスにレコー...
-
stdpicture型の変数に、、
-
verilog HDLの[=]と[<=]の使い分け
-
プログラミングで変数と関数の...
-
Borland C++ Compiler 5.5の警...
-
【VBA】複合代入演算子
-
gridViewの行選択解除
-
VBAでコマンドプロンプトの結果...
-
VBA 1行で複数の代入を行った...
-
VB6.0での条件文にある#の意味
-
C言語 アロー演算子について質...
おすすめ情報