1,Linux 下打开串口设备,信号模型 读写程序

2,串口读写的IO复用Select模型

3, Linux 下打开串口设备,读写程序

1,Linux 下打开串口设备,信号模型 读写程序


root@linux:/tmp/serial# cat main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>  #define FALSE -1
#define TRUE 0  int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] =  {  38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,  19200,  9600,  4800,  2400,  1200,  300, };  void set_speed(int fd, int speed)
{  int   i;   int   status;   struct termios   Opt;  tcgetattr(fd, &Opt);   for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {   if  (speed == name_arr[i]) {       tcflush(fd, TCIOFLUSH);       cfsetispeed(&Opt, speed_arr[i]);    cfsetospeed(&Opt, speed_arr[i]);     status = tcsetattr(fd, TCSANOW, &Opt);    if  (status != 0) {          perror("tcsetattr fd1");    return;       }      tcflush(fd,TCIOFLUSH);     }    }
}  int set_Parity(int fd,int databits,int stopbits,int parity)
{   struct termios options;   if  ( tcgetattr( fd,&options)  !=  0) {   perror("SetupSerial 1");       return(FALSE);    }  options.c_cflag &= ~CSIZE;   switch (databits)   {     case 7:       options.c_cflag |= CS7;   break;  case 8:       options.c_cflag |= CS8;  break;     default:      fprintf(stderr,"Unsupported data size\n"); return (FALSE);    }  switch (parity)   {     case 'n':  case 'N':      options.c_cflag &= ~PARENB;   /* Clear parity enable */  options.c_iflag &= ~INPCK;     /* Enable parity checking */   break;    case 'o':     case 'O':       options.c_cflag |= (PARODD | PARENB);   options.c_iflag |= INPCK;             /* Disnable parity checking */   break;    case 'e':    case 'E':     options.c_cflag |= PARENB;     /* Enable parity */      options.c_cflag &= ~PARODD;      options.c_iflag |= INPCK;       /* Disnable parity checking */  break;  case 'S':   case 's':  /*as no parity*/     options.c_cflag &= ~PARENB;  options.c_cflag &= ~CSTOPB;break;    default:     fprintf(stderr,"Unsupported parity\n");      return (FALSE);    }    switch (stopbits)  {     case 1:      options.c_cflag &= ~CSTOPB;    break;    case 2:      options.c_cflag |= CSTOPB;    break;  default:      fprintf(stderr,"Unsupported stop bits\n");    return (FALSE);   }   /* Set input parity option */   if (parity != 'n')     options.c_iflag |= INPCK;   tcflush(fd,TCIFLUSH);  options.c_cc[VTIME] = 150;   options.c_cc[VMIN] = 0; /* Update the options and do it NOW */  if (tcsetattr(fd,TCSANOW,&options) != 0)     {   perror("SetupSerial 3");     return (FALSE);    }   return (TRUE);
}  int main()
{  int fd;  fd = open("/dev/ttyUSB0",O_RDWR);  if(fd == -1)  {  perror("serialport error\n");  }  else  {  printf("open ");  printf("%s",ttyname(fd));  printf(" succesfully\n");  }  set_speed(fd,115200);  if (set_Parity(fd,8,1,'N') == FALSE)  {  printf("Set Parity Error\n");  exit (0);  }  char buf[] = "1234567890123456789012345678901234567890";int n= write(fd,buf,strlen(buf));  printf("字符串实际长度%zd \n", strlen(buf));printf("成功写入%d \n", n);char buff[512];   int nread;    while(1)  {  if((nread = read(fd, buff, 512))>0)  {  printf("Len: %d:",nread);  buff[nread] = '\0';  printf("%s \n",buff);  }  }  close(fd);  return 0;
}
root@linux:/tmp/serial# gcc -Wall main.c && ./a.out
open /dev/ttyUSB0 succesfully
字符串实际长度40
成功写入40
Len: 32:12345678901234567890123456789012
Len: 8:34567890
^C
root@linux:/tmp/serial#



2,串口读写的IO复用Select模型


