シリアル通信入門【Python】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
簡単に、「**シリアル通信について知り、実装する入門記事**」です。

# シリアル通信とは
シリアル通信：デジタルデータを1bitずつ順次伝送する通信方法
パラレル通信：複数bitのデジタルデータを同時伝送する通信方法

|通信方法|長所|短所|
|:---:|:---:|:---:|
|シリアル通信|低コスト|遅い|
|パラレル通信|高コスト|速い|

> より詳しく知りたい方は、この記事がおすすめです。
> [電子工作初心者のために シリアル通信方式を分かりやすくまとめてみた](https://qiita.com/Gri_Gra/items/b6f901b35d3917ffc580)

# Pythonで実装（pyserial）
## pyserialのインストール
まず以下のコマンドを叩き、パッケージをインストールします。（`$`は入力しなくて、大丈夫です。）

```bash:
$ pip install pyserial
```

## 通信できるデバイスの探索
まずは、通信できるデバイスを探索します。
以下のコマンドを叩いてみましょう。（2行目はterminalからのレスポンスになります。）

```bash:
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0 11 28 17:48 /dev/tty.Bluetooth-Incoming-Port
```
`/dev/tty.Bluetooth-Incoming-Port`というデバイスが見つかりました。

## 読み込み（read）
続いて、読み込みを行なってみましょう。

```python:read.py
import serial

readSer = serial.Serial('/dev/tty.Bluetooth-Incoming-Port',9600, timeout=3)
c = readSer.read() # 1 byte
string = readSer.read(10) # 10 byte
line = readSer.readline() # 1 line (upto '\n')
print("Read Serial:")
print(c)
print(string)
print(line)
readSer.close()
```

### コードの説明
1. packageをインストールする。
2. デバイス名とボーレート（通信速度）、タイムアウトの設定し、ポートを開ける。
<br>（`serial.Serial(デバイス名, ボーレート, タイムアウト)`）
3. 読み込みを行い、printする。
4. ポートを閉じる。

## 書き込み（write）

```python:write.py
import serial

serialCommand = "test"
writeSer = serial.Serial('/dev/tty.Bluetooth-Incoming-Port',9600, timeout=3)
writeSer.write(serialCommand.encode())
writeSer.close()
```

### コードの説明
1. packageをインストールする。
2. デバイス名とボーレート（通信速度）、タイムアウトの設定し、ポートを開ける。
<br>（`serial.Serial(デバイス名, ボーレート, タイムアウト)`）
3. 送りたいコマンドをエンコードし、書き込みする。
4. ポートを閉じる。

## 全体のサンプルコード

```python:main.py
import serial

print("===== Start Program =====\n")

# Set Parameter
deviceName = '/dev/tty.Bluetooth-Incoming-Port'    # search by `ls -l /dev/tty.*`
baudrateNum = 9600
timeoutNum = 3
print("===== Set Parameter Complete =====\n")

# # Read Serial
readSer = serial.Serial(deviceName, baudrateNum, timeout=timeoutNum)
c = readSer.read()
string = readSer.read(10)
line = readSer.readline()
print("Read Serial:")
print(c)
print(string)
print(line)
readSer.close()
print("===== Read Serial Complete =====\n")

# Write Serial
serialCommand = "test"
writeSer = serial.Serial(deviceName, baudrateNum, timeout=timeoutNum)
writeSer.write(serialCommand.encode())
writeSer.close()
print("===== Write Serial Complete =====\n")

print("===== End Program =====\n")
```

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

https://qiita.com/Gri_Gra/items/b6f901b35d3917ffc580

https://www.sejuku.net/blog/69511

https://qiita.com/unchainendo/items/1ea305d87c797ba02450

https://stackoverflow.com/questions/35642855/python3-pyserial-typeerror-unicode-strings-are-not-supported-please-encode-to

https://pyserial.readthedocs.io/en/latest/shortintro.html