USB SerialPort(デバッグ用)について

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
int main() {
    //pc.format(8,Serial::Even,1);
    pc.baud(19200);

    while(1) {
        printf("Test");
        wait(1);
    }
}

これでUSBの232cからTestという文字が送信される。

ところで、1箇所不思議な落とし穴があった。 それは

        printf("Test\r\n");

このコードだ。

なぜかCRLF(\r\n)を付けないとすぐにPCに送信されないという現象が起きてしまう。 これは意図してこうしているのか、いないのか。。

試しに

        printf("Test");

こうすると、64byteくらいまとめて送ってくる。

        printf("Test\r");

でも同じ。

どうやら\nを書き込むと送信するらしい。

試しに、次のようなコードを書いてみる。

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
int main() {
  int i = 0;
    //pc.format(8,Serial::Even,1);
    pc.baud(19200);

    while(1) {
        printf("Test");
        wait(1);
        if((i++ % 2) == 1)
        {
            printf("\n");
            i = 0;
        }
    }
}

そうすると2秒に1回 TestTestって送られてくる。

この仕様は痛いよなぁ。バイナリ通信とかうまく行かないんじゃないかなぁ。。。

2012/03/06 追記

昨日は忘れていたがSerialには、putcがあった。 これを使ってみた。

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
const char* msg = "Test"
int main() {
  int i = 0,cidx = 0,clen = 0;
    //pc.format(8,Serial::Even,1);
    pc.baud(19200);
    clen = strlen(msg);

    while(1) {
        
        for(cidx = 0; cidx < clen; cidx++)
        {
             pc.putc(msg[cidx]);
        }
        

        wait(1);
        if((i++ % 2) == 1)
        {
            printf("\n");
            i = 0;
        }
    }
}

そうすると、Testとtest\nが分割して1秒ごとに帰ってくる。 まあ、これでいいか。


2 comments on USB SerialPort(デバッグ用)について:

31 Aug 2012

UNIX由来のシステムではprintfした文字列はバッファされており,'\n'の文字で画面に送られます.
http://www.geocities.co.jp/siliconvalley/6071/technic/49.html

02 Sep 2012

Tedd OKANO wrote:

UNIX由来のシステムではprintfした文字列はバッファされており,'\n'の文字で画面に送られます.
http://www.geocities.co.jp/siliconvalley/6071/technic/49.html

情報ありがとうございます。

実際文字だけを送るわけではなく、文字でも最後にLFを送るわけにも行かないので悩んでいました。

私の勝手なイメージだとembedded系はもっと配慮があるのかなって。

でもmbedがそういう仕様なら仕方ないです。

http://mbed.org/forum/bugs-suggestions/topic/1849/

Please log in to post comments.