Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

代码发送字节受限制问题

[复制链接]
怪侠封沉 发表于 2014-12-3 19:50:58 | 显示全部楼层 |阅读模式
本帖最后由 怪侠封沉 于 2014-12-3 19:52 编辑
  1. 粘贴的以下代码,发帖的时候代码受限制,最多大约不能超过100行,超过就发不了,直接出现报错界面。但是文字其他的都不会受限制,想请大家帮帮忙解决一下。感激不尽。
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 楼主| 怪侠封沉 发表于 2014-12-3 19:52:49 | 显示全部楼层
驱动代码:


/*
*目的:我们将按键按下或弹起的事件记录
*到一个全局数组中,通过应用层read函数,将数组
*的数据传到上层,静儿上层进一步的判断,从而
*实现更进一步的应用
*/

#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/ioctl.h>
#include <linux/gpio.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/irq.h>

#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/irq.h>


#define DEVICE_NAME "buttons"

int major;//主设备号
int ev_press;//标志是否按下
DECLARE_WAIT_QUEUE_HEAD(buttons_queue);

static volatile char keys_value[] = {'0','0','0','0','0','0','0'};
struct class * buttons_class;
struct buttons_irq_desc
{
        int irq;//中断号
        int pin;//中断引脚
        int num;
        char *name;
};

static struct buttons_irq_desc key_desc[] =
{
        {IRQ_EINT8, S3C2410_GPG(0),0,"key1"},
        {IRQ_EINT11,S3C2410_GPG(3),1,"key2"},
        {IRQ_EINT13,S3C2410_GPG(5),2,"key3"},
        {IRQ_EINT14,S3C2410_GPG(6),3,"key4"},
        {IRQ_EINT15,S3C2410_GPG(7),4,"key5"},
        {IRQ_EINT19,S3C2410_GPG(11),5,"key6"},
};
static irqreturn_t buttons_interrupt(int irq,void * dev_id)
{
        int down;//标志是否按下
        struct buttons_irq_desc *now_desc = (struct buttons_irq_desc *)dev_id;
       
        //当按键按下寄存器的值为0,反之为0
        down = !s3c2410_gpio_getpin(now_desc->pin);
        if(down != (keys_value[now_desc->num]&1))
        {
                keys_value[now_desc->num] = '0'+1;
                ev_press = 1;
                wake_up_interruptible(&buttons_queue);
        }

        return IRQ_RETVAL(IRQ_HANDLED);
       
}
int buttons_open(struct inode* inode,struct file *filp)
{        int i;
        printk("buttons open success\n");
       
        for(i=0; i<6;i++)
                {
                        request_irq(key_desc[i].irq,buttons_interrupt,IRQ_TYPE_EDGE_BOTH,
                                        key_desc[i].name,(void *)&key_desc[i]);
                }
        return 0;
}
int buttons_release(struct inode *inode,struct file *filp)
{
        int i;
        printk("buttons release ok \n");
        for(i=0;i < 6;i++)
        {
                free_irq(key_desc[i].irq,(void *)&key_desc[i]);
        }
        return 0;
}

int buttons_read(struct file *filp,char __user *buff,
                                        size_t count,loff_t *offp)
{
        int error;
        printk("read is ok\n");
        if(!ev_press)//有没有按下的标志,按下为1,否则为0
        {
                if(filp->f_flags &O_NONBLOCK)//看看是否非阻塞
                        return -EAGAIN;
                else
                {
                        wait_event_interruptible(buttons_queue,ev_press);
                }
        }
        ev_press = 0;
         error = copy_to_user(buff,(const void*)keys_value,count) ;
   memset((void *)keys_value, 0, sizeof(keys_value));
        return error?-EFAULT:count;
}

//file_operations结构体
static const struct file_operations buttons_fops=
{
        .owner = THIS_MODULE,
        .open  = buttons_open,
        .release = buttons_release,
        .read  = buttons_read,
       
};

static int __init buttons_init(void)
{
        major = register_chrdev(0,DEVICE_NAME,&buttons_fops);
        if( major < 0)
                {
                        printk("can't register major\n");
                        return major;
                }
        printk("register major success\n");
        buttons_class = class_create(THIS_MODULE,"buttons");//创建类
        device_create(buttons_class,NULL,MKDEV(major,0),NULL,"buttons");
       
        return 0;
}

static void __exit buttons_exit(void)
{
        unregister_chrdev(major,DEVICE_NAME);
        device_destroy(buttons_class,MKDEV(major,0));
        class_destroy(buttons_class);
}
module_init(buttons_init);
module_exit(buttons_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("suyonggang");


测试代码:
/*
*目的实现,读取key的值
*/
#include <stdio.h>//printf基本函数
#include <stdlib.h>
#include <fcntl.h>//包含open函数等
#include <signal.h>
#include <sys/ioctl.h>



int main(int argc,char **argv)
{
        int fd;
        int i;
        char buffer[6]= {'0','0','0','0','0','0'};
        fd = open("/dev/buttons",O_RDWR);
        if(fd < 0)
        {
                printf("can't open /dev/buttons");
        }
while(1)
{
        read(fd,buffer,6);
        for(i=0;i<6;i++)
        {
                if(buffer[i] == '1')
                        {
                                printf("the key %d was %c\n",i+1,buffer[i]);
                        }

        }

}
        close(fd);
        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-2-25 06:03 , Processed in 0.025590 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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