基于arm11处理器S3C6410内核的linux下串口通信实现
来源:互联网 发布:淘宝手写披露函 编辑:程序博客网 时间:2024/05/16 08:36
基于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串口通信实验/*欢迎各路大神指导*/
- 基于arm11处理器S3C6410内核的linux下串口通信实现
- HHS3C6410-Integration-R1:基于三星S3C6410 ARM11处理器的WinCE/Linux开发板
- 基于OK6410-A的ARM11(S3C6410)开发(Linux)
- 基于S3C6410的ARM11学习(四) 核心初始化之设置处理器模式
- linux 下基于特定通信协议利用多线程同步通信机制实现的串口通信
- linux 下基于特定通信协议利用多线程同步通信机制实现的串口通信
- linux中触摸屏驱动的实现(1)——基于s3c6410处理器
- linux中触摸屏驱动的实现(2)——基于s3c6410处理器
- linux中触摸屏驱动的实现(3)——基于s3c6410处理器
- 基于S3C6410的ARM11学习(一) 基础知识
- 基于S3C6410的ARM11学习(二) bootloader开发准备
- 基于S3C6410的ARM11 移植printf和scanf
- VC++6.0下基于MFC的串口通信助手实现
- Linux下基于QT的串口通信程序(Tiny6410)
- Linux下基于QT的串口通信程序(Tiny6410)
- Linux 下的串口通信
- linux下的串口通信
- 基于Android平台的串口通信实现
- vim configure
- CMD 注释用法
- Android反编译工具及其使用
- Html.TexBoxFor()中设置日期时间格式
- 玩转Android 之 TextView常用特效
- 基于arm11处理器S3C6410内核的linux下串口通信实现
- JS对象序列化为JSON对象
- 《重说中国近代史》
- Mindjet.MindManager.v9.0“参数不正确”解决办法
- ZOJ2029 The Intervals,二分检索
- Spring基础之简单实例演示
- android消息机制
- 《中国智慧》
- 无论你的工资多少,请记住这些