linux+openwrt+linkit7688:串口的应用程序配置
来源:互联网 发布:英雄联盟原声软件 编辑:程序博客网 时间:2024/06/06 08:34
linux上的串口的应用编程查了一些资料对比之后基本上都是差不多,我自己也做一下笔记:
贴出两个参考网页:
这里主要是程序代码:http://blog.csdn.net/yao_guet/article/details/24768967
这里介绍串口编程函数和结构:http://wenku.baidu.com/link?url=7fcl2uUEqJr2JsL0ognguVMrYJrNjyDI25dve2-NtNywTbmtFsCBHIxwVoB6b_4vy7xK3-vHRtIHLWdyehSdfWZ7oHQeyuTSv9H-RIdqkU_
耐心花一小会时间把上面两编对照着看下来,对linux的串口编程就会有一些感觉了。程序代码也可以看我贴出来的,我也是参考别人的。
串口编程过程:
1、打开串口:fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY | O_NDELAY);
2、配置串口:UARTx_Set(fd,57600,0,8,1,’N’);
3、读写串口:read(fd, rcv_buf, 256); / write(fd,send_buf,data_len);
4、关闭串口:close(fd);
上面截出了部分代码,看起来很简单,其实应用层的编程好像也不难。但是我的串口目前还是有点问题,不是代码问题,感觉是menuconfig的配置问题。
代码如下,好坏自己感觉咯:
//串口相关的头文件 #include<termios.h> /*PPSIX 终端控制定义*/ #include<stdio.h> /*标准输入输出定义*/ #include<stdlib.h> /*标准函数库定义*/ #include<unistd.h> /*Unix 标准函数定义*/ #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> /*文件控制定义*/ #include<errno.h> /*错误号定义*/ #include<string.h> //宏定义 #define TRUE 0 #define FALSE -1 /******************************************************************** 功能: 设置串口数据位,停止位和效验位* 入口参数: fd 串口文件描述符* speed 串口速度* flow_ctrl 数据流控制* databits 数据位 取值为 7 或者8* stopbits 停止位 取值为 1 或者2* parity 效验类型 取值为N,E,O,,S*出口参数: 正确返回为1,错误返回为0*******************************************************************/int UARTx_Set(int fd, int speed, int flow_ctrl, int databits, int stopbits, int parity){ int i; int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300 }; int name_arr[] = { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300 }; struct termios options; /* tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options, * 该函数,还可以测试配置是否正确,该串口是否可用等。 * 若调用成功,函数返回值为0,若调用失败,函数返回值为1. */ if( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(FALSE); } //设置串口输入波特率和输出波特率 for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { cfsetispeed(&options, speed_arr[i]); cfsetospeed(&options, speed_arr[i]); printf("uart_speed=%d ", speed ); } } //修改控制模式,保证程序不会占用串口 options.c_cflag |= CLOCAL; //修改控制模式,使得能够从串口中读取输入数据 options.c_cflag |= CREAD; //设置数据流控制 switch(flow_ctrl) { case 0 ://不使用流控制 options.c_cflag &= ~CRTSCTS; break; case 1 ://使用硬件流控制 options.c_cflag |= CRTSCTS; break; case 2 ://使用软件流控制 options.c_cflag |= IXON | IXOFF | IXANY; break; } printf("flow_ctrl=%d ",flow_ctrl); //设置数据位 options.c_cflag &= ~CSIZE; //屏蔽其他标志位 switch (databits) { case 5 : options.c_cflag |= CS5; break; case 6 : options.c_cflag |= CS6; break; case 7 : options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data size\n"); return (FALSE); } printf("databits=%d ",databits); //设置校验位 switch (parity) { case 'n': case 'N': //无奇偶校验位。 options.c_cflag &= ~PARENB; options.c_iflag &= ~INPCK; printf("parity=N "); break; case 'o': case 'O'://设置为奇校验 options.c_cflag |= (PARODD | PARENB); options.c_iflag |= INPCK; break; case 'e': case 'E'://设置为偶校验 options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_iflag |= INPCK; break; case 's': case 'S': //设置为空格 options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default: fprintf(stderr,"Unsupported parity\n"); return (FALSE); } // 设置停止位 switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE); } printf("stopbits=%d \n",stopbits); //修改输出模式,原始数据输出 /*Output*/ options.c_oflag &= ~OPOST; //options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的 /*Input*/ options.c_lflag &= ~(ISIG | ICANON); //设置等待时间和最小接收字符 options.c_cc[VTIME] = 0; /* 读取一个字符等待1*(1/10)s */ options.c_cc[VMIN] = 1; /* 读取字符的最少个数为1 */ //如果发生数据溢出,接收数据,但是不再读取 tcflush(fd,TCIFLUSH); //激活配置 (将修改后的termios数据设置到串口中) if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("com set error!\n"); return (FALSE); } return (TRUE); }/******************************************************************** 名称: UART0_Recv* 功能: 接收串口数据* 入口参数: fd :文件描述符 * rcv_buf :接收串口中数据存入rcv_buf缓冲区中* data_len :一帧数据的长度* 出口参数: 正确返回为1,错误返回为0*******************************************************************/int UARTx_Recv(int fd, char *rcv_buf,int data_len){ int len,fs_sel; fd_set fs_read; struct timeval time; FD_ZERO(&fs_read); FD_SET(fd,&fs_read); time.tv_sec = 10; time.tv_usec = 0; //使用select实现串口的多路通信 fs_sel = select(fd+1,&fs_read,NULL,NULL,&time); if(fs_sel) { len = read(fd,rcv_buf,data_len); printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel); return len; } else { printf("Sorry,I am wrong!\n"); return FALSE; } }/******************************************************************** 名称: UART0_Send* 功能: 发送数据* 入口参数: fd :文件描述符 * send_buf :存放串口发送数据* data_len :一帧数据的个数* 出口参数: 正确返回为1,错误返回为0*******************************************************************/int UARTx_Send(int fd, char *send_buf,int data_len){ int len = 0; len = write(fd,send_buf,data_len); if (len == data_len ){ return len; } else{ tcflush(fd,TCOFLUSH); return FALSE; }}/****************************************************************** 功能: 打开串口并返回串口设备文件描述* 入口参数: fd:文件描述符 port:串口号(ttyS0,ttyS1,ttyS2)* 出口参数: 正确返回为1,错误返回为0*****************************************************************/int UARTx_Open(int fd){ fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if(fd == FALSE) { perror("open_port: Unable to open /dev/ttyS0 -"); return(FALSE); } //判断串口的状态是否为阻塞状态 if( fcntl(fd,F_SETFL,0)<0 ){ printf("fcntl failed! \n"); return(FALSE); } else{ printf("fcntl=%d \n",fcntl(fd, F_SETFL,0)); } //测试是否为终端设备 if(0 == isatty(STDIN_FILENO) ){ printf("standard input is not a terminal device \n"); return(FALSE); } else{ printf("isatty success!\n"); } printf("fd->open=%d \n",fd); return (fd);}/******************************************************* 名称: main*******************************************************************///int main(int argc, char **argv) int main(void) { int fd; //文件描述符 int err; //返回调用函数的状态 int len; int i; char rcv_buf[256]; char send_buf[20]="uartx_test\n"; //fd = UART0_Open(fd,argv[1]); //打开串口,返回文件描述符 fd = UARTx_Open(fd); //打开串口,返回文件描述符 if(FALSE == fd){ exit(1); } //配置串口参数 err = UARTx_Set(fd,57600,0,8,1,'N'); if (FALSE == err){ printf("Set Port Error\n"); exit(1); } for( i = 0; i < 10; i++ ) { len = UARTx_Send(fd, send_buf, strlen(send_buf)); if(len > 0) printf(" %d send data successful len=%d \n",i,len); else printf("send data failed!\n"); } len = 0 ; while(1) { len = read(fd, rcv_buf, 256); if(len > 0){ rcv_buf[len] = '\n'; UARTx_Send(fd,rcv_buf,len+1); printf("len=%d uart_RX_ok \n", len); len = 0 ; memset(rcv_buf, 0, sizeof(rcv_buf) ); } //sleep(2); } printf("Close...\n"); close(fd); return 0;}
你以为这样串口就可以用了么,别人可不可以不知道,我还是不可以。还要写Makefile,配置到menuconfig.这个要等弄好了,在贴上来。
0 0
- linux+openwrt+linkit7688:串口的应用程序配置
- openwrt+Linkit7688:修改I2C的时钟频率(波特率)
- openwrt+Linkit7688+WM8960:WM8960下I2S的REFCLK的时钟输出设置
- OPENWRT的串口初试
- openwrt的串口使用
- openwrt (linux)串口通信
- openwrt (linux)串口通信
- Openwrt 交叉编译环境的配置 linux
- openwrt+Linkit7688:LinkIt™ Smart 7688入门指南
- OPENWRT串口通信的实现
- OPENWRT串口通信的实现
- Linux应用程序串口编程
- linux串口应用程序
- Linux串口测试应用程序
- linux下串口应用程序
- openwrt添加自己的应用程序
- Linux串口测试程序; OpenWRT串口测试程序;
- openwrt的配置杂记
- 11种行为型模式之:命令模式(Command)
- idhttp get 中文出现乱码的问题
- iOS开发之将NSString字符串转换为字典NSDictionary
- 如何在安卓手机里安装Lighttpd + php + sqlite3组合
- 二进制包,源码包,rpm包
- linux+openwrt+linkit7688:串口的应用程序配置
- windows编程之Windows Shell 编程
- 2.接口默认方法教学-java8新特性
- UITableView的侧移编辑功能,可多个
- Vim下markdown TOC解决方案
- java学习 九、循环语句 do……while语句
- 生成bmp
- Yaws(erlang web服务器框架) 学习记录之输出网页代码
- 字典字符串