exLeafでUARTアクセス

このページでは,exLeafを使ってUART(8bit,パリティなし,ストップビット1)で外部モジュールにアクセスするためのサンプルイメージと使用方法を紹介します.

このサンプルには一つのUARTマスタが含まれていて,J2の0番ポートが送信,J2の2番ポートが受信に割り当てられています.J2の2番ポートはFPGAのI/O機能によりプルアップされています.

ボーレート4800, 9600, 19200, 38400, 115200での送受信に対応します.(デフォルトでは19200)

UDPパケットでexLeafに送った文字列を指定したボーレートで接続先のデバイスに出力する,あるいは,接続先のデバイスのデータをUDPパケットで受け取ることができます.送信/受信は独立に動作しています.UDPからUARTへの出力は最大512バイトまでexLeafにバッファできます,UARTで受け取ったデータは10バイトたまるか,400m秒毎にUDPパケットとしてネットワークに出力されます.

#

リソース

ダウンロードしてexLeafのフラッシュに書き込むことで利用できます.

サンプルはexLeafを購入した方は自由にご利用いただけます.ただし,イーツリーズ・ジャパンは,サンプルの利用による損害に対する責任を負うことはできませんのでご注意ください.exLeafの詳細はこちらをご覧ください.

ネットワークパラメタ

  • IPアドレス 10.0.0.134 (後述の方法によって動作時に変更可能)
  • ネットマスク 255.0.0.0 (後述の方法によって動作時に変更可能)
  • デフォルトゲートウェイ 10.0.0.1 (後述の方法によって動作時に変更可能)
  • 待ち受けポート 16384番
  • MACアドレス 00-1B-1A-EE-00-D6

操作方法

コマンド(2Byte)+引数を送ることでパラメタの設定あるいはデータの送信ができます.exLeafが出力するパケットも同様にコマンド+引数のフォーマットになっています.

コマンド 引数
"SS" (0x5353)1バイト目: 予約
2バイト目: 下位4bitで通信レートを設定.0:4800, 1:9600, 2:19200, 3:38400, 4:115200
"CC" (0x4343)1〜4バイト目: UARTで入力された値の送信先アドレス
5〜6バイト目: UARTで入力された値の送信先ポート番号
"DD" (0x4444)1〜511バイト目: UARTで送出したいデータ
"dd" (0x6464)1〜: exLeafがUARTで受信したデータ

たとえば,通信レートを115200に設定して,"Hello, World"という文字列を送信したい場合は↓のようなRubyスクリプトで操作できます.

#!/usr/bin/ruby
require "socket"
udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(16384, "10.0.0.134")

# rate 0x0000=4800, 0x0001=9600, 0x0002=19200, 0x0003=38400, 0x0004=115200
msg = "SS" + [0x00, 0x04].pack('C*') # 通信レートをセットするコマンド
p msg
udp.send(msg, 0, sockaddr)

msg = "DD"
msg = msg + "Hello, World\n" # データは,"DD"の後に続けて送る
p msg
udp.send(msg, 0, sockaddr)

udp.close

exLeafのUART出力をUSB-UART変換モジュールなどを介してPCに接続するとターミナルソフト(たとえばTeraTermなど)にHello, Worldという文字列が出力されることが確認できます.

同様に受信する場合には,↓のようなRubyスクリプトで操作できます.

#!/usr/bin/ruby
require "socket"
udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(16384, "10.0.0.134")

# 自分(10.0.0.1)の16384ポートに受信したUARTデータを送るように設定
msg = "CC" + [0x0a, 0x00, 0x00, 0x01, 0x40, 0x00].pack('C*')
udp.send(msg, 0, sockaddr)
udp.close

# メッセージ受信ボディ
udp = UDPSocket.open();
udp.bind("0.0.0.0", 16384)
while true
  rcv = udp.recv(2048)
  print(rcv[2..-1]) # 先頭の"dd"以下を表示する
end
udp.close # ここには到達しないけど.

exLeafにUSB-UART変換モジュールでPCを接続していれば,ターミナルで入力した文字列がUDPパケットとして届けられ,表示されます.

ネットワークパラメタを変更する

サンプルは,IPアドレス,ネットマスク,デフォルトゲートウェイを動作中に書き換えることができます.ただし,設定値はFPGA内のレジスタに格納されるだけですので,電源再投入時には,デフォルトのパラメタに戻ります.

変更するには,IPアドレス,ネットマスク,デフォルトゲートウェイをペイロードとするUDPパケットを16385番ポートに送信してください.

たとえば,

#!/usr/bin/ruby
require "socket"
udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(16385, "10.0.0.134")
d = [0xc0, 0xa8, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00, 0xc0, 0xa8, 0x00, 0x01]
msg = d.pack('C*')
udp.send(msg, 0, sockaddr)
udp.close

というパケットを送信すれば,ノードのIPアドレス,ネットマスク,デフォルトゲートウェイを192.168.0.2, 255.255.255.0,192.168.0.1にセットすることができます.