博客
关于我
嵌入式Linux驱动学习之USART串口控制:基于AT91SAM9261EK
阅读量:593 次
发布时间:2019-03-09

本文共 2527 字,大约阅读时间需要 8 分钟。

基于Linux系统的串口操作虽然比普通单片机复杂一些,但实际上同样相对容易。串口在Linux中的操作主要分为两部分:底层驱动部分(包括设备注册)和用户层应用程序部分。对于使用AT91SAM9261EK开发板的开发者来说,只需编写简单的用户应用程序即可实现串口通信。

在开发过程中,首先需要确保开发板的内核中所有可用串口都已注册。通过查看内核启动信息,可以发现DEBUG串口已成功注册。而其他两个测试串口则需要修改内核中的相关文件(如linux-2.6.32.2/arch/arm/mach-at91/board-sam9261ek.c)来注册这些串口设备。修改完成后,重新编译内核即可使所有三个串口都成功注册。

在串口操作方面,Linux中的串口设备可以像普通文件一样通过openreadwrite等函数进行控制。以下是一个简单的应用程序示例:

#include 
#include
#include
#include
#include
#define BAUDRATE B9600static int open_com(char *dev_name, int com_baud, int com_data, int com_pry, int com_stop) { struct termios strNewTio = {0}; int fd; switch(com_baud) { case 50: BAUDRATE = B50; break; case 75: BAUDRATE = B75; break; // ... 其他情况类似 ... case 9600: BAUDRATE = B9600; break; default: BAUDRATE = B9600; break; } switch(com_data) { case 5: com_data = CS5; break; case 6: com_data = CS6; break; case 7: com_data = CS7; break; default: com_data = CS8; break; } switch(com_pry) { case 0: com_pry = 0; break; case 1: com_pry = PARENB | PARODD; break; case 2: com_pry = PARENB; break; default: com_pry = 0; break; } switch(com_stop) { case 1: stop = 0; break; case 2: stop = CSTOPB; break; default: stop = 0; break; } fd = open(dev_name, O_RDWR | O_NOCTTY); if (fd < 0) { printf("com open() error\n"); return -1; } tcgetattr(fd, &strNewTio); strNewTio.c_cflag |= BAUDRATE | com_data | com_pry | stop | CREAD | CLOCAL; strNewTio.c_iflag = 0; strNewTio.c_lflag = 0; strNewTio.c_oflag = 0; if (tcsetattr(fd, TCSANOW, &strNewTio) < 0) { close(fd); printf("tcsetattr() error\n"); return -1; } return fd;}int main() { int fd1, fd2; char *dev1 = "/dev/ttyS0", *dev2 = "/dev/ttyS1"; char wr = 'k'; char rd[1024]; fd1 = open_com(dev1, 9600, 8, 0, 1); if (fd1 < 0) { printf("无法打开 %s\n", dev1); return 0; } printf("成功打开串口 %s\n", dev1); fd2 = open_com(dev2, 9600, 8, 0, 1); if (fd2 < 0) { printf("无法打开 %s\n", dev2); return 0; } while (1) { write(fd1, &wr, 1); sleep(100); int ret = read(fd2, rd, 512); if (ret > 0) { printf("接收到数据:%s\n", rd); write(fd2, rd, strlen(rd)); memset(rd, 0, 512); } } return 0;}

综上所述,与普通单片机相比,基于Linux系统的串口操作主要涉及内核驱动和用户层应用的实现。通过合理配置和简单的应用程序,便可以轻松实现串口通信功能。

转载地址:http://fzfpz.baihongyu.com/

你可能感兴趣的文章
POJ1218 HDU1337 ZOJ1350 UVALive2557 THE DRUNK JAILER
查看>>
poj1222 EXTENDED LIGHTS OUT(gauss)
查看>>
POJ1240 m叉树
查看>>
Poj1328--Radar Installation(区间选点)
查看>>
POJ1384Piggy-Bank(DP)
查看>>
POJ1417 True Liars —— 并查集 + DP
查看>>
Poj1459 Power Network 预流推进
查看>>
POJ1502(MPI Maelstrom)
查看>>
poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
查看>>
poj1730 - Perfect Pth Powers(完全平方数)(水题)
查看>>
poj1753——Flip Game
查看>>
poj1936 假期计划第一水
查看>>
poj1958-汉诺四塔问题(三种方法)
查看>>
poj1988(并查集)
查看>>
POJ2007+几何+极角排序
查看>>
poj2039
查看>>
poj2135(简单的最小费用流问题)
查看>>
poj2195 bfs+最小权匹配
查看>>
POJ2251
查看>>
POJ2253-Frogger
查看>>