实验5 多路复用式串口操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌大学实验报告
学生姓名:王维学号: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
#include
#include
#include
#include
#include
#include
#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"};
#else
char *dev[] = {"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2"};
#endif
if ((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;
}