基于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串口通信实验/*欢迎各路大神指导*/