参考メモ/電子工作のシリアル通信(マイコン,パソコン,RS-232C)の雑多なメモ

2014年前半に、PCとシリアル通信を行うちょっとしたアプリを組むことがありました。
LinuxやWindowsなどから直接シリアル通信を行わせようとして、PCに搭載されてるシリアル通信系のチップセットについて調べたり、
そもそもシリアル通信とRS232Cってどう違うんだっけ、となったり、
PCから直接シリアル通信を行わせるの諸事情で結局あきらめて、最近のArduinoやRaspberry Piからはどうだ？と調べたり、
したメモです。

ざっくり話すと、RTS/CTS線のハンドシェイクが必要な骨董品レベルのシリアル通信をモダンPCでやろうとして、最初PC(Linux/Windows)系でやろうとしたけど無理っぽいのでArduinoなどマイコン系でやろうとしていろいろググった軌跡です。

もう細かい流れ覚えてないのですが、誰かの役に立つかもなので、順番バラバラですいませんが参考URLまとめておきます。

# UART/USART/8250/82511/16550など仕様、チップセット関連

- UART - Wikipedia
  - https://ja.wikipedia.org/wiki/UART
  - 「調歩同期式通信」＝「非同期式通信」 : 自分のクロックをベースに同期する。
- Universal Synchronous/Asynchronous Receiver/Transmitter - Wikipedia, the free encyclopedia
  - https://en.wikipedia.org/wiki/Universal_Synchronous/Asynchronous_Receiver/Transmitter
  - 「同期式通信」 : 相手か、自分から発生したクロックに同期して送受信する。

「同期式通信」「非同期式通信」の違いが分かりづらかったのですが、@jj1bdx さんからのコメントで、「非同期式通信(UART使用)の場合、同期を行うのはスタートビットのタイミングを元に、あとは速度を仮定してサンプルしていって、最後がストップビットであることを確認する」という説明が分かりやすかったです、ありがとうございます。

- UART/USART両対応 : 8251シリーズ
- UARTのみだが、PC/AT互換機で今もその発展形が幅広く使われている : 8250 / 16550, 16650 シリーズ

## Intel USART 8251 関連

マイコン時代の、同期式通信を扱うコントローラ。

- Intel 8251 - Wikipedia, the free encyclopedia
  - https://en.wikipedia.org/wiki/Intel_8251
- Interfacing with INTEL-8251A-(USART) and 8085 -Free 8085 Microprocessor lecture
  - http://8085projects.info/INTEL-8251A-(USART).html
- 8251 UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER
  - http://www.electronics.dit.ie/staff/tscarff/8251usart/8251.htm
- Tech. to controll 8251
  - http://hp.vector.co.jp/authors/VA000981/dos-tech/8251.html
  - レジスタまで解説してくれてて日本語では参考になるサイト。

## UART 8250 / 16550 / 16650A 系関連

こちらの非同期式通信コントローラが、PC系で使われるいわゆる「シリアル通信」の系譜。

- 8250 UART - Wikipedia, the free encyclopedia
  - https://en.wikipedia.org/wiki/8250_UART
- 8250 UART - Wikipedia
  - https://ja.wikipedia.org/wiki/8250_UART
- 16550 UART - Wikipedia
  - https://ja.wikipedia.org/wiki/16550_UART
- Uart 16550
  - http://www.slideshare.net/gurls_on_mars/uart-16550
- Serial Programming/8250 UART Programming - Wikibooks, open books for an open world
  - https://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming
- Tech. to controll 8250
  - http://hp.vector.co.jp/authors/VA000981/dos-tech/8250.html
  - レジスタまで解説してくれてて日本語では参考になるサイト。

## Intel以外のコントローラ

Intel以外にも、マイコンのZ80用などシリアル通信用コントローラがあるのを @jj1bdx さんに教えてもらいましたので、メモ。

- Zilog Z80 SIO
  - http://www.st.rim.or.jp/~nkomatsu/zilog/Z80SIO.html
  - Z80用のシリアル通信コントローラ, 「単なる調歩同期だけでなく、文字同期式やビット指向のHDLCまで送受信できる」
