Linux应用编程之串口操作20170901

主要介绍在Linux应用程序下对串口的操作:

1.串口初始化

int InitCom()

{

int Ret;

Ret = SerailComm.OpenCom( ComPortDevPath, 0 );

if( Ret < 0 )

{

return Ret;

}

if(SerailComm.SetComSpeed( ComBaudRate ) < 0 )

{

SerailComm.CloseCom();

return Ret;

}

if(SerailComm.SetComParity(8, 1, ‘N‘, 0, 0) < 0)

{

SerailComm.CloseCom();

return Ret;

}

Ret = SerailComm.SetComRawMode();

if( Ret < 0 )

{

SerailComm.CloseCom();

return  Ret;

}

if( SerailComm.SetComSelectTimeOut(1, 0, READ_TIMEOUT_F) < 0 )

{

CloseCom();

return  Ret;

}

if( SerailComm.SetComSelectTimeOut( 0, 500000, WRITE_TIMEOUT_F) < 0 )

{

SerailComm.CloseCom();

return  Ret;

}

SerailComm.SetSerialCommBlock( 0 );

return 0;

}

2.读数据

int ReadCom()

{

char cRecvBuf[256];

int iBufSize = 256;

memset(cRecvBuf, 0, sizeof(cRecvBuf));

return SerailComm.ReadBinCom(cRecvBuf, iBufSize))

}

3.写数据

int WriteCom(u8 *WriteBuf, int Size)

{

return SerailComm.WriteBinCom((char*)WriteBuf, Size);

}

4.关闭串口

void CloseCom()

{

SerailComm.CloseCom();

}

