嵌入式开发记录-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 }

 

posted @ 2020-06-11 22:51  笑不出花的旦旦  阅读(164)  评论(0)    收藏  举报