嵌入式开发记录-day09 串口编程
1、由于只有一根线,而串口时另一个,所以要切换,因此配置启动开发板后启动程序
设置文件启动自动运行:(以hello程序为例) 将所需的文件拷贝置/bin目录下,并增加可执行权限; cp -r /mnt/disk/hello /bin chmod 777 /bin/hello ./bin/hello 修改配置文件:vi /etc/init.d/rcS 在最后一行添加/bin/hello &(需要使用Tab空格)
2、串口相关函数
打开串口:ttySAC3 int tcgetattr(int fd, struct termios *termios_p); // 读取当前参数函数 初始化,获取终端设备当前属性,通过terimios
speed_t cfgetispeed(const struct termios *termios_p); // 获取输入波特率
speed_t cfgetospeed(const struct termios *termios_p); // 获取输出波特率 cfsetispped() // 设置波特率 cfsetospeed() tcflush() // 清空串口buffer缓存中的数据TCIFLUSH TCONFLUSH tcsetattr() // 设置串口参数TCSANOW TCSADRAIN
3、串口初始化
1 #include <termios.h> 2 3 // 串口的初始化 // 通用做法 4 int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop) 5 { 6 struct termios newtio,oldtio;
7 if ( tcgetattr( fd,&oldtio) != 0) { // 获取终端参数失败 8 perror("SetupSerial 1"); 9 return -1; 10 } 11 bzero( &newtio, sizeof( newtio ) ); // 将newtio清0 12 newtio.c_cflag |= CLOCAL | CREAD; // 使能接收 忽略控制线 13 newtio.c_cflag &= ~CSIZE; // 14 15 switch( nBits ) 16 { 17 case 7: 18 newtio.c_cflag |= CS7; 19 break; 20 case 8: 21 newtio.c_cflag |= CS8; 22 break; 23 } 24 25 switch( nEvent ) // 奇、偶校验 26 { 27 case 'O': 28 newtio.c_cflag |= PARENB; 29 newtio.c_cflag |= PARODD; 30 newtio.c_iflag |= (INPCK | ISTRIP); 31 break; 32 case 'E': 33 newtio.c_iflag |= (INPCK | ISTRIP); 34 newtio.c_cflag |= PARENB; 35 newtio.c_cflag &= ~PARODD; 36 break; 37 case 'N': 38 newtio.c_cflag &= ~PARENB; 39 break; 40 } 41 42 switch( nSpeed ) // 串口速度判断 并设置对应的输入输出波特率 43 { 44 case 2400: 45 cfsetispeed(&newtio, B2400); 46 cfsetospeed(&newtio, B2400); 47 break; 48 case 4800: 49 cfsetispeed(&newtio, B4800); 50 cfsetospeed(&newtio, B4800); 51 break; 52 case 9600: 53 cfsetispeed(&newtio, B9600); 54 cfsetospeed(&newtio, B9600); 55 break; 56 case 115200: 57 cfsetispeed(&newtio, B115200); 58 cfsetospeed(&newtio, B115200); 59 break; 60 case 460800: 61 cfsetispeed(&newtio, B460800); 62 cfsetospeed(&newtio, B460800); 63 break; 64 default: 65 cfsetispeed(&newtio, B9600); 66 cfsetospeed(&newtio, B9600); 67 break; 68 } 69 if( nStop == 1 ) /// 停止位判断 70 newtio.c_cflag &= ~CSTOPB; 71 else if ( nStop == 2 ) 72 newtio.c_cflag |= CSTOPB; 73 newtio.c_cc[VTIME] = 0; 74 newtio.c_cc[VMIN] = 0; 75 tcflush(fd,TCIFLUSH); // 清空fd 76 if((tcsetattr(fd,TCSANOW,&newtio))!=0) // 设置终端属性 77 { 78 perror("com set error"); 79 return -1; 80 } 81 // printf("set done!\n\r"); 82 return 0; 83 }
3.1 串口结构体
// 最小结构体 struct termios{ tcflag_t c_iflag; //* input modes 控制输入模式 tcflag_t c_oflag; //* output modes 控制输出模式 tcflag_t c_cflag; //* control modes 控制模式 tcflag_t c_lflag; //* local modes 本地模式 cc_t c_cc[NCCS]; //* special characters 特殊字符 };
4、打开串口
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <string.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 9 void main(void) 10 { 11 int fd; 12 // 串口也是一种文件 13 char* uart = "/dev/ttySAC3"; 14 // 打开串口 15 fd = open(uart, O_RDWR|O_CREAT,0777); 16 if(fd < 0){ 17 printf("open uart err\n"); 18 exit(1); 19 }else{ 20 printf("open %s success\n",uart); 21 } 22 close(fd); 23 24 }
5、写串口函数
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <string.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #include <termios.h> 9 10 void main(void) 11 { 12 int fd,ret,i= 10; 13 char* uart = "/dev/ttySAC3"; 14 char* buf = "hello world\n"; 15 printf("\r\n itop 4412 uart write start\n"); 16 17 if((fd = open(uart,O_RDWR|O_CREAT,0777))< 0 ){ 18 printf("open uart failed\n"); 19 }else{ 20 printf("open uart success\n"); 21 set_opt(fd,115200,8,'N',1); // 配置串口属性 22 while(i--){ 23 // 写串口操作 24 ret = write(fd,buf,sizeof(buf)); 25 if(ret < 0){ 26 printf("write error\n"); 27 }else{ 28 printf("write uart sucess\n"); 29 30 } 31 sleep(1); 32 } 33 } 34 }
6、读串口
1 // 读串口函数 2 void main(void) 3 { 4 int fd; 5 ssize_t nByte; 6 char* uart = "/dev/ttySAC3"; 7 char buf[512]; 8 char* uart_out = "please input\r\n"; 9 memset(buf,0,sizeof(buf)); 10 11 if((fd = open(uart,O_RDWR|O_NDELAY))< 0 ){ 12 printf("open %s is failed\n",uart); 13 }else{ 14 set_opt(fd,115200,8,'N',1); 15 write(fd,uart_out,strlen(uart_out)); 16 while(1){ // 将读到的数据又发送出去 17 nByte = read(fd,buf,512); 18 while(nByte > 0){ 19 buf[nByte+1] = '\0'; 20 write(fd,buf,strlen(buf)); 21 memset(buf,0,strlen(buf)); 22 nByte = 0; 23 } 24 } 25 } 26 }