🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Q&A

解決済

1回答

1839閲覧

pySerialでのUSBポート検出ができません。

siden48

総合スコア16

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

0グッド

0クリップ

投稿2021/03/03 09:19

TWE-LITEではじめる「センサー」電子工作という書籍を参考に以下のコードを実行したところ下段のエラーが表示されました。
何がおかしいのでしょうか。教えていただけると助かります。
___________________________________
import struct,binascii,serial

s = serial.Serial(2,115200)

ss = struct.Struct(">BBBBBIBHBHBBBBBBBB")
while 1:
data = s.readline()
data = data[1:]
parsed = ss.upack(binascii.unhexlify(data.rstrip()))
if(parsed[11] == 0):
print("stopp\n")
else:
if(parsed[11]&1):print("tap\n")
if(parsed[11]&2):print("double tap\n")
if(parsed[11]&4):print("fall\n")
if(parsed[11]&8):print("move\n")
s.close()
____________________________________

ValueError Traceback (most recent call last)
<ipython-input-2-78b3d7980cb9> in <module>
2
3 #COM3を開く
----> 4 s = serial.Serial(2,115200)
5
6 #バイト列定義

~\Anaconda3\lib\site-packages\serial\serialwin32.py in init(self, *args, **kwargs)
31 self._overlapped_read = None
32 self._overlapped_write = None
---> 33 super(Serial, self).init(*args, **kwargs)
34
35 def open(self):

~\Anaconda3\lib\site-packages\serial\serialutil.py in init(self, port, baudrate, bytesize, parity, stopbits, timeout, xonxoff, rtscts, write_timeout, dsrdtr, inter_byte_timeout, exclusive, **kwargs)
220
221 # assign values using get/set methods using the properties feature
--> 222 self.port = port
223 self.baudrate = baudrate
224 self.bytesize = bytesize

~\Anaconda3\lib\site-packages\serial\serialutil.py in port(self, port)
266 """
267 if port is not None and not isinstance(port, basestring):
--> 268 raise ValueError('"port" must be None or a string, not {}'.format(type(port)))
269 was_open = self.is_open
270 if was_open:

ValueError: "port" must be None or a string, not <class 'int'>

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

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

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

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

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

guest

回答1

0

ベストアンサー

google翻訳
ValueError: 「ポート」は、<class'int '>ではなく、Noneまたは文字列である必要があります

Windowsなら、'COM3'なんでは

投稿2021/03/03 09:31

y_waiwai

総合スコア88038

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

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

siden48

2021/03/03 09:47

回答ありがとうございます。 s = serial.Serial("COM3",115200)に変更して実行したらValueErrorはなくなったのですが、以下の表示がありました。 SerialException: could not open port 'COM3': PermissionError(13, 'アクセスが拒否されました。', None, 5) デバイスマネージャで確認したところCOM3となっているのですが、これはどういったことが原因なんでしょうか。
y_waiwai

2021/03/03 09:59

そのCOM3がすでに使用中とかなんでは。
siden48

2021/03/03 23:49

デバイスマネージャでCOM3ということは確認しました。また、teratermではCOM3で通信できていました。 一度、他のUSB機器をはずして実行してみたのですが、同じように表示されました。 他に考えられる可能性があれば教えていただけると助かります。
NGW

2021/03/04 02:03

デバイスマネージャで確認されたことは、ちゃんと書いてありましたね。 たいへん失礼しました。 何度か実行していると、失敗したときにopenしっぱなしになって、占有されてしまうことがあるようです。念の為、Windows側の再起動も試してみてどうでしょうか。
y_waiwai

2021/03/04 07:59

そのCOM3をteratermで開いたままにしてませんか。 シリアルポートは一つが開いてたら他は使えません。 そこらへん確認してみよう
siden48

2021/03/04 11:07

1回Errorが発生するごとに前と同じようにアクセスが拒否されますが、再起動してteratermをとじた状態で実行したら1度だけ先に進めました。 今度は「parsed = ss.unpack(binascii.unhexlify(data.rstrip()))」のところで「Error: Odd-length string」というErrorが出現します。 繰り返し申し訳ありませんが、最後にここまで教えていただけないでしょうか。
NGW

2021/03/04 20:55

ポートの問題は解決したようでよかったです。 エラーになってもシリアルポートが必ず閉じられるようにしておくと安全になります。たとえば、`with serial.Serial(2,115200) as s:`と書いて、以降の処理はインデントを下げるか、もしくは try-except-finallyで括って、finallyの中にs.close()を書いておくと良いと思います。 「Error: Odd-length string」は、マイコン側から送られてきたデータのデータ長が不正(奇数になっている)なようです。マイコン側も、最初からちゃんとしたデータを送ってもらえるように、再起動をかけてみるとかでしょうか。
siden48

2021/03/05 10:34

お二人ともありがとうございました。 マイコン側の設定をし直したら何とか期待していた反応が得られました。 まだ教えていただいたエラー回避の方法は試せていませんがこれからやってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問