root@linux:/tmp/serial# cat main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/signal.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>  #define FALSE -1
#define TRUE 0
#define flag 1
#define noflag 0  int wait_flag = noflag;
int STOP = 0;
int res;  int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] =  {  38400,  19200,  9600,  4800,  2400,  1200,  300,  38400,  19200,  9600,  4800,  2400,  1200,  300, };
void set_speed (int fd, int speed)
{  int i;  int status;  struct termios Opt;  tcgetattr (fd, &Opt);  for (i = 0; i < sizeof (speed_arr) / sizeof (int); i++)  {  if (speed == name_arr[i])  {  tcflush (fd, TCIOFLUSH);  cfsetispeed (&Opt, speed_arr[i]);  cfsetospeed (&Opt, speed_arr[i]);  status = tcsetattr (fd, TCSANOW, &Opt);  if (status != 0)  {  perror ("tcsetattr fd1");  return;  }  tcflush (fd, TCIOFLUSH);  }  }
}  int set_Parity (int fd, int databits, int stopbits, int parity)
{  struct termios options;  if (tcgetattr (fd, &options) != 0)  {  perror ("SetupSerial 1");  return (FALSE);  }  options.c_cflag &= ~CSIZE;  switch (databits)  {  case 7:  options.c_cflag |= CS7;  break;  case 8:  options.c_cflag |= CS8;  break;  default:  fprintf (stderr, "Unsupported data size\n");  return (FALSE);  }  switch (parity)  {  case 'n':  case 'N':  options.c_cflag &= ~PARENB;   /* Clear parity enable */  options.c_iflag &= ~INPCK;    /* Enable parity checking */  break;  case 'o':  case 'O':  options.c_cflag |= (PARODD | PARENB);  options.c_iflag |= INPCK; /* Disnable parity checking */  break;  case 'e':  case 'E':  options.c_cflag |= PARENB;    /* Enable parity */  options.c_cflag &= ~PARODD;  options.c_iflag |= INPCK; /* Disnable parity checking */  break;  case 'S':  case 's':           /*as no parity */  options.c_cflag &= ~PARENB;  options.c_cflag &= ~CSTOPB;  break;  default:  fprintf (stderr, "Unsupported parity\n");  return (FALSE);  }  switch (stopbits)  {  case 1:  options.c_cflag &= ~CSTOPB;  break;  case 2:  options.c_cflag |= CSTOPB;  break;  default:  fprintf (stderr, "Unsupported stop bits\n");  return (FALSE);  }  /* Set input parity option */  if (parity != 'n')  options.c_iflag |= INPCK;  tcflush (fd, TCIFLUSH);  options.c_cc[VTIME] = 150;  options.c_cc[VMIN] = 0;   /* Update the options and do it NOW */  if (tcsetattr (fd, TCSANOW, &options) != 0)  {  perror ("SetupSerial 3");  return (FALSE);  }  return (TRUE);
}  void signal_handler_IO (int status)
{  printf ("received SIGIO signale.\n");  wait_flag = noflag;
}  int main ()
{  int fd;  struct sigaction saio;  fd = open ("/dev/ttyUSB0", O_RDWR);  if (fd == -1)  {  perror ("serialport error\n");  }  else  {  printf ("open ");  printf ("%s", ttyname (fd));  printf (" succesfully\n");  }  saio.sa_handler = signal_handler_IO;  sigemptyset (&saio.sa_mask);  saio.sa_flags = 0;  saio.sa_restorer = NULL;  sigaction (SIGIO, &saio, NULL);  //allow the process to receive SIGIO  fcntl (fd, F_SETOWN, getpid ());  //make the file descriptor asynchronous  fcntl (fd, F_SETFL, FASYNC);  set_speed (fd, 115200);  if (set_Parity (fd, 8, 1, 'N') == FALSE)  {  printf ("Set Parity Error\n");  exit (0);  }  char str[] = "1234567890123456789012345678901234567890";int n= write(fd,str,strlen(str));  printf("字符串实际长度%zd \n", strlen(str));printf("成功写入%d \n", n);char buf[255];  while (STOP == 0)  {  usleep (100000);  /* after receving SIGIO ,wait_flag = FALSE,input is availabe and can be read */  if (wait_flag == 0)  {  memset (buf, 0, sizeof(buf));  res = read (fd, buf, 255);  printf ("nread=%d,%s\n", res, buf);  //    if (res ==1)  //      STOP = 1;       /*stop loop if only a CR was input */  wait_flag = flag; /*wait for new input */  }  }  close (fd);  return 0;
}
root@linux:/tmp/serial# gcc -Wall main.c && ./a.out
open /dev/ttyUSB0 succesfully
字符串实际长度40
成功写入40
received SIGIO signale.
received SIGIO signale.
nread=32,12345678901234567890123456789012
received SIGIO signale.
nread=8,34567890
^C
root@linux:/tmp/serial#