- MC6850
  - http://www.st.rim.or.jp/~nkomatsu/mc6800peripheral/MC6850.html
  - モトローラ製のシリアル通信コントローラ
  - 「コンパクトな24ピンのパッケージに1回路分の調歩同期式のシリアル送受信回路が納められており、数本のモデム制御用I/Oピンも備わっています。」
- HD6402 (以前は IM6402)
  - https://www.intersil.com/content/dam/Intersil/documents/hd-6/hd-6402.pdf

# RS232Cのピン配置, RTS/CTS or DTR/DSR フロー制御(ハンドシェイク) 日本語資料

RS232はシリアル通信の規格で、プロトコルと接続ポートの形状や信号線などハード・ソフト両方を定めている。
信号線が数種類用意されているため、それらを使ったハンドシェイク方式についても何種類かある。
ベースとなっているのはUARTなので、マシンの性能とは独立して、利用目的ごとに通信スピードを設定してデジタル信号を送受信できる。

- RS-232 - Wikipedia
  - https://ja.wikipedia.org/wiki/RS-232
- フロー制御 - Wikipedia
  - https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AD%E3%83%BC%E5%88%B6%E5%BE%A1
- The Linux Serial HOWTO: ピン配置と信号
  - http://archive.linux.or.jp/JF/JFdocs/Serial-HOWTO-16.html
- 46071_p113-116.pdf
  - http://www.cqpub.co.jp/hanbai/books/46/46071/46071_p113-116.pdf
  - CQ出版社からの、シリアルポートを使った電子工作の入門記事

以下は通信・計測機器などを製造・販売している会社からの説明資料なので、Wikipediaよりは信頼性が高いかも。また、図表があるのでわかりやすい。

- シリアル通信の概要 - National Instruments
  - http://www.ni.com/white-paper/2895/ja/
- RS-232C/422/485 シリアル通信とは。基礎知識、用語集｜コンテック
  - http://www.contec.co.jp/product/device/serial/basic.html
  - 「シリアル通信」や「RS-232C」といった何気なく使ってる単語、実は色々と細かい点で差異があったりする。分かりやすい解説。

# Linux/Windowsからのシリアル通信プログラミング資料

- Serial and UART Tutorial
  - http://www.freebsd.org/doc/en_US.ISO8859-1/articles/serial-uart/index.html
  - BSDでのシリアルポートの扱いが網羅的に解説されている。
- Serial HOWTO
  - http://www.tldp.org/HOWTO/Serial-HOWTO.html
  - Linuxでのシリアルポートの扱いが網羅的に解説されている。
- Serial UART, an in depth tutorial
  - http://www.lammertbies.nl/comm/info/serial-uart.html
- CREATORS BANK (www.geocities.jp)
  - http://www.geocities.jp/terukat/_geo_contents_/win/comm.html
  - Win32APIを使ったシリアルポート通信の解説。RTS/CTSハンドシェイクや、EscappeCommFunction()によるDTR/RTS制御まで解説している点が他よりも頭ひとつ抜けている感じ。
- 通信ソフトを作る（その１）
  - http://www5b.biglobe.ne.jp/~kouta_y/news/newsvb/vb14.html
  - VB(VB6かな?)によるシリアル通信プログラミングのサンプル。

## シリアル通信ユーティリティ, Kermitの参考URL

- The Kermit Project - Columbia University: Secure Scriptable Telnet, FTP, SSH Terminal Emulation and File Transfer Clients
  - http://www.columbia.edu/kermit/index.html
- メランジ雑記帳 » 20 年ぶりにkermitを使う
  - http://www.melange.co.jp/blog/?p=3039
- C-Kermit のインストールと設定
  - http://www.geocities.co.jp/SiliconValley/7244/netbsdmacppc/one/prepare-06-01.html
- 組込み開発の常識！？C-Kermitの使い方を調べたメモ | Futurismo
  - http://futurismo.biz/archives/1475

# Ubuntu で USB - RS232C変換ケーブルを使う

"/dev/ttyUSB" を使う：

- Ubuntu 12.04 に USB Serial をつなげる - Code & Note
  - http://drumken.blog8.fc2.com/blog-entry-347.html
