【STA24】SDカードからログファイル超高速アップロードその2<キー入力ゴミBufferクリア必須>

アップロードの基本動作できたのはいいのですが、1回アップロードすると次回がキー入力がうけつけられなくなりました。

●原因
アップロード処理後、マイコン側のシリアル受信バッファに1文字ゴミ’a’が入っている現象でした。
PC側からは、’a’文字を送信する命令は無いので、Teensy、C#のUSB通信での不具合で、予期せぬ1バイトが
バッファに混入していたと考えられます。

 

●対策
当初string型でやりとりしていたのですが、stringだとゴミの発見がしにくいので、すべてchara型で1バイトずつ
管理することで、トラブルを減らしました。入力仕様が2種類しかないので、それにしぼったプログラムにしました。

マイコン側プログラムでシリアル受信開始時に、受信バッファを空にする動作をさせてゴミを捨てます。

//Serial bufferを空にする
int ec=0;
while(Serial.available()>0)
{
  char d=Serial.read();
  ec++;
  Serial2.printf(” SerialBuffer Input Error%d:d=%x,%c\n\r”,ec,d,d);
}

●アップロードプログラム備忘録
①Teensy
https://gist.github.com/dj1711572002/30a7e9006f2afc4c549e7553bb56a9b3

’l’が入ったら、SDディレクトリーのLIPC送る
長いデータが入ったら、PC側がファイル名が送られたと解釈して、ファイルアップロードに入る

 

//———-SD UPDATE TEST—————————–

int i=0;
int clen=0;

char ct=’ ‘;
char flag=’ ‘;
int ec=0;//eror counter
while(true)
{
char c[30]={};
ct=’ ‘;
i=0;
//Serial bufferを空にする
while(Serial.available()>0)
{
char d=Serial.read();
ec++;
Serial2.printf(” SerialBuffer Input Error%d:d=%x,%c\n\r”,ec,d,d);
}
while(ct!=0x0d)
{
//Serial2.print(“*”);
if(Serial.available()>0)
{
ct=Serial.read();
if(ct>0x20 && ct<0xFF)
{
c[i]=ct;
}

//cs=c[i];
Serial2.printf(“c[%d]=%x,%c,ct=%c\n\r”,i,c[i],c[i],ct);

i++;
}

//Serial2.println();
delay(100);
}//while 0x0d end
//cの終端に0x20
c[i]=0x20;

clen=i;
int sizec=sizeof(c);
Serial2.printf(“sizeof(c)=%d,i=%d\n\r”,sizec,clen);
for(int n=0;n<clen;n++)
{
Serial2.printf(“===>c[%d]=%x,’%c’,size=%d\n\r”,n,c[n],c[n],clen);
}
delay(100);

if(c[0]==’l’)
{
sdlist();

}

//if(s.indexOf(“bin”)>0 ||s.indexOf(“ubx”) && s.length()>6)
if (clen>6)
{
for(j=0;j<clen;j++)
{
Serial2.printf(“IN>6:c[%d]=%x:%c\n\r”,j,c[j],c[j]);
}
//Serial2.printf(“sc:%s, length=%d fn0.len=%d\n\r”,s,s.length(),sizeof(fn0));
myFileB=sd.open(c,FILE_READ);
int t0=millis();
int count=0;
while(myFileB.available())
{
byte b=myFileB.read();
Serial.write(b);
count++;
}

//Serial2.println(“============================================================================”);
//Serial2.printf(“s>4 %d bytes time=%d msec \n\r”,count,millis()-t0);
//Serial2.println(“============================================================================”);
myFileB.close();
//delay(5000);

}

if(c[0]==’a’)
{
myFileB=sd.open(“3-15-13-36.ubx”,FILE_READ);
//myFileB=sd.open(“12-10-19-1.ubx”,FILE_READ);
int t0=millis();
int count=0;
while(myFileB.available())
{
//sdlist();
byte b=myFileB.read();
Serial.write(b);
//Serial2.print(b,HEX);
count++;
}

//Serial2.println(“============================================================================”);
//Serial2.printf(“a:%d bytes time=%d msec \n\r”,count,millis()-t0);
//Serial2.println(“============================================================================”);
myFileB.close();
//delay(5000);

}

}

 

②C# コンソール アップローダー
https://gist.github.com/dj1711572002/0526df51923c060f9974aff4ace32987

キー入力は readLineで最後に0x0Dが付いたデータとして、マイコンに送って、マイコンは、0x0Dをもってデータの終端と解釈する。

●以後

デスクトップPCでプログラム作っていたので、WIN8タブレットでも所望の速度がでるか確認します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です