樹莓派進階之路 (043) - 串口篇 - 常規波特率測試代碼

樹莓派串口測試文件:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <errno.h>
  4 #include <unistd.h>
  5 #include <stdlib.h>
  6 #include <stdio.h>
  7 #include <stdlib.h>
  8 #include <stdint.h>
  9 #include <stdarg.h>
 10 #include <string.h>
 11 #include <termios.h>
 12 #include <unistd.h>
 13 #include <fcntl.h>
 14 #include <sys/ioctl.h>
 15 #include <sys/types.h>
 16 #include <sys/stat.h>
 17 
 18 #define par_type  long
 19 
 20 // ----------------------------------------------------------------------------------------
 21 int serialOpen (const char *device, const long baud)
 22 {
 23   struct termios options ;
 24   speed_t myBaud ;
 25   int     status, fd ;
 26 
 27   switch (baud)
 28   {
 29     case      50:    myBaud =      B50 ; break ;
 30     case      75:    myBaud =      B75 ; break ;
 31     case     110:    myBaud =     B110 ; break ;
 32     case     134:    myBaud =     B134 ; break ;
 33     case     150:    myBaud =     B150 ; break ;
 34     case     200:    myBaud =     B200 ; break ;
 35     case     300:    myBaud =     B300 ; break ;
 36     case     600:    myBaud =     B600 ; break ;
 37     case    1200:    myBaud =    B1200 ; break ;
 38     case    1800:    myBaud =    B1800 ; break ;
 39     case    2400:    myBaud =    B2400 ; break ;
 40     case    4800:    myBaud =    B4800 ; break ;
 41     case    9600:    myBaud =    B9600 ; break ;
 42     case   19200:    myBaud =   B19200 ; break ;
 43     case   38400:    myBaud =   B38400 ; break ;
 44     case   57600:    myBaud =   B57600 ; break ;
 45     case  115200:    myBaud =  B115200 ; break ;
 46     case  230400:    myBaud =  B230400 ; break ;
 47     case  460800:    myBaud =  B460800 ; break ;
 48     case  500000:    myBaud =  B500000 ; break ;
 49     case  576000:    myBaud =  B576000 ; break ;
 50     case  921600:    myBaud =  B921600 ; break ;
 51     case 1000000:    myBaud = B1000000 ; break ;
 52     case 1152000:    myBaud = B1152000 ; break ;
 53     case 1500000:    myBaud = B1500000 ; break ;
 54     case 2000000:    myBaud = B2000000 ; break ;
 55     case 2500000:    myBaud = B2500000 ; break ;
 56     case 3000000:    myBaud = B3000000 ; break ;
 57     case 3500000:    myBaud = B3500000 ; break ;
 58     case 4000000:    myBaud = B4000000 ; break ;
 59 
 60     default:
 61       return -2 ;
 62   }
 63 
 64   if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
 65     return -1 ;
 66 
 67   fcntl (fd, F_SETFL, O_RDWR) ;
 68 
 69 // Get and modify current options:
 70 
 71   tcgetattr (fd, &options) ;
 72 
 73     cfmakeraw   (&options) ;
 74     cfsetispeed (&options, myBaud) ;
 75     cfsetospeed (&options, myBaud) ;
 76 
 77     options.c_cflag |= (CLOCAL | CREAD) ;
 78     options.c_cflag &= ~PARENB ;
 79     options.c_cflag &= ~CSTOPB ;
 80     options.c_cflag &= ~CSIZE ;
 81     options.c_cflag |= CS8 ;
 82     options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
 83     options.c_oflag &= ~OPOST ;
 84 
 85     options.c_cc [VMIN]  =   0 ;
 86     options.c_cc [VTIME] = 100 ;    // Ten seconds (100 deciseconds)
 87 
 88   tcsetattr (fd, TCSANOW, &options) ;
 89 
 90   ioctl (fd, TIOCMGET, &status);
 91 
 92   status |= TIOCM_DTR ;
 93   status |= TIOCM_RTS ;
 94 
 95   ioctl (fd, TIOCMSET, &status);
 96 
 97   usleep (10000) ;    // 10mS
 98 
 99   return fd ;
100 }
101 // ----------------------------------------------------------------------------------------
102 struct  serial_test_data{
103     int fd;
104     unsigned int Features;
105     unsigned char buf[1024];
106     unsigned long long  H_count;
107     unsigned long long  L_count;
108 };
109 // ----------------------------------------------------------------------------------------
110 long baud_value;
111 // 傳參處理函數
112 // main  收發狀態 波特率 設備地址  發送數據
113 int main_Parameter_handling_function(par_type serial_addr, int argc, char* argv[]){
114     struct  serial_test_data *serial = (struct  serial_test_data *)serial_addr;
115     baud_value = 115200;
116     if(1 == argc){printf("請配置參數: 0 發送模式,1接受模式\n");printf("請配置波特率:默認115200\n");return 1;}
117     if(argc == 2){printf("默認115200\n");if(0 == atoi(argv[1]))serial->Features = 0;else if(1 == atoi(argv[1]))serial->Features = 1;}
118     if(argc == 3){
119         if(0 == atoi(argv[1]))serial->Features = 0;
120         else if(1 == atoi(argv[1]))serial->Features = 1;
121         baud_value = atoi(argv[2]);
122     }
123     return 0;
124 }
125 //  串口
126 int Serial_Parameter_handling_function(par_type serial_addr,const long baud,const char * serial_device){
127     struct  serial_test_data *serial = (struct  serial_test_data *)serial_addr;
128     int ret ;
129     if ((serial->fd = serialOpen (serial_device, baud)) < 0){
130         fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
131         ret = 1 ;
132   }else {
133       tcflush (serial->fd, TCIOFLUSH) ;
134       memset(serial->buf,0,strlen(serial->buf));
135       serial-> H_count = 0;
136       serial-> L_count = 0;
137       ret =  0;
138   }
139   return ret;
140 }
141 // ----------------------------------------------------------------------------------------
142 // ----------------------- write
143 // char
144 void Serial_write_char(const int fd, const unsigned char c){write (fd, &c, 1) ;}
145 //  string
146 void Serial_write_string(const int fd, const char *s){write (fd, s, strlen (s));}
147 //  ----------------------- read
148 int Serial_read_char(const int fd){
149     unsigned char x ;
150     if (read (fd, &x, 1) != 1)return -1 ;
151     return ((int)x) & 0xFF ;
152 }
153 // ----------------------------------------------------------------------------------------
154 void Serial_data(par_type serial_addr,const char *s){
155     struct  serial_test_data *serial = (struct  serial_test_data *)serial_addr;
156     int len =  write (serial->fd, s, strlen (s));
157   //  printf("len = %d  strlen (s) = %d\n",len,strlen (s));
158     if(len == strlen (s)){
159       serial->L_count = serial->L_count + strlen (s);
160         if (serial->L_count > 1000000000) {
161           serial->L_count = serial->L_count - 1000000000;
162           serial-> H_count = serial-> H_count + 1;
163         }
164     }
165 }
166 // ----------------------------------------------------------------------------------------
167 int main(int argc, char *argv[]){
168     struct serial_test_data serial0;
169     int ret;
170     if(main_Parameter_handling_function((par_type)&serial0,argc,argv))return 1;            // main 函數處理
171     if(Serial_Parameter_handling_function((par_type)&serial0,baud_value,"/dev/serial0"));  //  串口處理函數
172     while(1){
173       if (0 == serial0.Features){
174         //sprintf(serial0.buf,"[email protected] %lld\n",serial0.L_count);
175         sprintf(serial0.buf,"[email protected]\n");
176         Serial_data((par_type)&serial0,serial0.buf);//usleep(10000);
177       }
178       else if (1 == serial0.Features) printf("%c",Serial_read_char(serial0.fd));
179       else{
180         close(serial0.fd);ret = 1;
181       }
182     }
183     return ret;
184 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章