5.附:上述使用到的串口类

  1 #include "ComTransmit.h"
  2 #include <assert.h>
  3 #include <unistd.h>
  4 #include <termios.h>
  5 #include <ctype.h>
  6 #include <errno.h>
  7
  8 #include "tracelevel.h"
  9 #include "MdvrModulCom.h"
 10
 11 extern HANDLE_DVR  g_hDvr;
 12
 13 pthread_mutex_t ComCommutex = PTHREAD_MUTEX_INITIALIZER;
 14
 15 //pthread_rwlock_t  rwlock = PTHREAD_RWLOCK_INITIALIZER;
 16
 17 speedPara speed_atr[] =
 18 {
 19     {B300,300},
 20     {B600,600},
 21     {B1200,1200},
 22     {B2400,2400},
 23     {B4800,4800},
 24     {B9600,9600},
 25     {B19200,19200},
 26     {B38400,38400},
 27     {B57600,57600},
 28     {B115200,115200}    ,
 29     {B230400,230400}
 30 };
 31
 32 CComTransmit::CComTransmit():m_fp(NULL),m_fd(-1)
 33 {
 34     memset(&Rtimeout,0,sizeof(Rtimeout));
 35     memset(&Wtimeout,0,sizeof(Wtimeout));
 36     m_binit = 0;
 37 }
 38
 39 CComTransmit::~CComTransmit()
 40 {
 41
 42 }
 43
 44 int CComTransmit::OpenCom(const char * deviceName, int isMutex)
 45 {
 46     assert(deviceName != NULL);
 47
 48     if(m_binit == 1)
 49         return 0;
 50
 51     m_fd = open(deviceName,O_RDWR);
 52     if(m_fd < 0)
 53     {
 54         printf("Open Com [%s] failure! %s\n",deviceName, strerror(errno));
 55         return -1;
 56     }
 57
 58     printf("Open Com [%s] Sucess\n",deviceName);
 59
 60     m_fp = fdopen(m_fd, "r+b");
 61     if(m_fp == NULL)
 62     {
 63         return -1;
 64     }
 65
 66     m_binit = 1;
 67     m_mutex_flag = isMutex;
 68
 69     return 0;
 70 }
 71
 72 void CComTransmit::CloseCom()
 73 {
 74     int ret = close(m_fd);
 75     if(ret < 0)
 76     {
 77         printf("close Com failure!\n");
 78     }
 79     m_fp = NULL;
 80     m_binit = 0;
 81 }
 82
 83 int CComTransmit::SetComSpeed(unsigned int speed)
 84 {
 85     int comspeed = 0;
 86     int status = 0;
 87     struct termios   Opt;
 88     int ret = -1;
 89
 90     for(unsigned int i = 0;i < sizeof(speed_atr)/sizeof(speedPara);i++)
 91     {
 92         if(speed == speed_atr[i].userSpeed)
 93         {
 94             comspeed = speed_atr[i].sysSpeed;
 95             break;
 96         }
 97     }
 98
 99     if(!comspeed)
100     {
101         assert(comspeed != 0);
102     }
103
104     if(m_fd < 0)
105     {
106         return -1;
107     }
108     tcgetattr(m_fd, &Opt);
109     tcflush(m_fd, TCIOFLUSH);
110         ret = cfsetispeed(&Opt, comspeed);
111     if(ret < 0)
112     {
113         perror("set input speed error!\n");
114         return -1;
115     }
116
117         ret = cfsetospeed(&Opt, comspeed);
118     if(ret < 0)
119     {
120         perror("set output speed error!\n");
121         return -1;
122     }
123
124         status = tcsetattr(m_fd, TCSANOW, &Opt);
125         if(status != 0)
126         {
127                 perror("tcsetattr fd1");
128         return -1;
129         }
130
131     tcflush(m_fd,TCIOFLUSH);
132     return 0;
133  }
134
135 int CComTransmit::SetComParity(int databits, int stopbits, int parity,int flowctrl, int Rs485)
136 {
137     struct termios options;
138
139     if(m_fd < 0)
140     {
141         return -1;
142     }
143
144     if  ( tcgetattr( m_fd,&options)  !=  0)
145     {
146         printf("SetComParity 1");
147         return-1;
148     }
149
150     options.c_cflag &= ~CSIZE;
151       switch (databits) /*设置数据位数*/
152       {
153           case 5:
154             options.c_cflag |= CS5;
155             break;
156         case 6:
157             options.c_cflag |= CS6;
158             break;
159           case 7:
160               options.c_cflag |= CS7;
161               break;
162           case 8:
163             options.c_cflag |= CS8;
164             break;
165         default:
166             fprintf(stderr,"Unsupported data size\n");
167             return -1;
168     }
169       switch (parity)
170       {
171           case ‘n‘:
172         case ‘N‘:
173         case 0:
174             options.c_cflag &= ~PARENB;   /* Clear parity enable */
175             options.c_iflag &= ~INPCK;     /* Enable parity checking */
176             break;
177         case ‘o‘:
178         case ‘O‘:
179         case 1:
180             options.c_cflag |= (PARODD | PARENB);  /* 设置为奇效验*/
181             options.c_iflag |= INPCK;             /* Disnable parity checking */
182             break;
183         case ‘e‘:
184         case ‘E‘:
185         case 2:
186             options.c_cflag |= PARENB;     /* Enable parity */
187             options.c_cflag &= ~PARODD;   /* 转换为偶效验*/
188             options.c_iflag |= INPCK;       /* Disnable parity checking */
189             break;
190         case ‘S‘:
191         case ‘s‘:  /*as no parity*/
192             options.c_cflag &= ~PARENB;
193             options.c_cflag &= ~CSTOPB;
194             break;
195         default:
196             fprintf(stderr,"Unsupported parity\n");
197             return -1;
198         }
199
200       /* 设置停止位*/
201       switch (stopbits)
202       {
203           case 1:
204               options.c_cflag &= ~CSTOPB;
205             break;
206         case 2:
207             options.c_cflag |= CSTOPB;
208         break;
209         default:
210             fprintf(stderr,"Unsupported stop bits\n");
211             return (-1);
212     }
213
214     switch(flowctrl)    /* 设置流控制*/
215     {
216         case 0:
217             options.c_cflag &= ~CRTSCTS;   /*no flow control*/
218             break;
219         case 1:
220             options.c_cflag |= CRTSCTS;    /*hardware flow control*/
221             break;
222         case 2:
223             options.c_cflag |= IXON|IXOFF|IXANY; /*software flow control*/
224             break;
225         default:
226             options.c_cflag &= ~CRTSCTS;   /*no flow control*/
227             break;
228     }
229 #if 0
230     if(Rs485)
231     {
232         options.c_cflag |= (0x00000001<<23);
233     }
234     else
235     {
236         options.c_cflag &= (~(0x00000001<<23));
237     }
238 #else
239
240     PRODUCT_INFO_ST productInfo;
241
242      EX_GetProductInfo(g_hDvr, &productInfo);
243      if((productInfo.productTypeID == MDVR_JH6S8_720P)||(productInfo.productTypeID == MDVR_JH6S4_720P))
244      {
245          if(Rs485)
246          {
247              options.c_cflag |= (0x00000001<<30);
248          }
249          else
250          {
251              options.c_cflag &= (~(0x00000001<<30));
252          }
253
254      }
255 #endif
256       /* Set input parity option */
257       if (parity != ‘n‘)
258           options.c_iflag |= INPCK;
259
260         options.c_cc[VTIME] = 10; // 1 seconds
261         options.c_cc[VMIN] = 0;
262
263       tcflush(m_fd,TCIFLUSH); /* Update the options and do it NOW */
264       if (tcsetattr(m_fd,TCSANOW,&options) != 0)
265       {
266           perror("SetComParity 2");
267         return (-1);
268     }
269
270       return (0);
271 }
272
273 //0---read ,1--write
274 int CComTransmit::SetComSelectTimeOut(int sec,int usec,SELECT_TIMEOUT_F rwflag)
275 {
276     if(rwflag == WRITE_TIMEOUT_F)
277     {
278         Wtimeout.tv_sec = sec;
279         Wtimeout.tv_usec = usec;
280     }
281     else
282     {
283         Rtimeout.tv_sec = sec;
284         Rtimeout.tv_usec = usec;
285     }
286
287     return 0;
288 }
289
290 int CComTransmit::IOFlush()
291 {
292     tcflush(m_fd, TCIOFLUSH);
293     return 0;
294 }
295
296 int CComTransmit::SetComRawModeEx()
297 {
298     int ret = 0;
299     struct termios options;
300
301     tcgetattr(m_fd, &options);
302
303     tcflush(m_fd, TCIOFLUSH);
304     options.c_cflag &= ~CSIZE;
305     options.c_cflag |= CS8;
306     options.c_cflag &= ~PARENB;
307     options.c_cflag &= ~CSTOPB;
308     options.c_cflag &= ~CSTOPB;
309     options.c_oflag  &= ~OPOST;
310
311 #if 0
312     printf("before iflag %x, lflag %x, oflag  %x \n", options.c_iflag, options.c_lflag, options.c_oflag);
313
314 //    options.c_lflag = 0 ;
315 //    options.c_oflag = 0 ;
316 //    options.c_iflag = 0;
317     options.c_lflag &= ~(ICANON |ISIG);
318     options.c_iflag &= ~(ICRNL|IGNCR);
319
320           //options.c_iflag |= (IGNBRK|BRKINT);
321           options.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
322
323     printf("iflag %x, lflag %x, oflag  %x \n", options.c_iflag, options.c_lflag, options.c_oflag);
324
325 #endif
326
327     //|PARMRK|ISTRIP|IGNCR|ICRNL|IXON|INLCR
328     tcflush(m_fd, TCIFLUSH);
329     options.c_cc[VTIME] = 0; //128;
330     options.c_cc[VMIN] = 1;// 1;
331
332     cfmakeraw(&options);
333
334     ret = tcsetattr(m_fd,TCSANOW,&options);
335     if (ret < 0)
336     {
337         perror("set raw mode error!");
338         return ret;
339     }
340
341     return 0;
342 }
343
344 int CComTransmit::SetComRawMode()
345 {
346     int ret = 0;
347     struct termios options;
348
349     tcgetattr(m_fd, &options);
350
351     cfmakeraw(&options);
352     ret = tcsetattr(m_fd,TCSANOW,&options);
353     if (ret < 0)
354     {
355         perror("set raw mode error!");
356     }
357
358     return ret;
359 }
360
361 int CComTransmit::ReadCom(char *ReadBuffer,int size,int *retSize)
362 {
363     int retval = -1;
364
365     fd_set serial;
366     struct timeval rdtimeout;
367     *retSize = 0;
368     if(m_fd < 0)
369     {
370         fprintf(stderr,"%s[%d]:serial have not open!\n",__FILE__,__LINE__);
371         return -1;
372     }
373
374     FD_ZERO(&serial);
375     FD_SET(m_fd, &serial);
376     rdtimeout = Rtimeout;
377 #if 1
378
379     do{
380         retval = select(m_fd+1,  &serial, NULL, NULL, &rdtimeout);
381         if(retval < 0)
382         {
383             if(errno == EINTR)
384             {
385                 //printf("select Interruppter!\n");
386             }
387             else
388             {
389                 break;
390             }
391         }
392     }while(retval == -1);
393
394     if(retval <= 0)
395     {
396         return -1;
397     }
398
399      //读数据写BUFFER
400     if(FD_ISSET(m_fd, &serial)!=0)
401     {
402         if(NULL != m_fp)
403         {
404             if(m_mutex_flag)
405             {
406                 pthread_mutex_lock(&ComCommutex);
407                 fgets(ReadBuffer, size, m_fp);
408                 pthread_mutex_unlock(&ComCommutex);
409             }
410             else
411             {
412                 fgets(ReadBuffer, size, m_fp);
413             }
414             *retSize = strlen(ReadBuffer);
415         }
416     }
417     return 0;
418 #else
419         if(m_fd > 0)
420         {
421             retval = read(m_fd, ReadBuffer, size);
422         }
423
424         if(retval > 0)
425         {
426             *retSize = retval;
427         }
428         else
429         {
430             *retSize = 0;
431         }
432
433         return retval;
434
435 #endif
436 }
437
438 int CComTransmit::ReadComEx( char *ReadBuffer,int size,int *retSize )
439 {
440     fd_set     read_fds;
441     int     retval;
442     struct timeval rdtimeout;
443
444     rdtimeout.tv_sec  = Rtimeout.tv_sec;
445     rdtimeout.tv_usec = Rtimeout.tv_usec;
446
447     if(m_fd < 0)
448     {
449         fprintf(stderr,"%s[%d]:serial have not open!\n",__FILE__,__LINE__);
450         return -1;
451     }
452
453     FD_ZERO(&read_fds);
454     FD_SET(m_fd, &read_fds);
455
456     retval = select(m_fd + 1,  &read_fds, NULL, NULL, &rdtimeout);
457     if( retval <= 0 )
458     {
459         return -1;
460     }
461
462     if ( !FD_ISSET(m_fd, &read_fds) )
463     {
464         //printf("Serail Com[%s] read time out[%d]\n", m_SerialPath, time_out);
465         return -1;
466     }
467
468     retval = read(m_fd, ReadBuffer, size);
469     *retSize = retval;
470
471     if(*retSize < 0)
472     {
473         return -1;
474     }
475
476     return 0;
477 }
478
479
480 /*
481 *函数功能:读取串口binary数据
482 *创建作者:freeman on 2010/0818
483 */
484 int CComTransmit::ReadBinCom(char *ReadBuffer,int size)
485 {
486     int retval = -1;
487
488 #if 0
489
490     fd_set serial;
491     struct timeval rdtimeout;
492
493     if(m_fd < 0)
494     {
495         fprintf(stderr,"%s[%d]:serial have not open!\n",__FILE__,__LINE__);
496         return -1;
497     }
498
499     FD_ZERO(&serial);
500     FD_SET(m_fd, &serial);
501     rdtimeout = Rtimeout;
502
503     do{
504         retval = select(m_fd+1,  &serial, NULL, NULL, &rdtimeout);
505         if(retval < 0)
506         {
507             if(errno == EINTR)
508             {
509                 //printf("select Interruppter!\n");
510             }
511             else
512             {
513                 break;
514             }
515         }
516     }while(retval == -1);
517
518     if(retval <= 0)
519     {
520         return -1;
521     }
522
523      //读数据写BUFFER
524     if(FD_ISSET(m_fd,&serial)!=0)
525     {
526         if(NULL != m_fp)
527         {
528             return  read(m_fd,ReadBuffer,size);
529         }
530     }
531     return 0;
532
533 #else
534
535     if(m_fd > 0)
536     {
537         retval = read(m_fd, ReadBuffer, size);
538     }
539     else
540     {
541         TRACE_NET(ERR,"ReadBinCom ERR:%d\n",m_fd);
542     }
543     return retval;
544
545 #endif
546 }
547
548
549 int CComTransmit::WriteCom(char *WriteBuffer,int size)
550 {
551     int     ret = -1;
552 #if 1
553     fd_set serial;
554     int retval =0;
555     struct timeval WTtimeout;
556
557     if(m_fd < 0)
558     {
559         TRACE_NET(ERR, "---serial have not open!\n");
560         return -1;
561     }
562
563 //    printf("Snd Com %s  \n", WriteBuffer);
564
565     FD_ZERO(&serial);
566     FD_SET(m_fd, &serial);
567     WTtimeout = Wtimeout;
568     if ((retval = select(m_fd+1,  NULL, &serial, NULL, &WTtimeout)) < 0)
569     {
570         TRACE_NET(ERR, "select error! ---- \n");
571         return -1;
572     }
573
574     if(retval == 0)
575     {
576         TRACE_NET(ERR, "select timeout! ---- \n");
577         return -1;
578     }
579
580     //读数据写BUFFER
581     if(FD_ISSET(m_fd,&serial)!=0)
582     {
583         pthread_mutex_lock(&ComCommutex);
584         ret = write(m_fd, WriteBuffer ,size);
585         pthread_mutex_unlock(&ComCommutex);
586
587         if(ret == -1)
588         {
589             TRACE_NET(ERR, "serial send data failed -----!\n");
590             return  -1;
591         }
592     }
593
594     return ret;
595 #else
596     ret = write(m_fd, WriteBuffer ,size);
597     //      printf("Send cmd %d  \n", ret);
598     if(ret == -1)
599     {
600         printf("serial send data failed -----error!\n");
601         return  -1;
602     }
603     return ret;
604
605 #endif
606 }
607
608 int CComTransmit::WriteBinCom(char *WriteBuffer,int size)
609 {
610     int     ret = -1;
611 #if 0
612     fd_set serial;
613        int retval =0;
614     struct timeval WTtimeout;
615
616     if(m_fd < 0)
617     {
618         fprintf(stderr,"%s:%d---serial have not open!\n", __FILE__, __LINE__);
619         return -1;
620     }
621
622 //    printf("Snd Com %s  \n", WriteBuffer);
623
624        FD_ZERO(&serial);
625        FD_SET(m_fd, &serial);
626     WTtimeout = Wtimeout;
627        if ((retval = select(m_fd+1,  NULL, &serial, NULL, &WTtimeout)) < 0)
628     {
629               fprintf(stderr,"%s[%d]:select error!---------------\n",__FILE__,__LINE__);
630         return -1;
631        }
632
633     if(retval == 0)
634     {
635         fprintf(stderr,"%s[%d]:select timeout!---------------\n",__FILE__,__LINE__);
636         return -1;
637     }
638
639     //读数据写BUFFER
640        if(FD_ISSET(m_fd,&serial)!=0)
641     {
642         pthread_mutex_lock(&Commutex);
643                  ret = write(m_fd, WriteBuffer ,size);
644         pthread_mutex_unlock(&Commutex);
645
646         if(ret == -1)
647         {
648             printf("serial send data failed -----error!\n");
649             return  -1;
650         }
651     }
652
653         return ret;
654 #else
655     if(m_fd > 0)
656     ret = write(m_fd, WriteBuffer ,size);
657     //       printf("Send cmd %d  \n", ret);
658     if(ret == -1)
659     {
660         TRACE_NET(ERR, "serial send data failed -----!\n");
661         return  -1;
662     }
663
664     return ret;
665 #endif
666 }
667
668
669 int CComTransmit::GetPortFD()
670 {
671     return m_fd;
672 }
673
674 FILE* CComTransmit::GetPortFP()
675 {
676     return m_fp;
677 }
678
679 void  CComTransmit::SetSerialCommBlock(int isBlock)
680 {
681     int    nFlags = fcntl(m_fd, F_GETFL, 0);
682
683     if(isBlock)
684     {
685         fcntl(m_fd, F_SETFL, 0);
686     }
687     else
688     {
689         fcntl(m_fd, F_SETFL, nFlags|O_NONBLOCK);
690     }
691 }
692
693
694 int CComTransmit::ReadComWithBuf(char *ReadBuffer,int size,int *retSize)
695 {
696     fd_set serial;
697     int retval;
698     struct timeval rdtimeout;
699     *retSize = 0;
700     int left = 0;
701     int recvlen = 0;
702
703     if(m_fd < 0)
704     {
705         fprintf(stderr,"%s[%d]:serial have not open!\n",__FILE__,__LINE__);
706         return -1;
707     }
708
709     for(int i = 0;i < size - 1 && i < m_len;i++)
710     {
711         ReadBuffer[i] = m_buf[i];
712         if(m_buf[i] == ‘\n‘)
713         {
714             ReadBuffer[i+1] = 0;
715             memmove(m_buf,&m_buf[i+1],m_len-(i+1));
716             m_len -= (i+1);
717             *retSize = i+1;
718             return *retSize;
719         }
720     }
721
722     FD_ZERO(&serial);
723     FD_SET(m_fd, &serial);
724     rdtimeout = Rtimeout;
725
726     do{
727         retval = select(m_fd+1,  &serial, NULL, NULL, &rdtimeout);
728         if(retval < 0)
729         {
730             if(errno == EINTR)
731             {
732                 //printf("select Interruppter!\n");
733             }
734             else
735             {
736                 break;
737             }
738         }
739     }while(retval == -1);
740
741     if(retval <= 0)
742     {
743         return -1;
744     }
745
746      //读数据写BUFFER
747     if(FD_ISSET(m_fd,&serial)!=0)
748     {
749         if(NULL != m_fp)
750         {
751             left = SERIAL_BUF_LEN - m_len;
752             if(left > 0)
753             {
754                 recvlen = read(m_fd,&m_buf[m_len],left);
755                 if(recvlen > 0)
756                 {
757                     m_len += recvlen;
758                 }
759             }
760             else
761             {
762         //        WRITE_DBG_LOG("串口接收数据512字节内没有换行符号");
763                 m_buf[m_len-1] = 0;
764         //        WRITE_DBG_LOG("%s",m_buf);
765                 m_len = 0;
766                 left = SERIAL_BUF_LEN;
767                 recvlen = read(m_fd,&m_buf[m_len],left);
768                 if(recvlen > 0)
769                 {
770                     m_len += recvlen;
771                 }
772             }
773
774             for(int i = 0;i < size - 1 && i < m_len;i++)
775             {
776                 ReadBuffer[i] = m_buf[i];
777                 if(m_buf[i] == ‘\n‘)
778                 {
779                     ReadBuffer[i+1] = 0;
780                     memmove(m_buf,&m_buf[i+1],m_len-(i+1));
781                     m_len -= (i+1);
782                     *retSize = i+1;
783                     return *retSize;
784                 }
785             }
786         }
787     }
788
789     return -1;
790 }