3, Linux 下打开串口设备,读写程序


root@linux:/tmp/serial# cat main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/signal.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>  #define FALSE -1
#define TRUE 0
#define flag 1
#define noflag 0  int wait_flag = noflag;
int STOP = 0;
int res;  int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600,  B4800, B2400, B1200, B300, };
int name_arr[] =  { 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400,  1200, 300, };
void set_speed (int fd, int speed)
{  int i;  int status;  struct termios Opt;  tcgetattr (fd, &Opt);  for (i = 0; i < sizeof (speed_arr) / sizeof (int); i++)  {  if (speed == name_arr[i])  {  tcflush (fd, TCIOFLUSH);  cfsetispeed (&Opt, speed_arr[i]);  cfsetospeed (&Opt, speed_arr[i]);  status = tcsetattr (fd, TCSANOW, &Opt);  if (status != 0)  {  perror ("tcsetattr fd1");  return;  }  tcflush (fd, TCIOFLUSH);  }  }
}  int set_Parity (int fd, int databits, int stopbits, int parity)
{  struct termios options;  if (tcgetattr (fd, &options) != 0)  {  perror ("SetupSerial 1");  return (FALSE);  }  options.c_cflag &= ~CSIZE;  switch (databits)  {  case 7:  options.c_cflag |= CS7;  break;  case 8:  options.c_cflag |= CS8;  break;  default:  fprintf (stderr, "Unsupported data size\n");  return (FALSE);  }  switch (parity)  {  case 'n':  case 'N':  options.c_cflag &= ~PARENB;   /* Clear parity enable */  options.c_iflag &= ~INPCK;    /* Enable parity checking */  break;  case 'o':  case 'O':  options.c_cflag |= (PARODD | PARENB);  options.c_iflag |= INPCK; /* Disnable parity checking */  break;  case 'e':  case 'E':  options.c_cflag |= PARENB;    /* Enable parity */  options.c_cflag &= ~PARODD;  options.c_iflag |= INPCK; /* Disnable parity checking */  break;  case 'S':  case 's':           /*as no parity */  options.c_cflag &= ~PARENB;  options.c_cflag &= ~CSTOPB;  break;  default:  fprintf (stderr, "Unsupported parity\n");  return (FALSE);  }  switch (stopbits)  {  case 1:  options.c_cflag &= ~CSTOPB;  break;  case 2:  options.c_cflag |= CSTOPB;  break;  default:  fprintf (stderr, "Unsupported stop bits\n");  return (FALSE);  }  /* Set input parity option */  if (parity != 'n')  options.c_iflag |= INPCK;  tcflush (fd, TCIFLUSH);  options.c_cc[VTIME] = 150;  options.c_cc[VMIN] = 0;   /* Update the options and do it NOW */  if (tcsetattr (fd, TCSANOW, &options) != 0)  {  perror ("SetupSerial 3");  return (FALSE);  }  return (TRUE);
}  void signal_handler_IO (int status)
{  printf ("received SIGIO signale.\n");  wait_flag = noflag;
}  int main ()
{  int fd;  fd = open ("/dev/ttyUSB0", O_RDWR);  if (fd == -1)  {  perror ("serialport error\n");  }  else  {  printf ("open ");  printf ("%s", ttyname (fd));  printf (" succesfully\n");  }  set_speed (fd, 115200);  if (set_Parity (fd, 8, 1, 'N') == FALSE)  {  printf ("Set Parity Error\n");  exit (0);  }  char str[] = "1234567890123456789012345678901234567890";int n= write(fd,str,strlen(str));  printf("字符串实际长度%zd \n", strlen(str));printf("成功写入%d \n", n);char buf[255];  fd_set rd;  int nread = 0;  while(1)  {  FD_ZERO(&rd);  FD_SET(fd, &rd);  while(FD_ISSET(fd, &rd))  {  if(select(fd+1, &rd, NULL,NULL,NULL) < 0)  {  perror("select error\n");  }  else  {  while((nread = read(fd, buf, sizeof(buf))) > 0)  {  printf("nread= %02d,%s\n",nread, buf);  memset(buf, 0 , sizeof(buf));  }  }  }  }  close (fd);  return 0;
}
root@linux:/tmp/serial# gcc -Wall main.c && ./a.out
open /dev/ttyUSB0 succesfully
字符串实际长度40
成功写入40
nread= 32,12345678901234567890123456789012
nread= 08,34567890

