arduinoのbufferを64byteから256byteに増やす

諸事情あって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 日本語リファレンス](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3214) では128byteとなっていますが、多分間違いなんじゃないかと思います。
僕の勘違いだったらご指摘ください)

## やったこと
ググったら出てきたサイトの手順に従います。

[Arduino Serial Port Buffer Size Mod](http://www.hobbytronics.co.uk/arduino-serial-buffer-size) にあるとおり、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行目を

```cpp:arduino_256_serialbuf/HardwareSerial.h
//#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行目を

```cpp:arduino_256_serialbuf/USBAPI.h
// #define SERIAL_BUFFER_SIZE 64
#define SERIAL_BUFFER_SIZE 256
```

と変更します。

さらに、[上記のサイト](http://www.hobbytronics.co.uk/arduino-serial-buffer-size)に習い、このboard情報を登録します。

macの場合は`/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/board.txt`を編集することになります。

僕はArduino UnoとArduino Duemilanove or Diecimilaについての設定のあいだに、以下のように挿入しました。

```/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/board.txt
.
.
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](https://github.com/arduino/Arduino/wiki/Arduino-Hardware-Cores-migration-guide-from-1.0-to-1.6)

僕は以上の変更を加えた結果、レスポンスを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](http://qiita.com/satzz@github/items/c68abf8fb0743b74e807#_reference-0638cbe4484066b527b7)を大いに参考にさせていただきました。

この記事もどなたかの参考になれば幸いです。