諸事情あってarduinoのシリアル通信のbufferを増やす必要があったので、今後のためにメモっておきます。
僕はmacなのでwindowsのことはよくわからないのですが、参考にしたサイトはwindowsの話なのでどちらの方でも参考になるのではないかと思います。
はじめに
実行環境
mac OSX Yosemite
Arduino 1.6.3
Arduino Uno R3
免責事項
無闇に256byteにするのはそもそも良いことではないはずなので、この記事に従った変更を加えて何らかの不具合が生じても責任を追うことは出来ません。ご了承ください。
必要になった経緯
今回僕はarduinoとXBee WifiでGETリクエストを投げて返ってきたものを処理する必要があったのですが、返ってきたものをSerial.print()
してみると
HTTP/1.1 200 OK
Date: Thu, 24 Dec 2015 18:49:18 GMT
Server: A
と途中で終わってしまっていることがわかりました。
この原因が分からずハマっていたのですが、文字数を数えてみると(HTTPのため改行を\r\n
と数えると)63文字であったので、なんか2^6-1
だなあということで気づいた次第です。
今回は文字列を短くするためにサーバーでtext/plain
をresponseするようにしていたのですが、それにしてもheaderだけで
HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
Content-Length: 4
X-Content-Type-Options: nosniff
Connection: keep-alive
Server: thin
で149文字あるので、arduinoのシリアル通信のバッファ64byteではとてもbodyを取得することは出来ません。
従って、バッファをどうにかして増やせないかと考えることにしました。
(ちなみにArduino 日本語リファレンス では128byteとなっていますが、多分間違いなんじゃないかと思います。
僕の勘違いだったらご指摘ください)
やったこと
ググったら出てきたサイトの手順に従います。
Arduino Serial Port Buffer Size Mod にあるとおり、arduinoのcoreを弄り、新たなboardとして登録します。
ただし、macではC:\Program Files\arduino-1.0.1\hardware\arduino\cores\arduino
ではなく、/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores
にありました。
ここにある/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino
を複製して /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino_256_serialbuf
とします。
そして、bufferサイズを定義していると思われる二箇所を変更します。
ひとつ目はarduino_256_serialbuf/HardwareSerial.h
の42,43行目を
//#define SERIAL_TX_BUFFER_SIZE 64
//#define SERIAL_RX_BUFFER_SIZE 64
#define SERIAL_TX_BUFFER_SIZE 256
#define SERIAL_RX_BUFFER_SIZE 256
と変更します。
もう一つは、arduino_256_serialbuf/USBAPI.h
の65行目を
// #define SERIAL_BUFFER_SIZE 64
#define SERIAL_BUFFER_SIZE 256
と変更します。
さらに、上記のサイトに習い、このboard情報を登録します。
macの場合は/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/board.txt
を編集することになります。
僕はArduino UnoとArduino Duemilanove or Diecimilaについての設定のあいだに、以下のように挿入しました。
.
.
uno.build.core=arduino
uno.build.variant=standard
##############################################################
uno256.name=Arduino Uno (256 Serial Buffer)
uno256.upload.protocol=arduino
uno256.upload.maximum_size=32256
uno256.upload.speed=115200
uno256.upload.tool=arduino:avrdude
uno256.bootloader.low_fuses=0xff
uno256.bootloader.high_fuses=0xde
uno256.bootloader.extended_fuses=0x05
uno256.bootloader.path=optiboot
uno256.bootloader.file=optiboot_atmega328.hex
uno256.bootloader.unlock_bits=0x3F
uno256.bootloader.lock_bits=0x0F
uno256.build.mcu=atmega328p
uno256.build.f_cpu=16000000L
uno256.build.core=arduino_256_serialbuf
uno256.build.variant=standard
##############################################################
diecimila.name=Arduino Duemilanove or Diecimila
.
.
上記のサイトでの例に加え、uno256.upload.tool=arduino:avrdude
という行を追加しています。これがないと、Arduinoアプリで書き込もうとした時に
Error while uploading: missing 'upload.tool' configuration parameter
というエラーが出てしまうようです。
参考:Arduino Hardware Cores migration guide from 1.0 to 1.6 · arduino/Arduino Wiki
僕は以上の変更を加えた結果、レスポンスを1文字ずつSerial.print()
すると
HTTP/1.1 200 OK
Date: Thu, 24 Dec 2015 18:49:18 GMT
Server: Apache
X-Content-Type-Options: nosniff
Content-Length: 4
Status: 200 OK
Content-Type: text/plain;charset=utf-8
hoge
と正しく表示されるようになりました。
おわりに
Xbee Wifi+ArduinoでGET/POSTする方法についてはXBee Wi-FiでセンサーデータをAWSにアップロードする - Qiitaを大いに参考にさせていただきました。
この記事もどなたかの参考になれば幸いです。