2017-11-15 33 views
0

시리얼 라인 주변 장치의 파일 설명자인 새 소스를 g_main_loop에 추가하려고합니다.직렬 링크에서 읽으려고 대기중인 데이터에 대한 알림

는이 코드를보십시오

GError* error; 
GIOChannel* channel; 
channel=g_io_channel_unix_new(fd_serial_line_dev); 
g_io_add_watch(channel, G_IO_IN, cb_1, NULL); 
g_io_channel_set_close_on_unref(channel, TRUE); 
g_io_channel_set_encoding(channel, NULL, &error); 
g_io_channel_set_buffered(channel, FALSE); 

콜백은 다음

gboolean cb_1 (GIOChannel *source, GIOCondition condition, gpointer data) 
{ 
    gchar** line=NULL; 
    GIOStatus status; 
    GError* error; 

    printf("cb\n"); 

    status=g_io_channel_read_line(source, line, NULL, NULL, &error); 

    if(G_IO_STATUS_NORMAL == status) 
    { 
    printf("callback : data : %s\n", *line); 
    g_free(*line); 
    //g_io_channel_seek_position(source, 0, G_SEEK_CUR, NULL); 
    } 

    return TRUE; 
} 

I 직렬 회선에 데이터를 송신

, 난 cb_1마다 호출 무한 루프를 얻었다.

내 실수 어디가 표시되지 않습니다, 나는 시리얼 라인의 파일 기술자 내에서 읽기가 ... 다음 g 주요 루프 반복 동안 콜백에 전화를 중지

+0

채널을 닫으려면 오류가 발생하면 false를 반환해야합니다. – TheAschr

+0

나는 새로운 Caracter가 들어오고 있어도이 솔루션 콜백을 호출하지 않을 것이다. 나를 위해, FALSE를 반환하면 이벤트 소스를 제거해야하는 경우에 유용합니다. –

답변

1

에() g_source_remove를 호출하는 경우, 입심의 g_io_add_watch 방법은 폴링 파일 기술자를 추가합니다()./dev 파일에 대한 폴링은 소켓 설명자 또는 일반 파일과 다릅니다. 운전자가 폴 동작을 지원하는지 여부를 알기 위해 드라이버의 struct fops 구조체를 점검하십시오. 보통 사용자 정의 드라이버를 사용하지 않는 한 지원을 제공합니다. 또한 다른/dev 파일과 코드를 교차 검사하십시오.

콜백에서 g_io_channel_read_line에서 반환 된 상태가 G_IO_STATUS_AGAIN인지 여부는 리소스를 일시적으로 사용할 수 없음을 의미합니다. 따라서 이벤트는 파일 설명자에서 발생했지만 드라이버 버퍼에서 읽을 수있는 즉시 데이터는 없습니다.

1

시도를 suffisant 될 것으로 예상 g_io_add_watch 다음에 g_io_channel_unref(channel) immediatley를 추가하십시오. 그런 다음 콜백

if(G_IO_STATUS_EOF == status) 
return FALSE; 

g_io_channel를 추가 _ * _ 새() 하나의 참조 횟수와 GIOChannel 개체를 반환합니다. g_io_add_watch()는 참조 카운트를 더 추가합니다.이 값을 1 씩 감소 시키면 콜백 이 연결 해제되고 콜백 이 콜백을 반환 할 때 관련 GSource 객체가 제거됩니다.이 콜백은 파일 끝을 감지 할 때 수행해야합니다. 당신이 g_io_add_watch()의 반환 값 리눅스에