目次
どうやら\0、NULL文字を入れ忘れたせいらしい。
NULL文字まで出力してくれるというのが、PutStringらしい。
100バイト同時もOKだったが、
1000バイト書き込むと、どうやらエコーも256バイトまでのようだ。
CRも含めて256バイト
なので、文字列は、最大255バイトまでなら送ってもいいようだ。
UART_SDCARD_CmdReset();を入れただけでは、
解決しないようだ。
// Echo off.
UART_SDCARD_PutString(SDcmd[SD_E0]);
UART_SDCARD_PutChar(CR);
while(1){
//Menu Select
SW = UART_PC_cGetChar();
switch(SW){
case 49: //1
UART_SDCARD_PutString(SDcmd[SD_E0]);
UART_SDCARD_PutChar(CR);
Receive_func();
break;
エコーオフの>がRXバッファに残る
��iを送信後、Receive_func();で読み取るが、エコーオフの>を読み取り終了
結局、iで返ってきた情報が読めず。。
��iのコマンドの最後だけ、>だけがまた残る(Rxバッファはおそらく1バイトなので)
�´△侶�り返し
おそらくこんなことが起こっていたのだろう。。(汗
秋田先生に報告したら、
バッファオーバーランエラーのフラグを見てやればよかったね、とのこと。
たしかにそうだ。RxState()で状況を判断すれば、もう少し早く問題を
解決できたかもしれない。
今後の参考にしよう。
結局、今回の場合は、意外なところで>が返ってきていたので、
気づかなかったわけである。
だから、ピンを立てて、直接返ってきている信号を見てやれば、解決しそうだ。
あくのりっちが突然固まる。
次に再起動しても、2ポートにCP2102を使えないっぽい。
UART_PC_CPutString("test3!!\r\n");
//Receive Prompt
while ( !( RxState =UART_SDCARD_bReadRxStatus() & UART_SDCARD_RX_COMPLETE )){}
if( RxState == UART_SDCARD_RX_COMPLETE){
//Start Receive
Receive_Prompt = UART_SDCARD_cGetChar();
if(Receive_Prompt == 0x3e){
UART_PC_CPutString("Prompt >");
このプログラムの一行目をコメントアウトすると、
”>”が受け取れなくなった。どうやらCPutStringしているところをコメントアウトすると、
エコーをcGetCharで受信してしまうようだ。
エコーはオフにしておいた方がよさそうだ。
プロンプトまでか、100バイトまでを読み込んだ後にCPutStringで出力していたが、
これだと100バイト分出力されてしまうので、おかしくなる。
CWriteで指定バイト分だけ出力した方がよさそうだ。
char Receive_Data[100];
UART_PC_PutString(Receive_Data);
while ( !( UART_PC_bReadRxStatus() & UART_PC_RX_COMPLETE )){}
while(1){
if( (Receive_Data = UART_PC_cGetChar()) != 0x3e ){ // ">" de nainara
UART_PC_PutChar(Receive_Data);
}else{
break;
}
}
while ( !( UART_PC_bReadRxStatus() & UART_PC_RX_COMPLETE )){}
は、cGetCharではいらないっぽい。
よく考えてみれば、cGetCharは、受信するまで待ってくれる
UART_PC_IntCntl(UART_PC_ENABLE_RX_INT); // Enable RX interrupts
UART_PC_IntCntl(UART_PC_DISABLE_RX_INT);
を明示してやれば、受信割り込みの許可・不許可の切替可能
こうすれば、前の受信割り込みの問題を解決できるかもしれない。
今更ながら、もう一度PSoCのUART通信について、試してみようと思う。
自分への備忘録。
3eである“>”を受信するまで、繰り返しcGetCharで取り込むというプログラム。
char Receive_Data;
while((Receive_Data = UART_PC_cGetChar()) != 0x3e ){ // ">" de nainara
UART_PC_PutChar(Receive_Data);
}
しばらく動かなかったが、どうやら原因は、
UART_PC_IntCntl(UART_PC_ENABLE_RX_INT); // Enable RX interrupts
が入っていたためらしい。
前に先生に聞いたことあったのに、忘れていた。。(汗
cGetChar自体はRXの割り込みを使っていないので、コメントアウトしないといけないみたい。
ということは、szGetParamとかと一緒に使う時には、
その都度切替が必要なのかな。
UART通信のサンプルプログラムは、
コマンドを入力して、コマンドとパラメータを分離するようなプログラム。
これを普通の文字列を取り込むプログラムにしておきたい。
char *strPtr;
UART_PC_CPutString("\r\nWelcome to PSoC UART test program. V1.1 \r\n");
while(1){
if(UART_PC_bCmdCheck()){
while(strPtr = UART_PC_szGetParam()) { // loop on each parameter
UART_PC_CPutString(" <");
UART_PC_PutString(strPtr); // Print each parameter
UART_PC_CPutString(">\r\n");
}
}
UART_PC_CmdReset(); // Reset command buffer
}
これが何故かうまく動かない。。
ほとんどサンプルと同じなんだけどな、、
ちょっとプログラム変えたら、意味不明なエラーが大量に出てきた。
単純なミスだけど、すごく発見しづらい。。
PSoCのエディタは、見づらいので、他のエディタで作成するというのも
ありかもしれない。
今年の情報共有方法は、Wikiにすることにしました。
MeRLWikiで使い慣れているということもあるし。
どこまで浸透するかな〜〜