
概要 📖 – シリアル通信を行ごとに記録
Serial DATは、COM ポート経由のシリアル通信を送受信し、受信データを行ごとにテーブル形式で記録する DATです。Arduino や M5Stack などのマイコンとの連携を想定しており、受信フォーマットの切替・ボーレートなどの通信設定・受信ごとの Python コールバック発火・出力行数の上限制御まで備えています。
主な用途 🎯
- マイコンからのシリアル受信データのテーブル化(Arduino / M5Stack / Teensy 等が送る行データを 1 行 1 メッセージで記録)
- Callbacks DAT による受信ごとの Python 駆動(メッセージ受信のたびに 1 回スクリプトを実行して per-message 処理)
- センサー値・コマンド文字列の双方向通信(受信だけでなく
send()でデバイスへコマンド送出) - 通信フォーマットの切替(バイト単位 / 行単位 / メッセージ単位で受信データの区切り方を選択)
- 受信ログの行数制限とクリア(長時間運用でテーブルが膨張しないよう上限制御)
データフロー 🔄
入力: COM ポート経由のシリアルデータ
↓
フォーマット解析(バイト / 行 / メッセージ単位で区切り)
↓
Callbacks DAT 発火(受信ごとに 1 回スクリプト実行)
↓
出力: テーブル DAT(受信メッセージを 1 行ずつ記録)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Connect Page 📋
接続の有効化 🔌
Active .active ✅
– Active (接続の有効化) — On 時にシリアル接続を有効化して送受信を開始
– Off 時は接続を閉じ、受信処理を停止
受信フォーマット .format 📑
Row/ Callback Format (受信データの区切り方) — 受信データをバイナリ / ASCII のどちらとして解釈し、どの単位で 1 行を追加するかを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| One Per Byte | .perbyte |
バイナリ 1 バイトごとに 1 行を追加(旧称 binary) |
| One Per Line | .perline |
null または改行で区切られたメッセージごとに 1 行を追加(旧称 Ascii) |
| One Per Message | .permessage |
受信した完全なメッセージ全体を 1 行として追加 |
ポート選択 .port 🔢
Port でシリアル接続に使用する COM ポートを選択:
- Port:
Port(使用する COM ポート) — シリアル接続で使う COM ポートを指定。ポップアップには 1 から 8 が用意されるが、任意の名前を手入力も可能
ボーレート .baudrate ⚡
Baud Rate (1 秒あたりの転送ビット数) — 制御ビットを含めて毎秒転送される情報量。入力デバイス側の既定ボーレートに合わせて設定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1200 | .1200 |
1200 bps |
| 2400 | .2400 |
2400 bps |
| 9600 | .9600 |
9600 bps(マイコンの一般的な既定値) |
| 19200 | .19200 |
19200 bps |
| 38400 | .38400 |
38400 bps |
| 57600 | .57600 |
57600 bps |
| 115200 | .115200 |
115200 bps(高速通信でよく使われる値) |
| 230400 | .230400 |
230400 bps |
| 460800 | .460800 |
460800 bps |
| 921600 | .921600 |
921600 bps |
| 1382400 | .1382400 |
1382400 bps |
データビット .databits 🧮
Data Bits (1 回の転送あたりのデータビット数) — データビットは最下位ビット (LSB) から最上位ビット (MSB) の順で送られるため、解釈時は右から左へ読むメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| 6 | .6 |
6 データビット |
| 7 | .7 |
7 データビット |
| 8 | .8 |
8 データビット(最も一般的) |
| 9 | .9 |
9 データビット |
パリティ .parity 🛡️
Parity (誤り検出用ビット) — データビットの後に付く簡易な誤り検出ビット。偶数 / 奇数 / なし を選択するメニュー。設定はデータ送信側とそろえる必要があります
| 項目 | 内部名 | 説明 |
|---|---|---|
| Even | .even |
偶数パリティ(1 の個数が偶数になるよう調整) |
| Odd | .odd |
奇数パリティ(1 の個数が奇数になるよう調整) |
| None | .none |
パリティビットなし |
ストップビット .stopbits ⏹️
Stop Bits (転送パケット末尾のビット) — 送信パケットの最後に付く 1 または 2 ビット。これを送り終えると次のスタートビットを待機するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1 | .1 |
ストップビット 1 個 |
| 2 | .2 |
ストップビット 2 個 |
DTR フロー制御 .dtr 🔁
DTR (data-terminal-ready フロー制御 / Windows のみ) — デバイスを開いたときの DTR ラインの扱いを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Disable | .disable |
デバイスを開いたときにラインを無効化 |
| Enable | .enable |
デバイスを開いたときにラインを有効化 |
| Handshake | .handshake |
デバイスとのハンドシェイクを有効化 |
RTS フロー制御 .rts 🔄
RTS (request-to-send フロー制御 / Windows のみ) — デバイスを開いたときの RTS ラインの扱いを選択するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Disable | .disable |
デバイスを開いたときにラインを無効化 |
| Enable | .enable |
デバイスを開いたときにラインを有効化 |
| Handshake | .handshake |
RTS ハンドシェイクを有効化 |
| Toggle | .toggle |
送出バイトがあるときのみラインを High にする |
Received Data Page 📨
Callbacks .callbacks 🐍
Callbacks DAT .callbacks 📜
– Callbacks DAT (受信ごとに実行するスクリプト) — メッセージを受信するたびに 1 回スクリプトを実行する Callbacks DAT のパス
実行スコープ .executeloc 📍
Execute from (スクリプトの実行場所) — Callbacks DAT のスクリプトをどの OP の場所から実行するかを決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Current Node | .current |
現在の Node 位置からスクリプトを実行 |
| Specified Operator | .specified |
From Operator で指定した OP からスクリプトを実行 |
| Parent of Callbacks DAT | .callback |
Callbacks DAT の親 OP からスクリプトを実行 |
From Operator .fromop 🔗
Execute from が Specified Operator のときに参照される OP パス:
- From Operator パス:
From Operator(参照する OP のパス) —Execute fromがSpecified Operatorのときにスクリプトの実行元となる OP のパス
出力行数制御 📏
Clamp Output .clamp 🚧
– Clamp Output (出力行数の上限制御) — On 時に出力テーブルの行数を制限
– DAT はデフォルトで 100 メッセージに制限されるが、Clamp Output により任意値・無制限に変更可能
Maximum Lines .maxlines 📐
– Maximum Lines (保持するメッセージ数の上限) — 出力テーブルに保持するメッセージ数を制限
– 上限を超えると古いメッセージから順に削除される
Clear Output .clear 🗑️
– Clear Output (出力のクリア) — ヘッダ行を除く全行を削除するパルス
– スクリプトからの実行例: opparm -c /serial1 clear
Bytes Column .bytes 🔣
– Bytes Column (生バイト列の列出力) — On 時に各メッセージの raw bytes を別カラムとして出力に追加
– バイナリプロトコルのデバッグや生データ確認に有用
Common Page 🔧
Language .language 📝
DAT が動作するスクリプト言語の決定方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT のスクリプト言語を使用 |
| Node | .node |
この DAT 自身のスクリプト言語を使用 |
Edit/View Extension .extension 📄
外部エディタに公開するファイル拡張子の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| dat | .dat |
汎用的なファイル拡張子 dat を使用 |
| From Language | .language |
DAT のスクリプト言語に応じた拡張子を自動選択 |
| Custom Extension | .custom |
Custom Extension で指定したカスタム拡張子を使用 |
Custom Extension .customext 🔤
Edit/View Extension が Custom Extension のときに適用される拡張子:
- Custom Extension 文字列:
Edit/View Extensionがcustomのときに使用される任意のファイル拡張子
Word Wrap .wordwrap 🔁
ノード表示でのワードラップ (折り返し) の有効化
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT の Word Wrap 設定を継承 |
| On | .on |
Word Wrap を有効化 (ノード上の長い行を折り返し表示) |
| Off | .off |
Word Wrap を無効化 (折り返さずそのまま表示) |
実践アイデア 💡
Example 1: センサー値を受信 🔌
Arduino → Serial DAT (One Per Line, 9600) → Convert DAT → CHOP
Arduino が改行区切りで送るセンサー値を Serial DAT で 1 行ずつ受信し、Convert DAT でテーブルから CHOP へ変換してビジュアル制御に流し込む基本フロー。マイコン連携の出発点になります。
Portに Arduino が接続された COM ポートを指定し、Baud Rateを Arduino 側のSerial.begin()と同じ 9600 にそろえるRow/ Callback FormatをOne Per Lineにして改行区切りのメッセージを 1 行ずつ記録Activeを On にして受信を開始- Convert DAT で受信テーブルを CHOP 用フォーマットに変換し、後段の CHOP ネットワークへ渡す
Maximum Linesを 100 程度に設定し、長時間運用でも行が膨張しないようにする
Example 2: 受信ごとに発火 🐍
Microcontroller → Serial DAT (Callbacks DAT) → Constant CHOP
マイコンから届くカンマ区切りの行データを、受信のたびに Callbacks DAT で捕捉して Python でパースし、各値を Constant CHOP に書き込むパターン。複数センサーを 1 本のシリアルで多重化する用途に向きます。
Row/ Callback FormatをOne Per Lineにし、Callbacks DATに受信処理用 DAT のパスを指定- コールバック内で受信行を
line.split(',')でパースし、各フィールドを数値化 op('constant1').par.value0 = float(fields[0])等で Constant CHOP に書き戻すExecute fromを用途に合わせて選び、参照する OP のスコープを明確にする
Example 3: コマンド双方向通信 📡
Serial DAT (send) → Microcontroller → Serial DAT (receive)
Serial DAT は受信だけでなく send() によるコマンド送出にも対応します。TouchDesigner 側からマイコンへ点灯指示やモード切替コマンドを送り、応答を同じ DAT で受け取る双方向のやり取りを構築する例。
- Serial DAT を配置し、
Port/Baud RateをデバイスにそろえてActiveを On にする - Python から
op('serial1').send('LED ON\n')のようにコマンド文字列を送出 - デバイスからの応答は同じ Serial DAT の出力テーブルに行として追加される
Bytes Columnを On にして、応答の生バイト列をデバッグ確認できるようにする
関連オペレータ 🔗
類似機能OP 🔍
- Serial CHOP — CHOP 版のシリアル入出力。受信値をチャンネルとして扱いたいときに使用
- OSC In DAT — OSC プロトコル受信版。メッセージを 1 行 1 イベントで記録
- MIDI In DAT — MIDI 入力版。受信イベントをテーブル化する近接 DAT
組み合わせ推奨OP 🔄
- Convert DAT — 受信テーブルを CHOP / 別フォーマットへ変換する定番ペア
- DAT Execute DAT — 行追加イベントをトリガーに Python を発火する組み合わせ
- Constant CHOP — コールバックで取り出した値を CHOP ネットワークへ流す
- Table DAT — 受信ログを別 DAT に転記・保存する用途
- File Out DAT — 受信ログをファイルに書き出すロギング用途
前処理・後処理DAT 🎯
- 前処理: Substitute DAT
- 後処理: Convert DAT、Select DAT、Null DAT
Info DAT情報 📊
Serial DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time 等の共通 DAT Info チャンネルを参照可能)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 受信データが出てこない
✅ Solution:
Activeが On になっているか確認Portがデバイスの接続されている COM ポートと一致しているか確認Baud Rateがデバイス側の送信ボーレートと一致しているか確認(不一致だと文字化けや無受信になる)- 他のソフト(Arduino IDE のシリアルモニタ等)が同じ COM ポートを占有していないか確認
❌ Problem: 文字化け・行の区切りがおかしい
✅ Solution:
Row/ Callback Formatがデバイスの送信形式(バイト / 行 / メッセージ)と合っているか確認Data Bits/Parity/Stop Bitsをデバイス側の設定とそろえる- デバイス側が改行(
\n)でメッセージを終端しているか確認し、One Per Lineと整合させる
❌ Problem: 出力行数が無制限に増えてメモリを圧迫する
✅ Solution:
Clamp Outputを On にし、Maximum Linesで適切な上限を設定- Callbacks DAT で必要な情報を別 DAT / 外部ファイルに転記したあと
Clear Outputで定期クリア - 受信頻度が高い場合は
One Per Messageでメッセージ単位に集約して行数を抑える
❌ Problem: Callbacks スクリプトが発火しない・エラーで止まる
✅ Solution:
Callbacks DATパラメータに正しいパスが設定されているか確認Execute fromの選択が意図したスコープ(Current Node / Specified Operator / Parent of Callbacks DAT)になっているか確認- コールバック内を
try / except Exception as e:で囲み、Textport にトレースバックを出力して例外を特定
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

