Arduino UNO のシリアル転送速度をテストしています。私の要件では、ホスト PC から Arduino に 3KB/s を転送する必要があります。私は非常に単純なプログラムを作成しました。これは、結果を返信Serial.available()
し、Arduino IDE のシリアル モニターでテストします。最大の 63 バイトに達するまで、文字の送信を開始しました。Arduinoには128バイトのシリアルバッファがあるとどこかで読んだので、これにはかなり驚きました。
とにかく、私はデータを 48 バイトのパケット (実際にはヘッダー文字のために 49 バイト) で送信する非常に単純なプロトコルを作成しました。ホストはd
文字を送信し、次に 48 バイトのデータを送信します。送信の有効性をテストするために、Arduino側で検証される0から47までの単純なバイトシーケンスを送信しています。検証に失敗すると、UNO は PIN13 のオンボード LED を点滅させ始めます。バイトが送信されると、ホストは単純なk
文字である確認を待ちます。実際のパケットの処理が完了すると、Arduino はこれを送信します。
ホスト プログラムは、送信されたパケットの数を測定し、1 秒後に表示します。9600 のボー レートで、PC は 1 秒あたり約 16 パケット (約 800 バイト/秒) を正常に送信します。これはまったく問題ありません。両側のボーレートを 57600 に上げて、これを改善しようとしました。ただし、送信されるパケットの数は少ししか増加しません。何が問題なのかわからない。USBシリアルコンバーターの限界に達したのでしょうか?
これが私のコードです。
PC (Java、シリアルポート通信にjSSCを使用しています)
package hu.inagy.tapduino.server;
import jssc.SerialPort;
import jssc.SerialPortException;
/**
* Test Arduino communication.
*/
public class App
{
private static void testComm(SerialPort port) throws SerialPortException {
long runningSeconds = 0;
long time = System.currentTimeMillis();
long numberOfPackets = 0;
boolean packetSent = false;
while (runningSeconds < 10) {
long currentTime = System.currentTimeMillis();
if (currentTime - time > 1000) {
runningSeconds++;
time = currentTime;
System.out.println(numberOfPackets + " packets/s");
numberOfPackets = 0;
}
if (!packetSent) {
packetSent = true;
port.writeByte((byte) 'd');
for (int i = 0; i < 48; i++) {
port.writeByte((byte) i);
}
} else {
byte[] received = port.readBytes();
if (received != null) {
if (received.length > 1) {
throw new IllegalStateException("One byte expected, instead got: " + received.length);
}
char cmd = (char) received[0];
if ('k' != cmd) {
throw new IllegalStateException("Expected response 'k', instead got: " + cmd);
}
packetSent = false;
numberOfPackets++;
}
}
}
}
public static void main(String[] args)
{
SerialPort port = new SerialPort("COM7");
try {
if (!port.openPort()) {
throw new IllegalStateException("Failed to open port.");
}
port.setParams(57600, 8, 1, 0);
} catch (SerialPortException e) {
throw new IllegalStateException("Exception while setting up port.", e);
}
try {
// Wait 1.5sec for Arduino to boot successfully.
Thread.sleep(1500);
} catch (InterruptedException e) {
throw new IllegalStateException("Interrupt while waiting?", e);
}
try {
testComm(port);
} catch (SerialPortException exc) {
throw new IllegalStateException("Failure while testing communication.", exc);
} finally {
try {
if (!port.closePort()) {
throw new IllegalStateException("Failed to close port.");
}
} catch (SerialPortException e) {
throw new IllegalStateException("Exception while closing port.", e);
}
}
}
}
アルドゥイーノ
void setup() {
pinMode(13, OUTPUT);
Serial.begin(57600);
}
boolean error = false;
void loop() {
if (error) {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
} else {
while (Serial.available()<49);
char cmd = Serial.read();
if ('d'!=cmd) {
error=true;
return;
}
for (int i=0; i<48; i++) {
int r = Serial.read();
if (r!=i) {
error=true;
return;
}
}
Serial.write('k');
}
}