직렬 통신picocom 원본 분석

2847 단어 c 언어
직렬 통신picocom 원본 분석
1. Main 입구 분석
picocom.c 파일은main 포털 파일로 다른 프로그램과 마찬가지로 초기화됩니다.
int
main (int argc, char *argv[])
{
....
parse_args(argc, argv);//    
establish_signal_handlers();//      
r = term_lib_init();//terminal    
...
//     
log_fd = open(opts.log_filename,
                  O_CREAT | O_RDWR | O_APPEND,
                  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
...
//                       
tty_fd = open(opts.port, O_RDWR | O_NONBLOCK | O_NOCTTY);                  
//            
term_set(...)

/******          2 set_dtr_rt();-----------    *****/
/* Set DTR and RTS status, as quickly as possible after opening
   the serial port (i.e. before configuring it) */
set_dtr_rts();
r = term_apply(tty_fd, 0);
if ( r < 0 )
    fatal("failed to config port: %s",
          term_strerror(term_errno, errno));
/* Set DTR and RTS status *again* after configuring the port. On
   some systems term_apply() resets the status of DTR and / or
   RTS */
set_dtr_rts();

/***    ------          ,           --------    ***/
if ( !opts.quiet && !opts.noinit && show_status(1) != 0 )
...    

/*******    ---------     ------------    ******/
ler = loop();

주 처리 함수 loop()
select를 통해 파일 부호집 (rdset, wrset), 매개 변수opts.exit_after가 차단 시간을 설정할 지 여부입니다.memmove와memcpy의 용법 차이에 주의하십시오.
while ( ! sig_exit ) {
....
r = select(tty_fd + 1, &rdset, &wrset, NULL, ptv);
...
n = read(STI, buff_rd, sizeof(buff_rd));//   STI, terminal,       
...
n = read(tty_fd, &buff_rd, sizeof(buff_rd));//     ,      
...
n = write(tty_fd, tty_q.buff, sz);//  tty_q.buff,  STI       ,     
...
}

STI 분석 읽기
다음 코드에서 ttyq_push 함수는 사용자가 STI에 있는 모든 문자를 분석하고 enter\삭제 키 등을 처리합니다.tty_q_push 모든 문자를tty 에 저장합니다q.buff 중,
          for ( i = 0; i < n; i++ ) {
            c = buff_rd[i];
            switch (state) {
            case ST_COMMAND:
                if ( c == opts.escape ) {
                    /* pass the escape character down */
                    if ( tty_q_push((char *)&c, 1) != 1 )
                        fd_printf(STO, "\x07");
                } else {
                    /* process command key */
                    if ( do_command(c) )
                        /* picocom exit */
                        return LE_CMD;
                }
                state = ST_TRANSPARENT;
                break;
            case ST_TRANSPARENT:
                if ( ! opts.noescape && c == opts.escape )
                    state = ST_COMMAND;
                else
                    if ( tty_q_push((char *)&c, 1) != 1 )
                        fd_printf(STO, "\x07");
                break;
            default:
                assert(0);
                break;
            }
        }

좋은 웹페이지 즐겨찾기