- UbuntuでRS-232Cを利用したシリアルポート通信　|　Linux 時々 XX
  - http://linuxandxx.blog.fc2.com/blog-entry-34.html
- command line - How do I connect to TTY/COM (/dev/ttyUSB0)? - Ask Ubuntu
  - http://askubuntu.com/questions/40959/how-do-i-connect-to-tty-com-dev-ttyusb0

工業機器向けのフルスペック変換ユニット：

- RS-232シリアル-USB変換ユニット 高耐圧絶縁 | LINEEYE
  - http://www.lineeye.co.jp/html/product_si55usb.html

# シリアル通信の電圧と変換(レベルコンバータ)

シリアル通信では0(「スペース」と呼ぶ)/1(「マーク」と呼ぶ)の信号をやり取りするが、実際の物理的な電圧が機器によって異なる場合は、レベルコンバータを挟む必要がある。

- 電子工作の知恵袋　＞　通信規格　＞　ＵＡＲＴ　その１　基本
  - http://www.ele-lab.com/tips_uart.html
- 電子工作の知恵袋　＞　通信規格　＞　ＵＡＲＴ　その３　ＲＳ２３２Ｃに変換する
  - http://www.ele-lab.com/tips_uart3.html
- 電子工作/RS-232C レベル変換 - labs.beatcraft.com
  - http://labs.beatcraft.com/ja/index.php?%C5%C5%BB%D2%B9%A9%BA%EE%2FRS-232C%20%A5%EC%A5%D9%A5%EB%CA%D1%B4%B9
- マイコンとシリアルポートを繋ぐためのレベルコンバータ(TTL,RS-232c)の自作 - sdkt4aの日記
  - http://d.hatena.ne.jp/sdkt4a/20080808/1218143919

RS232Cの復習 : RS232Cの電圧レベル : 0が +3V - +15V, 1が -3V - -15V

- 電子回路の豆知識
  - http://www.nahitech.com/nahitafu/mame/mame5/rs232c.html
  - ※当初は見出し直後の「0(「スペース」と呼ぶ)/1(「マーク」と呼ぶ)」のところを「HIGH/LOW」と表記していましたが、電圧の値と混同して紛らわしいので、より信号の意味を正確に表現できる「スペース」「マーク」という表記に修正しています。この表現は上記URLで使われてて、電子工作でのシリアル通信全体の解説としても非常に分かりやすかったです。
- RS-232Cの簡易接続
  - http://elm-chan.org/docs/rs232c.html
- 電子工作の知恵袋　＞　通信規格　＞　RS232C　その１　基本
  - http://www.ele-lab.com/tips_rs232c.html

マイコン系の信号レベル 0 - 5V を変換してくれるボードが売ってる：

- 第1章　RS－２３２Cレベル変換ボード
  - http://www.cqpub.co.jp/toragi/TRBN/contents/2008/tr0801/0801furoku.pdf
- RS232C　レベルコンバータ(ADM3202)
  - http://optimize.ath.cx/etc/rs232c_cnv.htm
- 【電子工作】 1.5Vの直流電源を、7~12Vまで昇圧する方法を 教え… - 人力検索はてな
  - http://q.hatena.ne.jp/1154744010

# Linuxのkernelデバイスドライバ開発という観点での "Serial", "TTY" Device Driver系の話題

- Linux kernel device driver programming - Stack Overflow
  - http://stackoverflow.com/questions/11220720/linux-kernel-device-driver-programming
- Write Linux device drivers – TuxDiary
  - http://tuxdiary.com/2012/04/29/writing-linux-device-driver-tutorials/
- Article Series on Linux Device Drivers
  - http://opensourceforu.efytimes.com/tag/linux-device-drivers-series/
- Pete's Blog: Writing a Linux device driver module for kernels 2.6 or later with udev
  - http://pete.akeo.ie/2011/08/writing-linux-device-driver-for-kernels.html
- Linux Knowledge Base and Tutorial
  - http://linuxtutorial.info/modules.php?name=MContent&pageid=262
- Linux Kernel Driver Tutorial
  - http://tali.admingilde.org/dhwk/vorlesung.pdf
- Serial Drivers
  - http://www.linux.it/~rubini/docs/serial/serial.html
