Raspberry Pi(ラズパイ)を使ったプロジェクトでは、PCとデータをやり取りすることがよくあります。
今回は ラズパイ3B と Windows10 を Tera Term で接続し、Pythonプログラムを使って双方向通信 を行う方法を解説します。
必要なもの
- Raspberry Pi 3B(OS: Raspberry Pi OS)
→ Raspberry Pi OS のインストール方法 - Windows 10 PC
- microSDカード(OSインストール済み)
- USB シリアル変換ケーブル(例: PL2303、CH340、FT232R など)
→シリアル通信(USB-UART)の場合に必要 - Tera Term(Windows用ターミナルソフト)
- Python(ラズパイ標準で搭載)
方法A:TCPソケット(LAN経由)【おすすめ】
概要
Raspberry Pi 上の Python で TCPサーバ を起動(ポート例:5000)。Windows の Tera Term から TCP接続(Telnet/Raw) を張り、キーボード入力を送信、Pi 側が受け取り・処理して応答を返す構成です。
メリット
- 追加ハードウェア不要
- Tera Term の標準機能で接続可(「TCP/IP」→「Telnet」or「その他(Raw)」)
- 複数接続にも拡張しやすい
ラズパイ側:Pythonサーバ(asyncio版)
ラズパイのターミナルで必要なら Python を確認(標準で3系あり)。以下の tcp_server.py を作成します。
# tcp_server.py
import asyncio
import datetime
HOST = "0.0.0.0" # どこからの接続も受ける
PORT = 5000 # 任意の空きポート
WELCOME = (
"Raspberry Pi TCP Server (UTF-8)\n"
"Type something and press Enter. Commands: TIME, HELP, EXIT\n"
)
HELP = (
"Commands:\n"
" TIME : show server time\n"
" HELP : show this help\n"
" EXIT : close connection\n"
)
async def handle_client(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
addr = writer.get_extra_info('peername')
print(f"[INFO] Connected from {addr}")
writer.write(WELCOME.encode("utf-8"))
await writer.drain()
try:
while True:
writer.write(b"> ")
await writer.drain()
data = await reader.readline()
if not data:
break
text = data.decode("utf-8", errors="ignore").strip()
print(f"[RECV] {addr}: {text}")
if text.upper() == "EXIT":
writer.write(b"Bye!\n")
await writer.drain()
break
elif text.upper() == "TIME":
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
writer.write(f"{now}\n".encode("utf-8"))
elif text.upper() == "HELP":
writer.write(HELP.encode("utf-8"))
else:
# エコー(お好みで処理を差し替え)
writer.write(f"Echo: {text}\n".encode("utf-8"))
await writer.drain()
except Exception as e:
print(f"[ERROR] {addr}: {e}")
finally:
writer.close()
await writer.wait_closed()
print(f"[INFO] Disconnected {addr}")
async def main():
server = await asyncio.start_server(handle_client, HOST, PORT)
addr = ", ".join(str(s.getsockname()) for s in server.sockets)
print(f"[START] Listening on {addr}")
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
起動
python3 tcp_server.py
起動したら Listening on ('0.0.0.0', 5000) のように表示されます。
注意:社内LANや公開ネットワーク上で使う場合は、ファイアウォール/ネットワークポリシーに注意。必要に応じて認証を追加してください(IP制限、簡易パスワード、SSHトンネリングなど)。
起動後の画面例

Windows 10 側:Tera Term の接続

- Tera Term を起動
- 「TCP/IP」タブを選択
- 「ホスト」に ラズパイのIPアドレス を入力(例:
192.168.1.23) - サービスは
- まずは Telnet でOK(Enterで送ると改行がLF/CRLFに変換されやすい)
- うまくいかない場合は その他(Raw) を選び、ポート番号
5000を指定 - 接続後、画面に「WELCOME」が表示 →
TIME,HELP,EXITなどを入力

文字化け対策
- Tera Term の文字コードを
UTF-8に設定
[メニュー] → 設定 → 端末 → 受信/送信で UTF-8 を選択 - 改行コードは LF/CRLF の違いで振る舞いが変わる場合があります。うまく表示されない場合は Tera Term の「送信時の改行」を調整してください。
方法B:シリアル通信(USB-UART)【ネット不要】
概要
ラズパイの GPIO(UART:TXD/GPIO14, RXD/GPIO15, GND)と、Windows PC の USB-シリアル変換器(FTDI/CP2102/CH340 など)を配線。Pi 側の Python は pyserial で待ち受け、Windows 側は Tera Term で COMポート に接続します。
準備物
- USB-シリアル変換器(TTL 3.3V レベル対応のもの)
USBドライバーのインストール - ジャンパ線
- (必要なら)はんだ・ブレッドボード
配線(重要)

- 変換器 TXD → Pi の RXD(GPIO15, ピン10)
- 変換器 RXD → Pi の TXD(GPIO14, ピン8)
- 変換器 GND → Pi の GND(ピン6など)
- 電圧は3.3Vレベル必須(5Vを Pi UART に入れない!)
ラズパイ側設定(UART有効化)
sudo raspi-config
# Interface Options → Serial
# 「シリアル経由のログインシェルを有効にしますか?」→ いいえ
# 「シリアルハードウェアを有効にしますか?」→ はい
再起動後、/dev/serial0(または /dev/ttyAMA0//dev/ttyS0)が使えます。
ラズパイ側:Python(pyserial)
pip3 install pyserial
# serial_echo.py
import serial
# 例: /dev/serial0 を 115200bps
PORT = "/dev/serial0"
BAUD = 115200
with serial.Serial(PORT, BAUD, timeout=1) as ser:
print(f"[START] Serial open: {PORT} {BAUD}bps")
ser.write(b"Raspberry Pi Serial Server (UTF-8)\n")
ser.write(b"Type something. Commands: HELP, EXIT\n")
while True:
line = ser.readline() # 改行まで受信
if not line:
continue
text = line.decode("utf-8", errors="ignore").strip()
print(f"[RECV] {text}")
if text.upper() == "EXIT":
ser.write(b"Bye!\n")
break
elif text.upper() == "HELP":
ser.write(b"Commands: HELP, EXIT\n")
else:
ser.write(f"Echo: {text}\n".encode("utf-8"))
起動:
python3 serial_echo.py
Windows 側:Tera Term
- シリアルを選択 → COMポート(USB変換器が割り当てた番号)を選ぶ
- 速度(ボーレート)は 115200(スクリプトに合わせる)
- 文字コード
UTF-8推奨 - 接続するとラズパイからのウェルカムメッセージが見え、入力が反映されます
双方向通信のポイント(共通)
- 文字コード:UTF-8 に統一すると扱いやすい(Tera Term 側も UTF-8)
- 改行:Tera Term の「送信時の改行」(CR / LF / CR+LF)を調整
- プロトコル:1行1メッセージ(
\n終端)にすると実装が簡単 - ログ:Tera Term のログ機能でテストログを保存可能([ファイル]→ログ)
- セキュリティ(TCP):LAN越しは IP 制限や認証を検討
トラブルシュート
- Tera Term で接続できない(TCP)
- IPアドレス・ポートが正しいか(
ifconfig/ip a) - ラズパイでサーバが起動しているか(
ps,netstat -tulnp) - ルータ/Windows Defender ファイアウォールで遮断されていないか
- IPアドレス・ポートが正しいか(
- 文字化けする
- Tera Term を UTF-8 に変更
- Python 側の
encode("utf-8")/decode("utf-8")を確認
- シリアルが開けない
- ポート名・ボーレート一致
- raspi-config で「シリアルシェルは無効」「ハードウェアは有効」になっているか
- 配線 TX/RX が交差しているか、GND が共通か、電圧は3.3Vか
追加:Windows側も Pythonで通信したい場合
Tera Term の代わりに Windows 側から Python で話すサンプル(TCPクライアント)
# windows_client.py
import socket
import time
HOST = "***.***.*.**" # ラズパイのIP
PORT = 5000
with socket.create_connection((HOST, PORT)) as s:
print(s.recv(1024).decode("utf-8"), end="")
s.sendall(b"TIME\n")
time.sleep(3)
print(s.recv(1024).decode("utf-8"), end="")
s.sendall(b"EXIT\n")
time.sleep(3)
print(s.recv(1024).decode("utf-8"), end="")
まとめ
- ラズパイとWindowsは UART(シリアル通信) を使えば簡単にデータ交換できる
- Pythonの
pyserialを使うとプログラム的に制御可能 - Tera Termで簡単に確認でき、デバッグにも便利
