63230


spresense SDK(nuttX)にて、ESP8266とシリアル通信する事でwifiに接続しようとしています。  
spresenseとESP8266の間の結線には問題なく、見様見真似でやってみた通信の結果、  
ttyS2(spresense側のUARTポート)に対して送出した"AT"に対して、"OK"と返答が返ってくる事は確認済みです。

見様見真似とは、以下の様なコードです。

[code]

    main()
    {
        fd = open("/dev/ttyS2", O_RDWR);
        if (fd < 0)
        {
             printf("%s open error.\n", "/dev/ttyS2");
        }
    
        write_serial(fd);
        read_serial(fd);
    ...省略
    }
    
[/code]

[code]

    write_serial(int fd)
    {
        char buffer[30];
    
        memset(buffer,0,sizeof(buffer));
        sprintf(buffer,"%s\r\n","AT");
        write(fd,buffer,sizeof(buffer));
    
        printf("[write_serial]wrote = %s\n", buffer);
    }
    
[/code]

[code]

    void read_serial(int fd)
    {
        char buffer[30];
        int len;
    
        len = read(fd,&buffer,16);
        if(len > 0)
        {
            printf("[read_serial]buffer=%s\n", buffer);
        }
        else
        {
            printf("[read_serial]null\n");
        }
    }
    
[/code]

変数定義などは省略しています。

前置きが長くなりましたが、質問は以下3点です。

1.前述の通り、これで"AT\r\n"の固定値送出に対して、"OK"が返ってくるのですが、  
例えばそれを確認する為のread_serialの結果、write_serialにて送出した"AT"まで一緒にreadされてしまいます。  
flush等の操作が必要なのではないかと思っていますが、うまく行かず、"AT"が表示されてしまいます。  
このあたりの作法はLinuxとそう変わらないと考えていますが、  
本来この様にシリアル通信を行う場合、どの様な作法で行うのが正しいのでしょうか？

2.1.と本質的には同じ質問なのですが、特に、この後loop処理の中で定期的に  
別口のUSBシリアル(ttyS0)からの入力もprintfで表示させています。  
この時、read_serial()に対してttyS0のファイルディスクリプタを渡すと、  
何かが入力されるまでread関数から抜けられていない様な動作となっているのですが、  
これを避けて、"もし何か入力された場合のみ表示させ、それ以外の場合はスルー"  
としたい場合は別タスクを作るのが正しいやり方でしょうか？他にやり方があるのでしょうか？

3.理想としては、USBシリアルのコンソール上にて"AT"等のコマンドを入力し、  
Enter押下の時点でttyS0にそのコマンドを送りたいのですが、  
現状では1文字ずつの入力でread_serial()を抜けてしまっています。  
理想の形を実現する為にはどの様な設定(canonical等？)で実装するのが良いのでしょうか?

二度目の質問投稿でして、お見苦しい点や流儀に沿っていない部分がありましたら申し訳ありませんが、ご指摘下さい。  
よろしくお願い致します。


CC BY-SA 4.0
2020-02-20T14:00:55.957
63215
2020-03-04T00:27:07.430
37799
question
linux spresense
nuttX、Linuxでのシリアル通信の作法について


シリアル通信に送った内容を返さないようにする'(エコーを止める)には、"ATE0"コマンドを使います。  
またエコーするように戻すには、"ATE1"コマンドを使います。  
これらはESP8266の機能です。

[ESP8266でATコマンドを使ってみる](https://keijirotanabe.github.io/blog/2017/02/17/esp8266-at-
command-170218/)の記事が参考になると思います。


CC BY-SA 4.0
2020-02-21T05:08:46.950
63230
2020-02-21T05:08:46.950
217
63215
answer


`read_serial()` において、コマンド入力(Enterを押下するまで)を受けるためには下記のような、 `while` ループを実装し `\n`
ないし `\r\n` をreadするまで文字列を蓄積するように変更が必要です。

[code]

    while(1)
    {
      c = read();
    
      if (c == '\n')
        {
          /* 文字列の終端に '\0' を追加する処理を入れます。 */
          break;
        }
    
      /* 文字列にreadしたcを追加する処理をここにいれます */
    }
    
[/code]

基本的に `read()`
は呼ばれたタイミングで保持しているBufferを返すので、コマンド入力などのプログラムを作成するためにはそのような対応が必要になります。


CC BY-SA 4.0
2020-03-04T00:27:07.430
63543
2020-03-04T00:27:07.430
32034
63215
answer