macosのcuコマンドで入力が効かない無効のときは/dev/cuを使う

# macosのcuコマンドで入力が効かないときは/dev/cuを使う

この記事では，UUCPの`cu`コマンドで入力が効かず，`screen`コマンドなら動作する場合の対処法を説明する．

## TL;DR

こうすれば良い．

```shell
sudo cu -l /dev/cu.usbserial
```

- `/dev/cu.usbserial*` のパスは，使用するUSBシリアルケーブルによって異なる．
    - [StartechのUSB-C to RS232C](https://www.startech.com/ja-jp/cards-adapters/icusb232c)ならば， `/dev/cu.usbserial-<シリアル番号>`となる．
    - シリアル番号は，`システム情報.app`でも確認できる．
- `/dev/tty.usbserial` は，モデムとかで使う．

## なぜ？

`/dev/tty.usbserial`は，モデムやコールアウト/コールインプロセス間で共有する場合に使うものらしい（詳しいことは調べてません）．

`cu`コマンドは，デバイスへの排他的アクセスが必要なので，専有を前提としている`/dev/cu.usbserial`を使用する．

なお，`cu`のコマンド引数ではハードウェアフロー制御を設定できず，`/etc/uucp`配下に`port`コンフィグファイルを作成すれば動作するいう報告は，どうやらCatalinaでは動作しないらしい（原因究明はしてない）．
ハードウェアフロー制御は`stty`コマンドで設定できるので， `sudo stty -f /dev/cu.usbserial -crtscts`とする手はあるが，残念ながら効果がなかった．

## ところでシリアル通信のオプションは？
細く指定せずとも，大抵のネットワーク機器は，`--speed 9600`か`--speed 115200`で動く．

9600 bps, 8 bit, パリティなし, 1 stop bit，XON/XOFFフロー制御なし，にするなら，
```
cu -s 9600 --parity=none --nostop
```

どんな設定になってるか確認したいければ，デバッグ有効にするといろいろ教えてくれる．

```shell
% sudo cu -l /dev/cu.usbserial -d 
cu: fconn_open: Opening port /dev/cu.usbserial(default speed)
cu: fsserial_open: Baud rate is 9600
cu: fconn_set: Changing setting to 0, 0, 2
Connected.
cu: fconn_write: Writing 1 "\r"


FreeBSD/arm (Amnesiac) (ttyu0)

login: 
```

`stty`でも見れる．

```shell
% sudo stty -af /dev/cu.usbserial
speed 9600 baud; 0 rows; 0 columns;
lflags: -icanon -isig -iexten -echo -echoe -echok -echoke -echonl
	-echoctl -echoprt -altwerase -noflsh -tostop -flusho -pendin
	-nokerninfo -extproc
iflags: -istrip -icrnl -inlcr -igncr -ixon -ixoff -ixany -imaxbel -iutf8
	-ignbrk -brkint -inpck -ignpar -parmrk
oflags: -opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
	-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
	eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
	min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
	stop = ^S; susp = ^Z; time = 1; werase = ^W;
```

詳しくは`--help`か`man cu`でどうぞ．

```shell
# cu --help
Taylor UUCP 1.07, copyright (C) 1991, 92, 93, 94, 1995, 2002 Ian Lance Taylor
Usage: cu [options] [system or phone-number]
 -a,-p,--port port: Use named port
 -l,--line line: Use named device (e.g. tty0)
 -s,--speed,--baud speed, -#: Use given speed
 -c,--phone phone: Phone number to call
 -z,--system system: System to call
 -e: Set even parity
 -o: Set odd parity
 --parity={odd,even}: Set parity
 -E,--escape char: Set escape character
 -h,--halfduplex: Echo locally
 --nostop: Turn off XON/XOFF handling
 -t,--mapcr: Map carriage return to carriage return/linefeed
 -n,--prompt: Prompt for phone number
 -d: Set maximum debugging level
 -x,--debug debug: Set debugging type
 -I,--config file: Set configuration file to use
 -v,--version: Print version and exit
 --help: Print help and exit
Report bugs to taylor-uucp@gnu.org
```

## screen使えばええやん？
`screen`は`screen`として使いたいので・・・

## 参考

- [macos \- choosing between /dev/tty\.usbserial vs /dev/cu\.usbserial \- Stack Overflow](https://stackoverflow.com/questions/37688257/choosing-between-dev-tty-usbserial-vs-dev-cu-usbserial)
- [serial port \- MacOS: what's the difference between /dev/tty\.\* and /dev/cu\.\*? \- Stack Overflow](https://stackoverflow.com/questions/8632586/macos-whats-the-difference-between-dev-tty-and-dev-cu)
- [cu Tips \- Qiita](https://qiita.com/g0117736/items/270942c37483183d98ef)
- [taylor\-uucp/cu\.1 at master · quinot/taylor\-uucp · GitHub](https://github.com/quinot/taylor-uucp/blob/master/cu.1)
- [1707501 – /usr/bin/cu cannot write to ttyUSB0 because of hardware flow control](https://bugzilla.redhat.com/show_bug.cgi?id=1707501)