CComTransmit.cpp

 1 #ifndef _COM_TRANSMIT_H_
 2 #define _COM_TRANSMIT_H_
 3
 4 #include <string.h>
 5 #include <pthread.h>
 6 #include <fcntl.h>
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9
10 #define SERIAL_BUF_LEN  512
11
12 typedef struct {
13     unsigned long         baudrate;    /*波特率*/
14     unsigned char         databit;        /*数据位,取值5、6、7、8*/
15     unsigned char         parity;        /*奇偶校验位,取值‘n‘:无校验‘o‘:奇校验‘e‘偶校验*/
16     unsigned char         stopbit;        /*停止位,取值1,2*/
17     unsigned char         reserve;        /*保留字节*/
18 }Terminal;
19
20 typedef struct
21 {
22     int  sysSpeed;
23     unsigned long  userSpeed;
24 }speedPara;
25
26 typedef enum
27 {
28     READ_TIMEOUT_F = 0,
29     WRITE_TIMEOUT_F
30 }SELECT_TIMEOUT_F;
31
32 class CComTransmit
33 {
34 private:
35     //
36     FILE     *m_fp;
37     int         m_fd;
38     int        m_mutex_flag;
39     struct timeval Rtimeout;
40     struct timeval Wtimeout;
41     int     m_binit;
42     char    m_buf[SERIAL_BUF_LEN];
43     int        m_len;
44
45 public:
46     //
47     CComTransmit();
48     ~CComTransmit();
49     int OpenCom(const char *deviceName, int isMutex = 1);
50     void CloseCom();
51     int SetComSpeed(unsigned int speed);
52     int SetComParity(int databits, int stopbits, int parity,int flowctrl, int Rs485);
53     int SetComRawMode();
54     int SetComRawModeEx();
55     int SetComSelectTimeOut(int sec,int usec,SELECT_TIMEOUT_F RWflag);//0--read,1--wirte
56     int IOFlush();
57     int ReadCom(char *ReadBuffer,int size,int *retSize);
58     int ReadComEx( char *ReadBuffer,int size,int *retSize );
59     int ReadBinCom(char *ReadBuffer,int size);
60     int WriteCom(char *WriteBuffer,int size);
61     int WriteBinCom(char *WriteBuffer,int size);
62
63     int GetPortFD();
64     FILE* GetPortFP();
65     void  SetSerialCommBlock(int isBlock);
66     int ReadComWithBuf(char *ReadBuffer,int size,int *retSize);
67
68
69 protected:
70     //
71 };
72
73 #endif//_COM_TRANSMIT_H_

