利用ptmx搭建本地虚拟串口回环测试环境
2017-12-16 13:06
645 查看
留个备份,执行这个搭建程序可以在当前目录生成ttyNeo1和ttyNeo2两个互连的虚拟串口,在Linux上写上位机和下位机串口通信程序时就不需要利用物理串口测试了。
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <poll.h>
static int alive = 0;
static char buf[8*1024] = {0};
static void neo_handler(int sig)
{
printf("got signal(%d)\n", sig);
alive = 0;
}
int main(int argc, char **argv)
{
int ret = 0;
int m1 = 0;
int m2 = 0;
char *pts = NULL;
struct pollfd pollfds[2];
signal(SIGTERM, neo_handler);
signal(SIGINT, neo_handler);
m1 = open("/dev/ptmx", O_RDWR);
if (m1 < 0) {
printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));
return -1;
}
grantpt(m1);
unlockpt(m1);
m2 = open("/dev/ptmx", O_RDWR);
if (m2 < 0) {
printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_m2;
}
grantpt(m2);
unlockpt(m2);
pts = ptsname(m1);
if (!pts)
goto err_pts;
remove("./ttyNeo1");
ret = symlink(pts, "./ttyNeo1");
if (ret < 0) {
printf("create ./ttyNeo1 failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_pts;
}
pts = ptsname(m2);
remove("./ttyNeo2");
ret = symlink(pts, "./ttyNeo2");
if (ret < 0) {
printf("create ./ttyNeo2 failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_pts;
}
memset(&pollfds, 0, sizeof(pollfds));
pollfds[0].fd = m1;
pollfds[0].events = POLLIN;
pollfds[1].fd = m2;
pollfds[1].events = POLLIN;
alive = 1;
while (alive) {
ret = poll(&pollfds[0], 2, 500);
if ((ret < 0) && (errno == EINTR) || (ret == 0))
continue;
else if (ret < 0) {
printf("poll failed, errno=%d(%s)\n", errno, strerror(errno));
break;
}
if (pollfds[0].revents & POLLIN) {
memset(buf, 0, sizeof(buf));
ret = read(m1, buf, sizeof(buf));
if (ret > 0)
write(m2, buf, ret);
pollfds[0].revents = 0;
}
if (pollfds[1].revents & POLLIN) {
memset(buf, 0, sizeof(buf));
ret = read(m2, buf, sizeof(buf));
if (ret > 0)
write(m1, buf, ret);
pollfds[1].revents = 0;
}
}
err_pts:
close(m2);
m2 = -1;
err_m2:
close(m1);
m1 = -1;
return 0;
}
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <poll.h>
static int alive = 0;
static char buf[8*1024] = {0};
static void neo_handler(int sig)
{
printf("got signal(%d)\n", sig);
alive = 0;
}
int main(int argc, char **argv)
{
int ret = 0;
int m1 = 0;
int m2 = 0;
char *pts = NULL;
struct pollfd pollfds[2];
signal(SIGTERM, neo_handler);
signal(SIGINT, neo_handler);
m1 = open("/dev/ptmx", O_RDWR);
if (m1 < 0) {
printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));
return -1;
}
grantpt(m1);
unlockpt(m1);
m2 = open("/dev/ptmx", O_RDWR);
if (m2 < 0) {
printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_m2;
}
grantpt(m2);
unlockpt(m2);
pts = ptsname(m1);
if (!pts)
goto err_pts;
remove("./ttyNeo1");
ret = symlink(pts, "./ttyNeo1");
if (ret < 0) {
printf("create ./ttyNeo1 failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_pts;
}
pts = ptsname(m2);
remove("./ttyNeo2");
ret = symlink(pts, "./ttyNeo2");
if (ret < 0) {
printf("create ./ttyNeo2 failed, errno=%d(%s)\n", errno, strerror(errno));
goto err_pts;
}
memset(&pollfds, 0, sizeof(pollfds));
pollfds[0].fd = m1;
pollfds[0].events = POLLIN;
pollfds[1].fd = m2;
pollfds[1].events = POLLIN;
alive = 1;
while (alive) {
ret = poll(&pollfds[0], 2, 500);
if ((ret < 0) && (errno == EINTR) || (ret == 0))
continue;
else if (ret < 0) {
printf("poll failed, errno=%d(%s)\n", errno, strerror(errno));
break;
}
if (pollfds[0].revents & POLLIN) {
memset(buf, 0, sizeof(buf));
ret = read(m1, buf, sizeof(buf));
if (ret > 0)
write(m2, buf, ret);
pollfds[0].revents = 0;
}
if (pollfds[1].revents & POLLIN) {
memset(buf, 0, sizeof(buf));
ret = read(m2, buf, sizeof(buf));
if (ret > 0)
write(m1, buf, ret);
pollfds[1].revents = 0;
}
}
err_pts:
close(m2);
m2 = -1;
err_m2:
close(m1);
m1 = -1;
return 0;
}
相关文章推荐
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- 本地 Mac 搭建 IPv6 测试环境
- hadoop本地环境测试搭建(windows)
- ubuntu环境利用Vagrant搭建一个虚拟开发环境
- [2]微信开发学习总结——微信开发本地测试环境搭建(Ngrok)
- wampserver配置本地测试环境_虚拟主机实现多站点
- 本地测试环境搭建(二)
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- chef-server本地虚拟环境搭建
- Windows环境下新浪SAE本地开发环境搭建及简单测试
- kafka本地测试环境搭建
- SAP本地测试环境搭建
- 利用Nginx反向代理与负载均衡搭建多人测试环境详解
- 微信开发——本地测试环境搭建
- kafka本地环境的搭建,以及本地java测试的调用
- 使用Vmware ESX 4.0搭建虚拟测试环境(一)
- hadoop-2.5.2本地测试环境下(利用java多线程模拟),提交MapReduce任务时出现的错误及解决办法
- 利用Hyper-V虚拟测试环境
- 苹果app上传AppStore因为IPv6被拒绝,本地搭建IPv6测试环境