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]キーかマウスの中ボタンを押せば、文字列を入力できます。

シリアルポートの設定はいちいち入力するのが面倒なのでハードコードしています。
かなり手抜きですが(´・ω・)

いいなと思ったら応援しよう!