|
我将例程中的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;
} |
|