×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-09-01 发布时间:
|

/*例程目的:通过向内核加载独立按键模块,串口通信模块,编写应用程序,使得当按键按下时,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



关键字:arm11  S3C6410  内核  linux  串口通信 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析