转载于:https://blog.51cto.com/990487026/1901695

Linux C Serial串口编程相关推荐

  1. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  2. Linux应用之串口编程

    /声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了/ Author :tiger-john WebSite :blog.csdn.net/tig ...

  3. Linux基础(7)--串口编程

    串口编程 1. 流程分析 2. 开机启动程序 3. 打开串口 4. 串口初始化 5. 串口发送 6. 串口接收 1. 流程分析 Linux下的串口编程流程主要有四个部分,即打开串口,初始化串口,发送和 ...

  4. linux下的串口编程

    本文转自:http://www.cnblogs.com/jason-lu/articles/3173988.html 做人个人学习使用,绝无侵权之意.如果侵权,请尽快联系,谢谢. Linux下串口编程 ...

  5. 串口通信协议和Linux下的串口编程

    一.串口通信介绍: 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节,尽管比按位字节(byte)的并行通信慢,但是串口可以使用一根线发送数据的同时 ...

  6. Linux 下的串口编程(一)

    Linux下串口编程要知道的那些事 --------------------------------------------------------- Author   :tiger-john<

  7. Linux下c++串口编程

    1 NX串口管理 参见https://blog.csdn.net/weixin_42447868/article/details/109051005?spm=1001.2014.3001.5506 2 ...

  8. 关于linux下UART串口编程的困惑

    之前对struct termios结构体的几个字段一直困惑,主要不知道它的作用,内核对应的struct ktermios结构体如下 struct ktermios {tcflag_t c_iflag; ...

  9. Linux串口编程(中断方式和select方式)

    Linux下的串口编程,在嵌入式开发中占据着重要的地位,因为很多的嵌入式设备都是通过串口交换数据的.在没有操作系统的我们可以使用UART的中断来出来数据的接受和发送,而在Linux操作系统下,我们也可 ...

  10. Linux 下串口编程(C++ 程序设计)

    串口通信是最简单的通信方式.即使在USB 非常流行的今天,依然保留了串行通信的方式.网络上已经有大量关于Linux下 C++ 串口编程的文章,但是我依然要写这篇博文.因为网络上的资料不是内容太多,就是 ...

最新文章

  1. 彭旭老师《项目管理中的领导力与团队建设》
  2. PowerShell-Exchange:统计每天邮件收发
  3. Android SettingProvider详解
  4. 听说面试又挂在计算机操作系统了?仔细看看这个!!!【强烈推荐】
  5. 借助C++类结构计算矩形面积(矩形类)
  6. 华为OSN3500与路由器混合组网
  7. java中点击按钮读取和写入文件实现登录和注册
  8. Java泛型方法解惑
  9. 2018.11.4 东华杯(骇极) REVERSE What's it wp
  10. 家庭影院.液晶电视.液晶电视连接电脑全功略
  11. 【NLP】第8章 将 Transformer 应用于法律和财务文件以进行 AI 文本摘要
  12. 微信小程序的数据绑定
  13. 我告诉你一个 AtomicInteger 的惊天大秘密
  14. 一摞python风格的纸牌(fluent python阅读)
  15. 【托业】toeic托业必背核心词汇_修正版
  16. CK-S650系列HDX半双工RF玻璃管转发器阅读器|读写器之SECS协议验证软件使用说明
  17. 登堂入室之soc开发环境及硬件开发准备
  18. “码二代”从喜欢益智游戏到找最短路线,编程思维是如何培养的?
  19. MobaXterm 详解
  20. 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

热门文章

  1. 38线性映射05——代数与代数同构
  2. python复杂网络库networkx:算法
  3. 在python中的使用Libsvm
  4. Spatial-Channel Sequeeze Excitation (SCSE)-8-June-2018【论文理解】
  5. 开源|如何用Soft-NMS实现目标检测并提升准确率
  6. 迁徙图_2亿农民工10年迁徙图: “中西飞”成大趋势,进城者减少
  7. mysql.5.7 linux_mysql 5.7 linux下的安装
  8. $bzoj1046-HAOI2007$ 上升子序列 $dp$ 贪心
  9. 对此人的嚣张你们怎么看
  10. 四、kafka整体架构