linux下的串口通信程序详解
2010-04-06 15:47
585 查看
linux下的串口通信程序详解
2009-07-19 12:37
2009-07-19 12:37
为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hello,this is a Serial Port test!”。 1. receive.c程序清单: /******************************************************* *ilename:receive.c * Description:Receive data from Serial_Port * Date: *******************************************************/ /*********************头文件定义***********************/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include "math.h" #define max_buffer_size 100 /*定义缓冲区最大宽度*/ /*********************************************************/ int fd,s; int open_serial(int k) { if(k==0) /*串口选择*/ { fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/ perror("open /dev/ttyUSB0"); } else { fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY); perror("open /dev/ttyS1"); } if(fd == -1) /*打开失败*/ return -1; else return 0; } /********************************************************************/ int main() { char hd[max_buffer_size],*rbuf; /*定义接收缓冲区*/ int flag_close, retv,i,ncount=0; struct termios opt; int realdata=0; /*******************************************************************/ open_serial(0); /*打开串口1*/ /*******************************************************************/ tcgetattr(fd,&opt); cfmakeraw(&opt); /*****************************************************************/ cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/ cfsetospeed(&opt,B9600); /*******************************************************************/ tcsetattr(fd,TCSANOW,&opt); rbuf=hd; /*数据保存*/ printf("ready for receiving data.../n"); retv=read(fd,rbuf,1); /*接收数据*/ if(retv==-1) { perror("read bad1"); /*读状态标志判断*/ } /*************************开始接收数据******************************/ while(*rbuf!='/n') /*判断数据是否接收完毕*/ { ncount+=1; rbuf++; retv=read(fd,rbuf,1); if(retv==-1) { perror("read bad2"); } } /*******************************************************************/ printf("The data received is:/n"); /*输出接收到的数据*/ for(i=0;i<ncount;i++) { printf("%c",hd[i]); } printf("/n"); flag_close =close(fd); if(flag_close == -1)/*判断是否成功关闭文件*/ printf("Close the Device failur!/n"); return 0; } /****************************结束***********************************/ 2.send.c程序清单 /******************************************************* * File Name: send.c * Description: send data to serial_Port * Date: *******************************************************/ /******************头文件定义******************/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #define max_buffer_size 100 /*定义缓冲区最大宽度*/ /*******************************************/ int fd; /*定义设备文件描述符*/ int flag_close; int open_serial(int k) { if(k==0) /*串口选择*/ { fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/ perror("open /dev/ttyUSB0"); } else { fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY); perror("open /dev/ttyS1"); } if(fd == -1) /*打开失败*/ return -1; else return 0; } /********************************************************************/ int main(int argc, char *argv[ ] ) { char sbuf[]={"Hello,this is a Serial_Port test!/n"};/*待发送的内容,以/n为结束标志*/ int sfd,retv,i; struct termios option; int length=sizeof(sbuf);/*发送缓冲区数据宽度*/ /*******************************************************************/ open_serial(0); /*打开串口1*/ /*******************************************************************/ printf("ready for sending data.../n"); /*准备开始发送数据*/ tcgetattr(fd,&option); cfmakeraw(&option); /*****************************************************************/ cfsetispeed(&option,B9600); /*波特率设置为9600bps*/ cfsetospeed(&option,B9600); /*******************************************************************/ tcsetattr(fd,TCSANOW,&option); retv=write(fd,sbuf,length); /*接收数据*/ if(retv==-1) { perror("write"); } printf("the number of char sent is %d/n",retv); flag_close =close(fd); if(flag_close==-1) /*判断是否成功关闭文件*/ printf("Close the Device failur!/n"); return 0; } /****************************结束***********************************/分别将上面的俩个程序编译之后就可以运行了,如果是在两个不同的平台上运行,比如,在开发板上运行数据发送程序write(write.c编译后得到),在宿主机上运行结收数据程序read(read.c编译得到),采用串口线将二者正确连接之后,就可以运行来看实际的效果了: 首先在宿主机端运行数据接收程序receive: [zhang@localhost]# ./receive [zhang@localhost]#open /dev/ttyS0: Success ready for receiving data... The data received is: Hello,this is a Serial_Port test! [zhang@localhost]# 在接收端运行完程序之后再到发送端运行数据发送程序send: #./send ready for sending data... the number of char sent is 35 # 运行完发送程序之后就可以在接收端看到接收的数据了。 也可以在一台PC机上来运行这两个程序,这时需要将串口线的2、3脚短路连接即可(自发自收),实际运行的步骤与上面相同。 |
相关文章推荐
- linux下用户程序同内核通信详解(netlink机制)
- 串口通信编程详解(Linux)
- linux串口通信参数宏详解实例
- STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
- Qt编写串口通信程序详解
- Linux串口通信程序
- linux串口通信程序
- 创建C#串口通信程序详解
- C#串口通信程序详解
- 串口通信编程详解(Linux)
- 详解 Qt 串口通信程序全程图文 (1)
- 创建C#串口通信程序详解
- 串口通信编程详解(Linux)
- 详解 Qt 串口通信程序全程图文 (2)
- Linux下基于QT的串口通信程序(Tiny6410)
- 详解 Qt 串口通信程序全程图文 (3)
- 嵌入式linux串口通信自发自收测试程序
- Linux串口通信程序
- 详解 Qt 串口通信程序全程图文
- 详解 Qt 串口通信程序全程图文 (4)