CComTransmit.h

时间: 2024-10-20 14:58:20

Linux应用编程之串口操作20170901的相关文章

linux 文件编程c语言操作系统调用函数总结(一)

#include <fcntl.h> int open(const char *path, int oflag, ... /* mode_t mode */ ); int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ ); open函数调用成功返回打开文件的文件描述符,失败时返回-1.oflag参数表明打开文件的状态标志,必须且只能包含以下5个标志中的一个: O_RDONLY:只读打开 O_WRONLY:只写

Linux系统编程之进程

前一段时间对文件I/O的基本操作基本操作做了总结,今天这里继续按照我的理解对linux系统编程的进程操作进行总结. 首先我们先理解几个概念:程序.进程.线程. 所谓程序,就是计算机指令的集合,它以文件的形式存储在磁盘上,进程是一个程序在其自身的地址空间中的一次执行活动.而线程进程内的一个执行单元,也是进程内的可调度实体.说完这个不知道大家理解了吗?反正我第一次听到这个概念以后看到的时候可以明白过后就忘记了,现在我给大家举一个例子帮助大家理解,大家都看电视剧吧,所谓程序,就是一个剧本,像什么<西游

MATLAB串口操作和GUI编程

简单的MATLAB GUI编程和串口控制.Word编辑,如需PDF版本,请留言.说实话这个挺难看的……     概述 本文介绍了程序AD9512_Serial_GUI的编程思路和功能.该程序设计到MATLAB的图像用户界面编程的基本方法和串口的基本操作.程序目的在于通过串口写控制字对AD9512进行配置(AD9512通过SPI写入寄存器,本程序只是整个控制程序中的一部分). 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/01/15 V0.0 初始版本,试验版[1]

