串口通信协议和Linux下的串口编程 您所在的位置:网站首页 linux非阻塞串口数据收发 串口通信协议和Linux下的串口编程

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

2024-07-16 12:47| 来源: 网络整理| 查看: 265

一、串口通信介绍: 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节,尽管比按位字节(byte)的并行通信慢,但是串口可以使用一根线发送数据的同时用另一根线接收数据。串口通信属于异步串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

二、串口接头: 常见的串口接头有两种,一种是9针串口(简单DB-9),一种是25针串口(简称DB-25)。

以DB9为例为例,如图: 在这里插入图片描述

母头:泛指所有带孔状的接头(5针朝下,从左到右依次是1~9) 公头:泛指所有带针状的接头(5针朝下,从右到左依次是1~9)

各引脚的功能如下图 在这里插入图片描述 三、TTL电平和RS232电平:

1、TTL(Transistor-Transistor Logic),即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定,+5V等价于逻辑”1”,0V等价于逻辑”0”。 数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定: 输出高电平>=2.4V,输出低电平=2.0V,输入低电平 int fd = -1; int rv = -1; char buf[128]; struct termios options;//该结构体包含串口的选项 /*struct termios { tcflag_t c_iflag; //输入选项 tcflag_t c_oflag; //输出选项 tcflag_t c_cflag; //控制选项 tcflag_t c_lflag; //行选项 cc_t c_cc[NCCS]; //控制字符 }*/ fd_set rset; fd = open("/dev/ttyUSB3",O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备 if(fd printf("tcgetattr failure:%s\n", strerror(errno)); return -2; } options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式 //options.c_cflag &= ~(ECHO |ICANON |ECHOE); options.c_cflag &= ~CSIZE;//先使用CSIZE做位屏蔽 options.c_cflag |= CS8;//设置8位数据位 options.c_cflag &= ~PARENB;//无校验位 /*设置115200波特率*/ cfsetispeed(&options,B115200);//设置输入波特率 cfsetospeed(&options,B115200);//设置输出波特率 options.c_cflag &= ~CSTOPB;//设置一位停止位 options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间 options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数 tcflush(fd, TCIFLUSH);//tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不> 读取出来 rv=tcsetattr(fd, TCSANOW, &options);//设置终端的属性 if(rv != 0) { printf("tcsetattr failure:%s\n",strerror(errno)); close(fd); return -3; } while(1) { FD_ZERO(&rset); FD_SET(fd, &rset); rv = select(fd+1, &rset, NULL, NULL,NULL); if(rv printf("select timeout\n"); close(fd); } memset(buf, 0, sizeof(buf)); rv = read(fd, buf, sizeof(buf)); if(rv int fd = -1; int rv = -1; struct termios options;//该结构体包含串口的选项 /*struct termios { tcflag_t c_iflag; //输入选项 tcflag_t c_oflag; //输出选项 tcflag_t c_cflag; //控制选项 tcflag_t c_lflag; //行选项 cc_t c_cc[NCCS]; //控制字符 }*/ fd = open("/dev/ttyUSB3",O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备 if(fd printf("tcgetattr failure:%s\n", strerror(errno)); return -2; } options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式 //options.c_cflag &= ~(ECHO |ICANON |ECHOE); options.c_cflag &= ~CSIZE;//先使用CSIZE做位屏蔽 options.c_cflag |= CS8;//设置8位数据位 options.c_cflag &= ~PARENB;//无校验位 /*设置115200波特率*/ cfsetispeed(&options,B115200);//设置输入波特率 cfsetospeed(&options,B115200);//设置输出波特率 options.c_cflag &= ~CSTOPB;//设置一位停止位 options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间 options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数 tcflush(fd, TCIFLUSH);//tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不> 读取出来 rv=tcsetattr(fd, TCSANOW, &options);//设置终端的属性 if(rv != 0) { printf("tcsetattr failure:%s\n",strerror(errno)); close(fd); return -3; } while(1) { rv = write(fd, BUF,strlen(BUF)) ; if(rv



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有