Emacsでシリアル通信(serial-monitor-mode)
組み込み機器をシリアルケーブルで繋いでモニターする時とかに使えそうなので公開しておきます。作ったのは15年前くらい。
;;
;; serial-monitor-mode
;;
(defvar serial-monitor-mode-map nil)
(defvar serial-monitor-process nil)
(if serial-monitor-mode-map
nil
(setf serial-monitor-mode-map (make-sparse-keymap))
(define-key serial-monitor-mode-map "\C-m" 'serial-monitor-send)
(define-key serial-monitor-mode-map "Mouse-2" 'serial-monitor-send))
;;
;; mode funtions
(defun serial-monitor-mode ()
"serial mode
\\C-c \\C-c : serial-monitor-send"
(interactive)
(kill-all-local-variables)
(use-local-map serial-monitor-mode-map)
(setf mode-name "Serial"
major-mode 'serial-monitor-mode)
(run-hooks 'serial-monitor-mode-hook))
(defun serial-monitor-send ()
"Send data to Serial"
(interactive)
(save-excursion
(let ((sendstring))
(goto-char (point-max))
(setf sendstring (read-from-minibuffer "Send: "))
(process-send-string serial-monitor-process (format "%s\n" sendstring)))))
(defun serial-monitor-filter (proc string)
"Serial Monitor communication filter (callback function)"
(let ((buffername (process-name proc)))
(with-current-buffer buffername
(goto-char (point-max))
(save-excursion
(insert string))
(let ((timstr (format-time-string "%Y/%m/%d %H:%M:%S|" (current-time))))
(while (re-search-forward "^" (point-max) t)
(replace-match timstr)))
(goto-char (point-max)))))
(defun serial-monitor-start (port)
"Start Serial Monitor."
(interactive "sPort No=")
(let* ((proc-name (format "Serial-Monitor-%s" port))
(proc (make-serial-process :name proc-name
:port port
:speed 115200
:bytesize 8
:parity nil ;;'even
:stopbits 1
:flowcontrol nil
:filter #'serial-monitor-filter))
(buff (get-buffer-create (process-name proc))))
(display-buffer buff)
(set-process-buffer proc buff)
(with-current-buffer (process-buffer proc)
(serial-monitor-mode)
(make-local-variable 'serial-monitor-process)
(setf serial-monitor-process proc))))
(provide 'serial-monitor-mode)
M-x serial-monitor-start [ENTER] で起動。
ポート名を聞かれるので入力すればシリアルポートからデータをモニターするモードに切り替わります。
※Unixだと/dev/ttyS0とか。WindowsだとCOM1とか。
シリアルポート側へ文字列を送りたい場合は[ENTER]キーかマウスの中ボタンを押せば、文字列を入力できます。
シリアルポートの設定はいちいち入力するのが面倒なのでハードコードしています。
かなり手抜きですが(´・ω・)