Linux环境编程之文件I/O(七):目录文件及操作

什么是数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 还有一些概念(数据.数据元素.数据项.数据对象.数据类型...) 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 逻辑结构分为以下四种: 1.集合:集合结构中的数据元素除了同属于一个集合外,之间没有任何关系. 2.线性结构:元素之间一对一. 3.树形结构:一对多. 4.图形结构:多对

Linux学习记录--文件IO操作相关系统编程

文件IO操作相关系统编程 这里主要说两套IO操作接口,分别是: POSIX标准 read|write接口,函数定义在#include<unistd.h> ISO C标准 fread|fwrite接口,函数定义在#include<stdio.h> 有书上说POSIX标准与ISO C标准的区别在于文件读写是否带缓冲区,我则不是很认同,因此POSIX标准下的IO操作也是带缓冲区的,至于这两个标准下的IO性能谁更加好则不一定,因为这和缓冲区的大小,以及用户逻辑有很大关系. POSIX标准

[linux环境编程] 信号的基本概念与操作函数

[linux环境编程] 信号的基本概念与操作函数 一.基本的概念 1.中断的基本概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序. 而在Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常). 硬中断:来自硬件设备的中断 软中断:来自其它程序的中断 2.信号的基本概念 信号是软件中断,提供了一种处理异步事件的方法,可以把他看作是进

Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)

