实验5 多路复用式串口操作
- 格式:docx
- 大小:167.28 KB
- 文档页数:14
使用串口的基本流程1. 概述串口是一种常用的数据通信接口,可以通过串行传输方式将数据发送和接收。
在电子设备中,串口常用于与计算机或其他外部设备进行通信,实现数据传输和控制。
本文介绍了使用串口的基本流程,包括串口的初始化、数据发送和接收等。
通过学习本文,你将了解串口的基本原理和操作方法,并能够在自己的项目中应用串口进行数据通信。
2. 初始化串口在使用串口之前,需要进行串口的初始化设置。
下面是一些常见的串口初始化配置:•设置串口的波特率:波特率是串口通信中传输速度的单位,常见的波特率有9600、115200等。
通过设置波特率,可以保证数据的可靠传输。
•设置数据位、停止位和校验位:数据位指定每个数据字节的位数,常见的数据位有8位。
停止位指定发送一个字节后停止的位数,常见的停止位有1位。
校验位用于检验数据的正确性。
•打开串口并设置参数:通过调用相关的API函数,可以打开串口并进行参数设置。
3. 数据发送一旦串口初始化完成,就可以开始发送数据了。
下面是发送数据的基本流程:1.准备要发送的数据:首先需要准备要发送的数据,可以是单个字节、字符串或其他数据类型。
在发送数据之前,应当确保数据的准确性和完整性。
2.将数据写入串口缓冲区:通过调用相关的API函数,将数据写入串口的发送缓冲区。
写入缓冲区后,数据将会被串口模块自动发送。
3.等待数据发送完成:在数据写入缓冲区之后,需要等待数据发送完成。
可以通过查询串口状态或等待串口中断来判断数据是否发送完成。
4.检查发送结果:发送完成后,应当检查发送结果。
可以通过查询发送状态寄存器或返回值来判断发送是否成功。
4. 数据接收除了发送数据,串口还可以接收外部设备发送的数据。
下面是接收数据的基本流程:1.加载接收缓冲区:在接收数据之前,首先要创建一个接收缓冲区,用于存储接收到的数据。
2.等待数据接收:通过查询串口状态或等待串口中断,可以判断是否有数据接收到。
一旦有数据接收到,接收中断将会被触发。
用多路复用器扩展MCU串口多微控制器(MCU)/微机组成的分布式、主从式系统是现代复杂通信、控制系统的典型解决方案。
分布式环境下的多机协同,要求系统状态和控制信息在多机间进行快速传递,这通常借助简单有效的串行通信方式。
现有的微控制器一般所带的串行接口非常适用于点对点通信的场合;但对于实时性要求高的多机通信场合,这类接口必须在串口数量和功能上进行扩展,才能满足对实时性要求较高的应用场合的需要。
本文讨论了一种适用于多机实时环境下的、新的可重配置串口扩展方案。
图1为本方案框图。
多路复用器是本方案的硬件核心。
方案的要点是利用Mux动态地将MCU的串口在串行通道间切换,以达到串口扩展的目的。
本文中MCU 以89C51为例,Mux 以MAX353为例。
MAX353 是Maxim公司推出的高性能多路复用器,实际可构成两对单刀单掷模拟开关,两对开关状态由一个引脚控制。
MAX353基本参数为导通电阻小于35Ω;导通时间小于175ns,关断时间小于145ns。
以上参数完全满足本方案的使用要求。
以下介绍本串口扩展方案的基本工作原理。
两串行通道和MAX353、89C51的连接两串行通道CH1,CH2通过多路复用器MAX353接到89C51的串口,多路复用器MAX353由89C51的一个I/O引脚控制。
其中串行通道CH2的输出TXD2同时接到89C51的外部中断输入请求INT0或INT1上。
为了适应各种串口通信协议的需要,可在电路中加上电平转换器件,如图1所示。
中断源的使用和设置CH1仍旧使用串口中断,而CH2使用外部中断INT0或INT1(下面以INT0为例)。
当CH2有信息来时,TXD2上将出现起始标志:。
串口通信原理及操作流程串口通信是计算机与外部设备之间进行数据传输的一种通信方式。
串口通信有很多应用领域,比如打印机、调制解调器、传感器、嵌入式系统等等。
本文将介绍串口通信的原理及操作流程。
一、串口通信原理串口通信是通过串行传输来传送数据的。
串行传输是指将数据位按序列发送,每个数据位连续的传输。
串口通信涉及两个主要部分,即发送端和接收端。
发送端将原始数据转换为串行数据流进行发送,接收端则接受数据流并将其转换为原始数据。
串口通信需要两根线缆来进行传输,分别是数据线和控制线。
数据线用于传输数据位,而控制线用于传输控制信号。
串口通信使用的数据传输格式通常是异步串行传输。
异步传输是指数据位之间没有时间关系,每个数据位之间通过起始位和停止位来进行区分。
起始位用于表示数据传输的开始,而停止位则表示数据传输的结束。
此外,数据位的长度和奇偶校验位的设置也是串口通信中需要注意的参数。
二、串口通信操作流程串口通信的操作流程可以分为以下几步:1.打开串口用户需要先打开串口才能进行通信。
打开串口的过程可能需要设置串口的参数,比如波特率、数据位长度、奇偶校验位等等。
2.发送数据一旦串口打开,用户可以通过向串口写入数据来进行发送。
数据可以是任何形式的,比如字符串、二进制数据等等。
3.接收数据接收数据的过程与发送数据的过程相反,用户可以从串口读取数据。
读取到的数据可以进一步处理或者显示。
4.关闭串口通信结束后,用户需要关闭串口以释放相关资源。
以上是串口通信的基本操作流程。
在实际应用中,可能还需要进行更多的操作,比如设置超时时间、错误处理等等。
三、串口通信的注意事项在进行串口通信时1.波特率的设置需要与外部设备保持一致,否则可能无法正常通信。
2.数据位长度、奇偶校验位以及停止位的设置也需要与外部设备保持一致。
3.在进行数据传输之前,最好先进行握手协议以确保通信的可靠性。
4.在进行数据传输时,需要保证发送端和接收端的数据格式是一致的,否则可能会引发数据解析错误。
使用串口的流程介绍串口是一种用于在计算机和外部设备之间进行数据传输的通信接口。
它是一种一对一的全双工通信方式,可以实现数据的收发。
本文将介绍使用串口进行数据通信的基本流程。
步骤使用串口进行数据通信的流程一般包括以下几个步骤:1.打开串口:首先需要打开串口以建立与外部设备的连接。
在打开串口之前,需要先确定要使用的串口号、波特率、数据位、停止位和校验方式等参数。
2.配置串口参数:在打开串口后,需要根据实际需求配置串口的各种参数。
可以通过串口的配置接口来设置波特率、数据位、停止位和校验方式等参数。
3.发送数据:配置完串口参数后,就可以向外部设备发送数据了。
可以通过串口的发送接口将数据发送给外部设备。
在发送数据之前,需要将要发送的数据准备好,并将其转换成适合串口发送的格式。
4.接收数据:在发送完数据后,可以通过串口的接收接口来接收外部设备发送的数据。
可以通过串口的接收缓冲区来获取接收到的数据。
5.处理数据:接收到数据后,还需要对其进行处理。
可以根据实际需求对接收到的数据进行解析、处理或显示等操作。
6.关闭串口:在完成数据通信后,需要关闭串口以释放资源。
可以通过串口的关闭接口来关闭串口。
注意事项在使用串口进行数据通信时,还需要注意以下几个事项:•串口参数配置要与外部设备保持一致:在配置串口参数时,需要与外部设备的参数保持一致,否则可能会导致通信失败。
•数据格式要一致:在发送和接收数据时,要确保数据的格式一致。
可以约定好数据的格式,并在发送和接收时进行相应的转换。
•错误处理:在使用串口进行数据通信时,难免会出现一些错误。
因此,需要在程序中加入错误处理的代码,以便及时发现并处理错误。
•建立通信协议:在使用串口进行数据通信时,建议制定一套通信协议,包括数据的格式、指令的定义等。
这样可以更好地进行数据交换和数据处理。
示例代码下面是一个使用Python语言进行串口数据通信的示例代码:import serial# 打开串口ser = serial.Serial('COM1', 9600, timeout=1)# 配置串口参数ser.bytesize =8ser.stopbits =1ser.parity ='N'# 发送数据ser.write(b'Hello World')# 接收数据data = ser.readline()print(data)# 关闭串口ser.close()总结使用串口进行数据通信时,需要按照一定的流程进行操作。
串口实验实验报告串口实验报告【引言】串口通信是一种常见的数据传输方式,它通过串行传输比特流来实现设备之间的通信。
在本次实验中,我们将通过串口实验来了解串口通信的原理和应用。
【实验目的】本次实验的目的是掌握串口通信的基本原理和使用方法,了解串口通信在实际应用中的作用。
【实验器材】1. 串口模块2. 电脑3. 串口线4. 软件调试工具【实验步骤】1. 连接串口模块和电脑:将串口模块与电脑通过串口线相连。
2. 打开串口调试工具:在电脑上打开串口调试工具,并选择正确的串口号和波特率。
3. 配置串口参数:根据实际需求,设置串口的数据位、校验位、停止位等参数。
4. 发送数据:通过串口调试工具发送数据,观察数据是否成功发送。
5. 接收数据:通过串口调试工具接收数据,确认数据是否成功接收。
6. 分析结果:根据实际情况,分析串口通信的数据传输情况,并记录实验结果。
【实验结果】经过实验,我们成功地使用串口模块进行了数据的发送和接收。
通过串口调试工具,我们可以清晰地观察到数据的传输过程,并确认数据的准确性。
【实验总结】通过本次实验,我们深入了解了串口通信的原理和应用。
串口通信在各个领域都有广泛的应用,例如工业自动化、电子设备控制等。
掌握串口通信的基本原理和使用方法对我们的学习和工作具有重要意义。
【实验感想】本次实验让我更加深入地理解了串口通信的工作原理和使用方式。
通过实际操作,我对串口通信有了更清晰的认识,并对其在实际应用中的作用有了更深刻的理解。
通过这次实验,我也更加意识到了实验的重要性和学习的必要性。
【参考文献】1. 《串口通信原理及应用》2. 《串口通信技术与应用》3. 《串口通信实验教程》【致谢】感谢实验指导老师对本次实验的悉心指导,也感谢实验室的同学们在实验过程中给予我的帮助和支持。
他们的支持和鼓励是我完成本次实验的动力来源。
【附录】实验中使用的串口调试工具下载链接:[下载链接](请自行搜索并下载合适的串口调试工具)以上为本次串口实验的实验报告,通过这次实验,我们对串口通信有了更清晰的认识,并掌握了串口通信的基本原理和使用方法。
串口实验报告串口实验报告一、引言串口是一种常见的通信接口,广泛应用于计算机、嵌入式系统和电子设备中。
本次实验旨在通过实际操作串口通信,掌握串口通信的原理和基本操作。
二、实验目的1. 了解串口通信的基本原理;2. 掌握串口通信的设置和配置方法;3. 实现串口通信的数据传输。
三、实验仪器和材料1. 电脑一台;2. 串口线一根;3. 串口调试助手软件。
四、实验步骤1. 连接串口线:将串口线的一端连接到电脑的串口接口,另一端连接到需要进行通信的设备;2. 打开串口调试助手软件:在电脑上打开串口调试助手软件,并选择正确的串口号和波特率;3. 配置串口参数:根据实际需要,设置数据位、停止位、校验位等串口参数;4. 发送数据:在串口调试助手软件的发送窗口中输入需要发送的数据,并点击发送按钮;5. 接收数据:在串口调试助手软件的接收窗口中查看接收到的数据;6. 关闭串口:实验完成后,关闭串口调试助手软件,并断开串口线的连接。
五、实验结果与分析通过实验操作,我们成功地进行了串口通信,并实现了数据的发送和接收。
在发送数据时,我们可以通过串口调试助手软件输入需要发送的数据,并通过点击发送按钮将数据发送出去。
在接收数据时,我们可以在串口调试助手软件的接收窗口中即时查看到接收到的数据。
六、实验总结通过本次实验,我们深入了解了串口通信的原理和基本操作。
串口通信作为一种常见的通信方式,具有稳定、可靠的特点,广泛应用于各个领域。
掌握串口通信的设置和配置方法,对于进行设备之间的数据传输和通信具有重要意义。
在实验过程中,我们还发现了一些问题。
首先,正确选择串口号和波特率非常重要,否则无法正常进行通信。
其次,串口参数的设置也需要根据实际需求进行调整,不同设备可能需要不同的参数配置。
最后,及时关闭串口和断开连接是保证实验安全的重要步骤,避免设备损坏或数据丢失。
综上所述,本次实验使我们对串口通信有了更深入的了解,并掌握了串口通信的基本操作方法。
第1篇一、实验目的1. 了解串口通信的基本原理和流程。
2. 掌握使用串口发送数据的基本方法。
3. 学习如何通过串口接收并显示接收到的数据。
二、实验原理串口通信是指通过串行接口进行数据传输的一种通信方式。
在计算机系统中,串口通常用于连接外部设备,如打印机、鼠标、键盘等。
串口通信的原理是将数据按位依次发送,每发送一位数据后需要一定的延迟,以保证数据的正确传输。
串口发送显示实验主要涉及以下几个方面:1. 串口初始化:设置串口的波特率、数据位、停止位和校验位等参数。
2. 发送数据:通过串口发送指定的数据。
3. 接收数据:通过串口接收发送端发送的数据。
4. 显示数据:将接收到的数据在屏幕上显示出来。
三、实验环境1. 硬件环境:计算机、串口设备(如打印机、鼠标等)、串口线。
2. 软件环境:操作系统(如Windows、Linux等)、串口通信软件(如PuTTY、串口助手等)。
四、实验步骤1. 连接串口设备:将串口设备通过串口线连接到计算机的串口。
2. 初始化串口:打开串口通信软件,选择正确的串口和波特率,并设置其他参数。
3. 发送数据:在软件中输入要发送的数据,然后点击发送按钮。
4. 接收数据:在软件中观察接收到的数据,确认数据是否正确。
5. 显示数据:在软件中设置数据显示格式,将接收到的数据在屏幕上显示出来。
6. 实验结果分析:根据实验结果,分析串口发送显示实验的原理和步骤。
五、实验结果与分析1. 实验结果:在实验过程中,成功实现了串口发送和显示数据的功能。
2. 实验分析:(1)串口初始化:通过设置串口参数,确保数据能够正确传输。
(2)发送数据:在软件中输入要发送的数据,并通过串口发送出去。
(3)接收数据:通过串口接收发送端发送的数据,并显示在屏幕上。
(4)显示数据:在软件中设置数据显示格式,将接收到的数据在屏幕上清晰显示。
六、实验总结通过本次实验,我们了解了串口通信的基本原理和流程,掌握了使用串口发送数据的基本方法,并学习了如何通过串口接收并显示接收到的数据。
串口调试实验原理
串口调试实验原理主要涉及到串口通信原理和调试实验原理。
串口通信原理:
串口通信是通过物理串口接口传输数据的一种通信方式。
串口通信使用的是异步通信方式,通信双方之间通过发送和接收数据帧进行交互。
数据帧由起始位、数据位、校验位和停止位组成。
起始位信号由高电平转变为低电平,表示数据帧的开始;数据位用来传输数据;校验位用来检验数据的准确性;停止位信号由低电平转变为高电平,表示数据帧的结束。
调试实验原理:
串口调试实验是指通过串口接口进行调试的实验。
通常使用串口调试助手软件,通过串口与目标设备进行通信,实现数据的发送和接收。
调试实验主要包括发送和接收数据的操作。
发送数据:
1. 打开串口:选择合适的串口号和波特率,进行串口初始化操作,打开串口连接。
2. 设置发送数据:设置要发送的数据,可以是ASCII码字符、16进制数据、二进制数据等。
3. 发送数据:通过串口发送数据帧,将要发送的数据传输给目标设备。
接收数据:
1. 打开串口:选择合适的串口号和波特率,进行串口初始化操作,打开串口连接。
2. 接收数据:通过串口接收数据帧,将目标设备发送的数据传输给计算机。
3. 处理接收数据:对接收到的数据进行解析和处理,可以是显示在界面上、保存到文件中、进行数据分析等操作。
通过串口调试实验可以实现与目标设备之间的数据交互,可以用于测试设备的通讯功能是否正常,检测数据传输是否准确可靠,进行数据处理和分析等操作。
串口标准例程讲解
串口(Serial port)是一种用于通过传输数据进行通信的接口标准。
串口通常用于连接计算机与外部设备,例如打印机、调制解调器、传感器等。
下面是一个简单的串口标准例程的讲解:
1. 设置串口参数:首先,需要设置串口的参数,包括波特率(Baud Rate)、数据位(Data Bits)、停止位(Stop Bits)和校验位(Parity)。
这些参数决定了数据的传输方式和格式。
例如,常见的设置是波特率为9600bps,数据位为8位,停止位为1位,无校验位。
2. 打开串口:使用编程语言提供的相应函数,打开串口端口,以便进行数据的收发。
在打开串口时,需要指定串口的名称或编号,例如COM1、COM2等。
3. 发送数据:使用相应的函数将数据发送到串口。
通常,需要将数据转换为字节流的形式,并指定发送的字节数。
例如,在C/C++中,可以使用write()函数发送数据。
4. 接收数据:使用相应的函数从串口接收数据。
同样地,需要指定接收的字节数,并将接收到的数据转换为合适的格式。
在C/C++中,可以使用read()函数进行数据的接收。
5. 关闭串口:在完成使用串口后,应该及时关闭串口,释放资源。
使用相应的函数关闭串口端口。
需要注意的是,在实际应用中,串口通信往往涉及更复杂的协议和数据处理。
例如,可以定义数据包的格式,添加校验和,处理数据的粘包和拆包等。
此外,还需要考虑并发访问和错误处理等情况。
南昌大学实验报告学生姓名:王维学号:6100212202专业班级:网工121班实验类型:□验证□综合□设计□创新实验日期:4/2实验成绩:一、实验项目名称实验5:多路复用式串口操作二、实验项目名称通过编写多路复用式串口读写,进一步理解多路复用函数的用法,同时更加熟练掌握Linux 设备文件的读写方法。
三、实验内容本实验主要实现两台机器(宿主机和目标机)之间的串口通信,每台机器都可以发送和接收数据。
除了串口设备名称不同(宿主机上使用串口1:/dev/ttyS1,而在目标机上使用串口2:/dev/ttyS2),两台机器上的程序基本相同。
四、实验步骤(1)流程图两台机器上的程序使用同样的流程图。
(2)编写代码/* uart_api.h */#ifndef UART_API_H#define UART_API_H#define GNR_COM 0#define USB_COM 1#define COM_TYPE GNR_COM#define MAX_COM_NUM 3#define HOST_COM_PORT 1#define TARGET_COM_PORT 2#define BUFFER_SIZE 1024#define TIME_DELAY 180#define SEL_FILE_NUM 2#define RECV_FILE_NAME "recv.dat"int open_port(int com_port);int set_com_config(int fd,int baud_rate, int data_bits, char parity, int stop_bits); #endif /* UART_API_H *//* uart_api.c */#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include "uart_api.h"/*打开串口函数*/int open_port(int com_port){int fd;#if (COM_TYPE == GNR_COM)char *dev[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2"};#elsechar *dev[] = {"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2"};#endifif ((com_port < 0) || (com_port > MAX_COM_NUM)){return -1;}fd = open(dev[com_port - 1], O_RDWR|O_NOCTTY|O_NDELAY);if (fd < 0){perror("open serial port");return(-1);}/*恢复串口为阻塞状态*/if (fcntl(fd, F_SETFL, 0) < 0){perror("fcntl F_SETFL\n");}/*测试是否为终端设备*/if (isatty(STDIN_FILENO) == 0){perror("standard input is not a terminal device");}return fd;}int set_com_config(int fd,int baud_rate, int data_bits, char parity, int stop_bits){struct termios new_cfg,old_cfg;int speed;/*保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息*/ if (tcgetattr(fd, &old_cfg) != 0){perror("tcgetattr");return -1;}/*步骤一,设置字符大小*/new_cfg = old_cfg;cfmakeraw(&new_cfg);new_cfg.c_cflag &= ~CSIZE;/*设置波特率*/switch (baud_rate){case 2400:{speed = B2400;}break;case 4800:{speed = B4800;}break;case 9600:{speed = B9600;}break;case 19200:{speed = B19200;}break;case 38400:{speed = B38400;}break;default:case 115200:{speed = B115200;}break;}cfsetispeed(&new_cfg, speed);cfsetospeed(&new_cfg, speed);/*设置停止位*/switch (data_bits){case 7:{new_cfg.c_cflag |= CS7;}break;default:case 8:{new_cfg.c_cflag |= CS8;}break;}/*设置奇偶校验位*/switch (parity){default:case 'n':case 'N':{new_cfg.c_cflag &= ~PARENB;new_cfg.c_iflag &= ~INPCK;}break;case 'o':case 'O':{new_cfg.c_cflag |= (PARODD | PARENB);new_cfg.c_iflag |= INPCK;}break;case 'e':case 'E':{new_cfg.c_cflag |= PARENB;new_cfg.c_cflag &= ~PARODD;new_cfg.c_iflag |= INPCK;}break;case 's': /*as no parity*/case 'S':{new_cfg.c_cflag &= ~PARENB;new_cfg.c_cflag &= ~CSTOPB;}break;}/*设置停止位*/switch (stop_bits){default:case 1:{new_cfg.c_cflag &= ~CSTOPB;}break;case 2:{new_cfg.c_cflag |= CSTOPB;}}/*设置等待时间和最小接收字符*/new_cfg.c_cc[VTIME] = 0;new_cfg.c_cc[VMIN] = 1;/*处理未接收字符*/tcflush(fd, TCIFLUSH);/*激活新配置*/if((tcsetattr(fd, TCSANOW, &new_cfg)) != 0) {perror("tcsetattr");return -1;}return 0;}/* com_host.c */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include "uart_api.h"int main(void){int fds[SEL_FILE_NUM], recv_fd, maxfd;char buff[BUFFER_SIZE];fd_set inset,tmp_inset;struct timeval tv;unsigned loop = 1;int res, real_read, i;if ((recv_fd = open(RECV_FILE_NAME, O_CREAT|O_WRONL Y, 0644)) < 0) {perror("open");return 1;}fds[0] = STDIN_FILENO; /* 标准输入*/if((fds[1] = open_port(HOST_COM_PORT)) < 0) /* 打开串口*/{perror("open_port");return 1;}if(set_com_config(fds[1], 115200, 8, 'N', 1) < 0) /* 配置串口*/{perror("set_com_config");return 1;}FD_ZERO(&inset);FD_SET(fds[0], &inset);FD_SET(fds[1], &inset);maxfd = (fds[0] > fds[1])?fds[0]:fds[1];_sec = TIME_DELAY;_usec = 0;printf("Input some words(enter 'quit' to exit):\n");while (loop && (FD_ISSET(fds[0], &inset) || FD_ISSET(fds[1], &inset))){tmp_inset = inset;res = select(maxfd + 1, &tmp_inset, NULL, NULL, &tv);switch(res){case -1:{perror("select");loop = 0;}break;case 0: /* Timeout */{perror("select time out");loop = 0;}break;default:{for (i = 0; i < SEL_FILE_NUM; i++){if (FD_ISSET(fds[i], &tmp_inset)){memset(buff, 0, BUFFER_SIZE);real_read = read(fds[i], buff, BUFFER_SIZE);if ((real_read < 0) && (errno != EAGAIN)){loop = 0;}else if (!real_read){close(fds[i]);FD_CLR(fds[i], &inset);}else{buff[real_read] = '\0';if (i == 0){write(fds[1], buff, strlen(buff));printf("Input some words(enter 'quit' to exit):\n");}else if (i == 1){write(recv_fd, buff, real_read);}if (strncmp(buff, "quit", 4) == 0){loop = 0;}}} /* end of if FD_ISSET */} /* for i */}} /* end of switch */} /* end of while */close(recv_fd);return 0;}/* com_target.c */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include "uart_api.h"int main(void){int fds[SEL_FILE_NUM], recv_fd, maxfd;char buff[BUFFER_SIZE];fd_set inset,tmp_inset;struct timeval tv;unsigned loop = 1;int res, real_read, i;if ((recv_fd = open(RECV_FILE_NAME, O_CREAT|O_WRONL Y, 0644)) < 0) {perror("open");return 1;}fds[0] = STDIN_FILENO; /* 标准输入*/if((fds[1] = open_port(TARGET_COM_PORT)) < 0) /* 打开串口*/{perror("open_port");return 1;}if(set_com_config(fds[1], 115200, 8, 'N', 1) < 0) /* 配置串口*/{perror("set_com_config");return 1;}FD_ZERO(&inset);FD_SET(fds[0], &inset);FD_SET(fds[1], &inset);maxfd = (fds[0] > fds[1])?fds[0]:fds[1];_sec = TIME_DELAY;_usec = 0;printf("Input some words(enter 'quit' to exit):\n");while (loop && (FD_ISSET(fds[0], &inset) || FD_ISSET(fds[1], &inset))){tmp_inset = inset;res = select(maxfd + 1, &tmp_inset, NULL, NULL, &tv);switch(res){case -1:{perror("select");loop = 0;}break;case 0: /* Timeout */{perror("select time out");loop = 0;}break;default:{for (i = 0; i < SEL_FILE_NUM; i++){if (FD_ISSET(fds[i], &tmp_inset)){memset(buff, 0, BUFFER_SIZE);real_read = read(fds[i], buff, BUFFER_SIZE);if ((real_read < 0) && (errno != EAGAIN)){loop = 0;}else if (!real_read){close(fds[i]);FD_CLR(fds[i], &inset);}else{buff[real_read] = '\0';if (i == 0){printf("Input some words(enter 'quit' to exit):\n");write(fds[1], buff, strlen(buff));}else if (i == 1){write(recv_fd, buff, real_read);}if (strncmp(buff, "quit", 4) == 0){loop = 0;}}} /* end of if FD_ISSET */} /* for i */}} /* end of switch */} /* end of while */close(recv_fd);return 0;}(3)分别编译宿主机和目标机的串口程序。