##Arduino UNOのUSB2UART最高速度は115200bps ??
各場所を調べてもArduinoのUART最高速度は115200で、それ以上は保証しないと書かれています。
しかし、私が試している限りでは921600bpsを設定しても普通に通信ができています。
下記サイトを見ると、500000bpsで通信速度自体は頭打ちとのオシロ上での測定結果もあります。
https://arduino.stackexchange.com/questions/296/how-high-of-a-baud-rate-can-i-go-without-errors
Arduino UNO USB2UARTで実際にはどれくらいのスピードで通信できるか測定してみます。
###Arduino UNO部品レベルの限界値
ここでArduinoは Arduino UNO R3(Revision3)前提となります。
外付けOSCとATmega328P、USB2UART ICの設定を見てみます。
回路図は下記よりダウンロードできます。
https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf
ATmega328Pがメインマイコンとなります。
メインクロックは16MHzの水晶が搭載されています。
この関係から、ATmega328Pに接続されるUARTは Max 2Mbpsまで可能だと思われます。
FTDIのUSB2UARTチップを外付けで使えばこのスピードで通信が可能となります。
Arduinoの場合USB通信(Virtual Com Port)用に ATmega16U2が搭載されています。
このマイコンがUART⇔USB変換と、FW書き込みを担っていると思われます。
メインクロックは16MHzの水晶が搭載されています。
こちらのUART通信最高速度は2Mbpsです。ATmega328PとATmega16U2がUART接続されているため、
システム全体では2Mbpsが最高速度となっていると思われます。
###通信時間確認プログラムを作る
この通信速度を計測するプログラムを作成してみます。
1byteを相互に通信しあうプログラム
それぞれに対して100kbyte送信するまでの時間を測定します。
100kbyte * 2(送受信) * 8(bit) / 秒数 = ??? bps
Arduino側送受信
#include <Wire.h>
#define BAUDRATE 500000
char buffer[0x10];
void setup() {
Wire.begin();
Serial.begin(BAUDRATE);
}
void loop() {
if (Serial.available() > 0) {
buffer[0] = Serial.read();
Serial.write('!');
}
}
PC側送受信 (Python)
import sys
import serial
import time
from StopWatch import *
datasize = 1024*100
if __name__ == "__main__":
print("Arduino USB Speed Test")
sw1 = StopWatch("No1")
ser = serial.Serial()
ser.baudrate = 500000
com_str = 'COM3'
ser.port = com_str
ser.open()
time.sleep(2)
print("start")
sw1.start()
for i in range(datasize):
ser.write(str.encode("!"))
data = ser.read(1)
print(sw1.name + ":" + str(sw1.stop()))
print("finesh")
測定結果
209.718秒
計算してみると、1024*100 * 2 * 8 / 209.718 = 7812bps
50000bpsを設定しているのになかなかの遅さです。
他のボーレートでも通信速度確認してみる。
115200bpsを設定してみても、計測結果は209.7144秒とほぼ一緒。
57600bpsを設定すると、419.4265秒とほぼ倍。 約3906bps
という事で、Web情報通りにArduinoは115200bpsがUSB-UART接続を使った場合の最大速度だと思われます。
Virtual COM Port Driverは2Mbps設定可能で、実際通信ができます。
ただ、どこかの通信経路がボトルネックとなるか、別途調べてみたいと思います。