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

More than 3 years have passed since last update.

諸事情あって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行目を


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行目を


arduino_256_serialbuf/USBAPI.h

// #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についての設定のあいだに、以下のように挿入しました。


/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

僕は以上の変更を加えた結果、レスポンスを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を大いに参考にさせていただきました。

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