Linux下的IO/文件操作练习,知识虽然简单 但是往往基础容易被忽略,偶尔的练习是有必要的. 练习printf /************************************************************************* > File Name: printf.c > Author: > Mail: > Created Time: Wed 11 Feb 2015 01:08:15 AM PST ***********************

Linux CGI编程基础【整理】

Linux CGI编程基础 1.为什么使用CGI? 如前面所见,任何的HTML均是静态网页,它无法实现一些复杂的功能,而CGI可以为我们实现.如:a.列出服务器上某个目录中的文件,对目录中的文件进行操作:b.通过CGI实现串口通讯:c.实现数据库接口:d.实现从摄像头读取一张图片显示在网页上… 等等 2. CGI是什么? CGI全称是 Common Gate Intergace ,在物理上,CGI是一段程序,它运行在Server上,提供同客户端 Html页面的接口. 3. CGI编程语言 你可以

(46)LINUX应用编程和网络编程之一Linux应用编程框架

3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. (2)典型的嵌入式产品就是基于嵌入式linux操作系统来工作的.典型的嵌入式产品的研发过程就是:第一步让linux系统在硬件上跑起来(系统移植工作),第二步基于linux系统来开发应用程序实现产品功能. (3)基于linux去做应用编程,其实就是通过调用linux的[系统API]来实现应用需要完成