serial redirection
int setOption(int fd,int nSpeed, int nBits, char mode,char nEvent, int nStop)
{
struct termios newtio;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE; switch( nBits )
{
case :
newtio.c_cflag |= CS7;
break;
case :
newtio.c_cflag |= CS8;
break;
}
switch( mode )
{
case 'S':
newtio.c_lflag |= ICANON;
newtio.c_lflag |= ECHO;
newtio.c_cc[VMIN] = ;
newtio.c_cc[VTIME] = ;
break;
case 'N':
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
newtio.c_lflag |= ECHOE;
newtio.c_oflag |= ONLCR;
newtio.c_oflag |= OPOST;
newtio.c_cc[VMIN] = ;
newtio.c_cc[VTIME] = ;
break;
case 'M':
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
newtio.c_lflag |= ECHOE;
newtio.c_oflag |= ONLCR;
newtio.c_oflag |= OPOST;
newtio.c_cc[VMIN] = ;
newtio.c_cc[VTIME] = ;
break; default:
break;
}
switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
} switch( nSpeed )
{
case :
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case :
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case :
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case :
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if ( nStop == )
{
newtio.c_cflag &= ~CSTOPB;
}
else if ( nStop == )
{
newtio.c_cflag |= CSTOPB;
}
tcflush(fd,TCIFLUSH);
if ((tcsetattr(fd,TCSANOW,&newtio))!=)
{
perror("com set error");
return -;
}
return ;
} void exitBmconsole(int signum)
{
char muxName[]={0x00};
tcflush(console_fd,TCIFLUSH);
tcflush(uart3_fd,TCIFLUSH);
resetConsoleConfig(); dup2(oldstdin,);
dup2(oldstdout,);
close(uart3_fd);
close(console_fd);
muxClearAll(i2cfd_mux, MUX_SLAVE_ADDR);
close(i2cfd_mux); sprintf(muxName,"MUX%d",gMuxId);
setInUseFlag(muxName,);
exit();
} void *MuxOutputToCom5(void)
{
int nread;
char buff[MAX_BUFF_LEN+];
if ((setOption(uart3_fd,,,'N','N',))<)
{
perror("setOption error");
pthread_exit(NULL);
}
while()
{
memset(buff,,sizeof(char)*( MAX_BUFF_LEN + ));
nread = ;
nread = read(uart3_fd,buff,MAX_BUFF_LEN);
if (nread >)
{
if(buff[] == && buff[] == )
{
write(console_fd,&buff[],nread);
}
else
{
write(console_fd,buff,nread);
}
}
} pthread_exit(NULL);
} void *Com5InputToMux(void)
{
int nread,result;
char buff[MAX_BUFF_LEN+];
char inputBuff[TEMP_ST_LEN+];
int inputNumber = ;
FILE *stream;
int recievExitFlag = ; if ((stream= freopen("/usr/std.in","w+",stdin)) == NULL)
{
printf("freopen stdin fail\n");
kill(getpid(),SIGINT);
}
if ((stream = freopen("/usr/std.out","w+",stdout))== NULL)
{
printf("freopen stdout fail\n");
kill(getpid(),SIGINT);
}
if ((result = setOption(console_fd,,,'M','N',))<)
{
perror("set console_fd opt error");
kill(getpid(),SIGINT);
}
memset(inputBuff,,sizeof(char)*( TEMP_ST_LEN+ )); while()
{
memset(buff,,sizeof(char)*( MAX_BUFF_LEN + )); nread = read(console_fd,buff,MAX_BUFF_LEN);
if (nread > )
{
if( recievExitFlag == )
{
if( (nread != ) || (inputNumber == && nread == && buff[] != LOWER_Q_ASCII) || ( inputNumber == && nread == && buff[] != CR_ASCII) )
{
inputNumber = ;
recievExitFlag = ;
memset(inputBuff,,sizeof(char)*TEMP_ST_LEN);
}
}
if (nread == )
{
if (buff[] == CR_ASCII)
{
if (inputNumber == 0x02 && inputBuff[] == QUIT_IDENTIFY_ASCII && inputBuff[] == LOWER_Q_ASCII)/*quit bmconsole*/
{
exitBmconsole();
}
memset(inputBuff,,sizeof(char)*TEMP_ST_LEN);
inputNumber = ;
recievExitFlag = ;
}
if (inputNumber > MAX_BUFF_LEN)
{
memset(inputBuff,,sizeof(char)*TEMP_ST_LEN);
inputNumber = ;
}
if ( buff[] == QUIT_IDENTIFY_ASCII )
{
recievExitFlag = ;
}
if ( recievExitFlag == )
{
inputBuff[inputNumber++] = buff[];
}
}
if (recievExitFlag != )
{
write(uart3_fd,buff,nread);
}
}
}
pthread_exit(NULL);
}
serial redirection的更多相关文章
- Kali Linux远程连接Windows服务器
前言: 为了在Kali上远程连接Windows系统的服务器我们需要安装两个工具,rdesktop和tsclient.另外,我们从主机服务商那里购买的Windows操作系统的服务器都是默认开启了远程连接 ...
- 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境
如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...
- Web安全相关(三):开放重定向(Open Redirection)
简介 那些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http:// ...
- python serial 获取所有的串口名称
http://blog.csdn.net/qq61394323/article/details/44619511 #!/usr/bin/env python # -*- coding: utf-8 - ...
- Serial Port Programming on Linux(转载)
This is a tutorial on how to program the Serial Ports on your Linux box.Serial Ports are nice little ...
- Serial Port Programming using Win32 API(转载)
In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...
- Serial Communication Protocol Design Hints And Reference
前面转载的几篇文章详细介绍了UART.RS-232和RS-485的相关内容,可以知道,串口通信的双方在硬件层面需要约定如波特率.数据位.校验位和停止位等属性,才可以正常收发数据.实际项目中使用串口通信 ...
- RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)
前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...
- RS-232 vs. TTL Serial Communication(转载)
RS-232串口一度像现在的USB接口一样,是PC的标准接口,用来连接打印机.Modem和其他一些外设.后来逐渐被USB接口所取代,现在PC上已经看不到它的身影了.开发调试时如果用到串口,一般都是用U ...
随机推荐
- luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...
- MySQL on duplicate key update 批量插入并更新已存在数据
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...
- Vue常用修饰符
Vue提供了事件修饰符用于DOM的事件处理,常用的事件修饰符有以下几个: (1). stop:阻止冒泡(通俗讲就是阻止事件向上级DOM元素传递) 点击内层div的结果: 点击外层div的结果: 修改代 ...
- Spring Boot整合Spring Security总结
一.创建Spring Boot项目 引入Thymeleaf和Web模块以及Spring Security模块方便进行测试,先在pom文件中将 spring-boot-starter-security ...
- java面试题全集(下)
这部分主要是开源Java EE框架方面的内容,包括Hibernate.MyBatis.Spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试 ...
- byteArray转换为double,int
/*将int转为低字节在前,高字节在后的byte数组 b[0] = 11111111(0xff) & 01100001 b[1] = 11111111(0xff) & (n & ...
- 【转】在Linux下写一个简单的驱动程序
转自:https://www.cnblogs.com/amanlikethis/p/4914510.html 本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以 ...
- 如何使用 vue-cli 3 的 preset 打造基于 git repo 的前端项目模板
vue-cli 之 Preset vue-cli 插件开发指南 TLDR 背景介绍 vue-cli 3 完全推翻了 vue-cli 2 的整体架构设计,所以当你需要给组里定制一份基于 vue-cli ...
- VS插件CodeRush for Visual Studio发布v19.1.5|新的Inline Lambda重构
CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验.CodeRush能帮助你以极高的效率创建和维护源代码.Consume- ...
- 【vue-router的基础】history了解一下
概述 window.onpopstate是popstate事件在window对象上的事件处理程序. 每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发. 如 ...