Linux C Serial串口编程
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串口编程相关推荐
- C——Linux下的串口编程
原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...
- Linux应用之串口编程
/声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了/ Author :tiger-john WebSite :blog.csdn.net/tig ...
- Linux基础(7)--串口编程
串口编程 1. 流程分析 2. 开机启动程序 3. 打开串口 4. 串口初始化 5. 串口发送 6. 串口接收 1. 流程分析 Linux下的串口编程流程主要有四个部分,即打开串口,初始化串口,发送和 ...
- linux下的串口编程
本文转自:http://www.cnblogs.com/jason-lu/articles/3173988.html 做人个人学习使用,绝无侵权之意.如果侵权,请尽快联系,谢谢. Linux下串口编程 ...
- 串口通信协议和Linux下的串口编程
一.串口通信介绍: 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节,尽管比按位字节(byte)的并行通信慢,但是串口可以使用一根线发送数据的同时 ...
- Linux 下的串口编程(一)
Linux下串口编程要知道的那些事 --------------------------------------------------------- Author :tiger-john<
- Linux下c++串口编程
1 NX串口管理 参见https://blog.csdn.net/weixin_42447868/article/details/109051005?spm=1001.2014.3001.5506 2 ...
- 关于linux下UART串口编程的困惑
之前对struct termios结构体的几个字段一直困惑,主要不知道它的作用,内核对应的struct ktermios结构体如下 struct ktermios {tcflag_t c_iflag; ...
- Linux串口编程(中断方式和select方式)
Linux下的串口编程,在嵌入式开发中占据着重要的地位,因为很多的嵌入式设备都是通过串口交换数据的.在没有操作系统的我们可以使用UART的中断来出来数据的接受和发送,而在Linux操作系统下,我们也可 ...
- Linux 下串口编程(C++ 程序设计)
串口通信是最简单的通信方式.即使在USB 非常流行的今天,依然保留了串行通信的方式.网络上已经有大量关于Linux下 C++ 串口编程的文章,但是我依然要写这篇博文.因为网络上的资料不是内容太多,就是 ...
最新文章
- 彭旭老师《项目管理中的领导力与团队建设》
- PowerShell-Exchange:统计每天邮件收发
- Android SettingProvider详解
- 听说面试又挂在计算机操作系统了?仔细看看这个!!!【强烈推荐】
- 借助C++类结构计算矩形面积(矩形类)
- 华为OSN3500与路由器混合组网
- java中点击按钮读取和写入文件实现登录和注册
- Java泛型方法解惑
- 2018.11.4 东华杯(骇极) REVERSE What's it wp
- 家庭影院.液晶电视.液晶电视连接电脑全功略
- 【NLP】第8章 将 Transformer 应用于法律和财务文件以进行 AI 文本摘要
- 微信小程序的数据绑定
- 我告诉你一个 AtomicInteger 的惊天大秘密
- 一摞python风格的纸牌(fluent python阅读)
- 【托业】toeic托业必背核心词汇_修正版
- CK-S650系列HDX半双工RF玻璃管转发器阅读器|读写器之SECS协议验证软件使用说明
- 登堂入室之soc开发环境及硬件开发准备
- “码二代”从喜欢益智游戏到找最短路线,编程思维是如何培养的?
- MobaXterm 详解
- 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
热门文章
- 38线性映射05——代数与代数同构
- python复杂网络库networkx:算法
- 在python中的使用Libsvm
- Spatial-Channel Sequeeze Excitation (SCSE)-8-June-2018【论文理解】
- 开源|如何用Soft-NMS实现目标检测并提升准确率
- 迁徙图_2亿农民工10年迁徙图: “中西飞”成大趋势,进城者减少
- mysql.5.7 linux_mysql 5.7 linux下的安装
- $bzoj1046-HAOI2007$ 上升子序列 $dp$ 贪心
- 对此人的嚣张你们怎么看
- 四、kafka整体架构