| 
 | 
 
我将例程中的buttons 和 serial_test还有ledplayer三个函数组合到了一起,目的是按一个键,对应的led输出指示,同时在串口1打印一些信息,从串口3进行信息输入,并打印到串口1上,我是就着原来的button程序改的,启动的时候先加载了irq。ko的内核模块,现在的问题是我从串口3进行输入后不能立即在串口1上显示,必须是按了按键之后才会显示串口3输入的内容,但是我是把显示程序放在for(;;)循环下面的,按照我的理解应该是串口3一有输入串口1就应该能显示的啊,下面贴出了我的主程序,求各位大侠不吝赐教 
int main(void) 
{ 
        int i; 
        int buttons_fd; 
        char key_value[4]; 
        unsigned led_bitmap; 
        char first = 1; 
char buff[512]; 
int nread; 
        char buff2[] = "hello,TQ2440!\n"; 
/* ----------------------------------------------------------------*/ 
        int led_control_pipe; 
        int null_writer_fd; // for read endpoint not blocking when control process exit 
 
        led_fd = open("/dev/GPIO-Control", 0); 
        if (led_fd < 0) { 
                perror("open device leds"); 
                exit(1); 
        } 
        unlink("/tmp/led-control"); 
        mkfifo("/tmp/led-control", 0666); 
 
        led_control_pipe = open("/tmp/led-control", O_RDONLY | O_NONBLOCK); 
        if (led_control_pipe < 0) { 
                perror("open control pipe for read"); 
                exit(1); 
        } 
        null_writer_fd = open("/tmp/led-control", O_WRONLY | O_NONBLOCK); 
        if (null_writer_fd < 0) { 
                perror("open control pipe for write"); 
                exit(1); 
        } 
 
/* ----------------------------------------------------------------*/ 
 
        /*打开键盘设备文件*/ 
        buttons_fd = open("/dev/IRQ-Test", 0); 
        if (buttons_fd < 0) 
        { 
                perror("open device buttons"); 
                exit(1); 
        } 
serial_init(); 
        for (;;) 
        { 
                char key_value_temp[4]; 
                int ret; 
 
if((nread = read(serial_fd,buff,512))>0) 
{  
  buff[nread] = '\0'; 
  printf("\nrecv:%d\n",nread); 
  printf("%s",buff); 
  printf("\n"); 
 
} 
 
 
                /*开始读取键盘驱动发出的数据,注意key_value和键盘驱动中定义为一致的类型*/ 
                ret = read(buttons_fd, key_value_temp, sizeof(key_value_temp)); 
                if (ret != sizeof(key_value_temp)) 
                { 
                        perror("read buttons:"); 
                        exit(1); 
                } 
 
                /*打印键值*/ 
                for (i = 0; i < sizeof(key_value); i ++) 
                { 
                        if(key_value[i] != key_value_temp[i]) 
                        { 
                                key_value[i] = key_value_temp[i]; 
                                printf("K%d is %s%s", i+1, key_value[i] == '0' ? "up" : "down", first ? ", " : ""); 
                                 /*   serial  */ 
                                write(serial_fd,buff2,sizeof(buff2)); 
                                 /*   serial  */ 
                                led_bitmap= 1 << i; 
                                for (i = 0; i < 8; i++) 
                                { 
                                        ioctl(led_fd, led_bitmap & 1, i); 
                                        led_bitmap >>= 1; 
                                } 
                        } 
                } 
                first = 0; 
                if(first == 0) 
                        printf("\n"); 
        } 
 
        /*关闭设备文件句柄*/ 
        close(buttons_fd); 
        close(led_fd); 
        close(serial_fd); 
        return 0; 
} |   
 
 
 
 |