2019年12月18日水曜日

Uart通信のデータ抜けの問題

こんにちは

linuxアプリ作成における注意点が見つかったのでメモします。

Uart通信のデータ抜けの話です。

---

linuxアプリケーション内で、UART通信の処理を行っているのですが、

対抗機からデータを受信し続けていると、データが抜けてしまうことがありました。

色々調べてみたところ、/dev/ttySxをopen、closeを何度も行っていると

現象が発生するようです。

デバッグして最終的に、

staticでファイルディスクリプタを保持してからは、

closeしないようにしたところ、データの抜けは発生しなくなりました。

現象から考えると、closeってことは、通信自体マスクされているってことなのか。。

以下、必要なところだけ載せます。

#include <termios.h>

#define SERIAL_PORT "/dev/ttyS0"

#define BAUDRATE    B9600


static int Serial_Port_Fd= 0;


void main(void)

{

    unsigned long length;

    char buff[0x1000];

    unsigned long maxsize;

    int rtc= 0;

   

    Init();

   

    while(1)

    {

        rtc= UART_Receive(&length, buff, sizeof(buff));

    }

}


int Init( void )

{

    struct termios tio;

    int ret;

    int size;

    // バッファ関連クリア

    memset(&tio, 0, sizeof(tio));

    Serial_Port_Fd= open(SERIAL_PORT, O_RDWR| O_NOCTTY);

  ・・・

    return NORMALEND;

}



int UART_Receive(ULONG *length_p, BYTE *data_p, ULONG maxsize)

{

    int i;

    int len;

   

    while(1)

    {

       len = read(Serial_Port_Fd, data_p, maxsize);

        if (0 < len) {

            for(i = 0; i < len; i++) {

                printf("%02X ",*(data_p+ i));

            }

            printf("len: %d \n",len);

            printf("\n");

            break;

        }

    }

    *length_p= len;

    return 0;

}



0 件のコメント:

コメントを投稿