基于arm11处理器S3C6410内核的linux下串口通信实现

时间:2022-11-23 20:39:24

                                                                                     基于arm的linux串口通信与独立按键的实验

最近正好在学习基于ARM的linux下串口通信,现将学习经验与大家共享。以本人刚刚做的例程来一步步讲解。

/*例程目的:通过向内核加载独立按键模块,串口通信模块,编写应用程序,使得当按键按下时,arm可以通过串口对外发送数据。已达到arm与其他设备间的串口通信的目的*/

一、基础知识

1.串口基本知识:串口:计算机上一种非常通用设备通信协议。串口通信:串口按位发送和接收字节。

2.设备驱动:linux下总共有三种设备方式:字符设备,块设备,网络设备。这里串口和键盘都是字符设备。这些设备都在/dev 目录下 。可通过ls -l 来查看设备类型。【crw-rw----  1 root dialout   4,  64  7月  4 02:53 ttyS0】最前面的c表示他是(char)字符设备。

二、程序编写

1.编写驱动程序:

串口设备驱动程序一般在linux和arm都已经加载了,可以在/dev 目前查看一下设备名,串口名一般是ttys0-ttysn。由于此例程还有个独立矩阵按键驱动,这个需要自己加载到arm的内核中。步骤:(1)在网上或者通过其他途径找到矩阵键盘的驱动程序,然后移植到你的平台,然后编写makefile文件,这里我曾出现个问题内核指定目录不对,这时你在linux下是无法编译通过的,修改此路径KERNELDIR := /SRC/kernel/linux-2.6.21_magic。(2)make 一下 生成.ko文件就是可加载的内核模块。这里我曾出现一个错误,多线程的库无法链接,我采取的办法是直接输入命令 arm-linux-gcc keys.c -o key -lpthread.将库动态添加进去。

键盘驱动程序下载地址

2.编写应用程序

串口通信打开串口:fd = open(COM2, O_RDWR );关闭串口:ret=close(fd);打开独立键盘fs = open("/de/KEYS0",0)
写串口:write(fd,&c,n);分别表示文件描述符,存储写入数据的数据缓冲区,写入数据字节数。读串口:read(fd,&c,n);

读矩阵键盘返回4》4键盘的编码ret=read(fs,&keys_value,sizeof(keys_value));看到这里不知道读者有没有体会,linux下的设备操作都是基于文件的,所以有许多相通之处。

以下是我这个程序的发送模块:

void* send(void * data)
{

        //int fd=-1;
        int ret,i;
        unsigned int keys_value=0;
       int c=0x01;
       printf("send data\n");
        while(STOP==FALSE)
       {
        fs = open("/dev/KEYS0",0); //open the button
        if(fd<0)
        {
                printf("open /dev/KEYS error!\n");
                //return -1;
        }

        for(;;)
        {
                ret=read(fs,&keys_value,sizeof(keys_value));
                if(ret<0)
                {
                        printf("read err!\n");
                        continue;
                }

               //write(fd,&c,1);
             //  while(STOP==FALSE)
             // {
                   switch(keys_value)
                {
                      case 0xEE://write(fd,&c,1); //按键1被按下后发送16进制1
                                  write(fd,&c,1);
                                  usleep(100000);
                                  printf("S1 PRESS ,Send 1\n");
                                //  STOP=TRUE;

                                  break;
                      case 0xDE: c++; // 按键2被按下后发送16进制2
                                // write(fd,&c,1);
                                 printf("S2 PRESS,send 2\n");
                               // while(STOP==FALSE)
                               // STOP=TRUE;
                                 printf("send success\n");
                                      write(fd,&c,1);
                                  usleep(100000);
                                    break;

                  }
                keys_value=0;
                c=0x01 ;
}
}
}
注意点:在进行串口通信实验时,好多人都喜欢用全局变量fd来操作,这里有两个设备,所以如果设置一个全局变量时,系统就不知道是在对那个设备进行操作了,这是我进行此实验放下的一个大错误,所以要慎用全局变量。

三、移植程序到arm平台上运行

1.建立nfs服务器,或其他宿主机与arm的通信,将此实验的相关文件复制cp 到可读可写的文件夹下(如yaffs)

2.加载驱动模块到内核:insmod /yaffs/keys.ko ;然后建立设备连接号 mknod  /dev/keys c 252 0

3.  执行可执行应用程序 ./buttonserial_test

附程序下载地址linux串口通信实验

/*欢迎各路大神指导*/