天嵌 ARM开发社区

 找回密码
 注册
查看: 2368|回复: 3

修改了例程中的按键和串口收发程序,但是结果跟想象的不一样,求教

[复制链接]
0backspace0 发表于 2011-1-8 09:45:47 | 显示全部楼层 |阅读模式
我将例程中的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;
}
天嵌_support1 发表于 2011-1-10 13:52:04 | 显示全部楼层
1# 0backspace0


从你的描述看,
你只要去该一下LED的驱动就可以了的。
而串口输入被你的程序捕获,就在你的应用程序中执行就是了。
怎么组合得复杂模式了呢。
shabby 发表于 2011-1-26 14:48:20 | 显示全部楼层
我懂你的意思了,按键驱动是阻塞的,因此必须等你按下按键之后才会执行下面的,不然就挂起了
jackshen 发表于 2011-12-17 09:55:42 | 显示全部楼层
我学学!谢谢各位.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 22:32 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表