Help us understand the problem. What is going on with this article?

シリアル通信入門【Python】

はじめに

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

シリアル通信とは

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

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

より詳しく知りたい方は、この記事がおすすめです。
電子工作初心者のために シリアル通信方式を分かりやすくまとめてみた

Pythonで実装(pyserial)

pyserialのインストール

まず以下のコマンドを叩き、パッケージをインストールします。($は入力しなくて、大丈夫です。)

$ pip install pyserial

通信できるデバイスの探索

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

$ 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)

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

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. デバイス名とボーレート(通信速度)、タイムアウトの設定し、ポートを開ける。
    serial.Serial(デバイス名, ボーレート, タイムアウト)
  3. 読み込みを行い、printする。
  4. ポートを閉じる。

書き込み(write)

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. デバイス名とボーレート(通信速度)、タイムアウトの設定し、ポートを開ける。
    serial.Serial(デバイス名, ボーレート, タイムアウト)
  3. 送りたいコマンドをエンコードし、書き込みする。
  4. ポートを閉じる。

全体のサンプルコード

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")

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした