こんにちは
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 件のコメント:
コメントを投稿