- ch18.pdf, TTY Drivers
  - http://static.lwn.net/images/pdf/LDD3/ch18.pdf
- The Serial Driver Layer | Linux Journal
  - http://www.linuxjournal.com/article/6331?page=0,1

# Arduino でのシリアルポート通信の参考URL

- Serial library RTS/CTS control - Arduino Forum
  - http://forum.arduino.cc/index.php/topic,39974.0.html
- "SoftwareSerial Library" というので、任意のI/OピンをRS232CのRX/TXにassignできるようなんだけど、RTS/CTS線のハンドシェイク機能までは提供されてない。
  - http://arduino.cc/en/Reference/SoftwareSerial#.UwtiEfl_vwY
  - http://arduino.cc/en/Tutorial/TwoPortReceive#.Uwth5Pl_vwY
- Arduiono, USB(Serial) を使ってPCとやりとりできるっぽい。
  - http://arduino.cc/en/Tutorial/SerialEvent#.UwtcvPl_vwY
  - http://pc.watch.impress.co.jp/docs/2008/1218/musashino023.htm
- 結局、HardwareSerialを使ってるのはTX/RXのみ。→他の信号線を使おうとしたら、GPIOと組み合わせないと駄目か。
  - http://garretlab.web.fc2.com/arduino/introduction/input_and_output/
  - http://garretlab.web.fc2.com/arduino_reference/language/functions/communication/serial/index.html
  - http://forum.arduino.cc/index.php/topic,39974.0.html
  - http://binglongx.wordpress.com/2011/10/26/arduino-serial-port-communication/
  - http://garretlab.web.fc2.com/arduino/index.html
  - http://garretlab.web.fc2.com/arduino/index.html
  - http://armadillo.atmark-techno.com/faq/serial-programming
  - http://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_software_manual_ja-1.2.0/ch08.html
  - http://www.atelier-nodoka.net/2012/04/arduino-software-serial/
  - http://d.hatena.ne.jp/jonki/20131116/1384596009
  - http://wiki.androciti.com/index.php?Arduino%20Uno
- ArduinoでのI/OピンのRead/Write : 
  - http://arduino.cc/en/Reference/PinMode#.Uwtdovl_vwY
  - http://arduino.cc/en/Tutorial/DigitalPins#.Uwtdq_l_vwY
  - http://arduino.cc/en/Reference/digitalWrite#.Uwtd3_l_vwY

# Raspberry Piでのシリアルポート通信の参考URL

- やっぱりUARTなためかRX/TXしか使ってない。
  - http://ja.wikipedia.org/wiki/Raspberry_Pi
  - http://www.soramimi.jp/raspberrypi/rs232c/index.html
  - http://junkroom2cyberrobotics.blogspot.jp/2013/03/raspberry-pi-uart.html
  - http://nanicananica.blog.fc2.com/blog-entry-14.html
- RTS/CTS線ハンドシェイクを行うには、やっぱりGPIOも組み合わせないとだめそう。
  - http://www.raspberry-projects.com/pi/programming-in-c/io-pins/gpio-interrupts
  - http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=7509
  - https://sites.google.com/site/semilleroadt/raspberry-pi-tutorials/gpio

# 秋月電子のAtmega系マイコンボードでArduino互換機を作る参考URL

- 【夏の工作】秋月電子のATmega 168マイコンボードでArduino互換機を作った。SG的メモ。【Macでは不便】 : Sunday Gamerのブログ
  - http://sg.blog.jp/archives/51895243.html
- 外付けAVRライタ無しでBootloaderを書き込む
  - http://make.kosakalab.com/arduino/bootloader/
- 秋月電子 Arduino互換ボード AE-ATmegaの製作と使い方 by ボクにもわかる地上デジタル
  - http://www.geocities.jp/bokunimowakaru/diy/arduino/ae-atmega.html
- 秋月　ＡＴｍｅｇａ１６８／３２８マイコンボードキットをArduino化する - メモ書き
  - http://d.hatena.ne.jp/tetsu831/20110607/1307458078
- ブレッドボードの使い方-電子工作とメモ
  - http://denshi-kousaku.nazotoki-k.com/kiso/eic-801.htm