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的更多相关文章

  1. Kali Linux远程连接Windows服务器

    前言: 为了在Kali上远程连接Windows系统的服务器我们需要安装两个工具,rdesktop和tsclient.另外,我们从主机服务商那里购买的Windows操作系统的服务器都是默认开启了远程连接 ...

  2. 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境

    如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...

  3. Web安全相关(三):开放重定向(Open Redirection)

    简介 那些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击.   场景分析 假设有一个正规网站http:// ...

  4. python serial 获取所有的串口名称

    http://blog.csdn.net/qq61394323/article/details/44619511 #!/usr/bin/env python # -*- coding: utf-8 - ...

  5. 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 ...

  6. Serial Port Programming using Win32 API(转载)

    In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...

  7. Serial Communication Protocol Design Hints And Reference

    前面转载的几篇文章详细介绍了UART.RS-232和RS-485的相关内容,可以知道,串口通信的双方在硬件层面需要约定如波特率.数据位.校验位和停止位等属性,才可以正常收发数据.实际项目中使用串口通信 ...

  8. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...

  9. RS-232 vs. TTL Serial Communication(转载)

    RS-232串口一度像现在的USB接口一样,是PC的标准接口,用来连接打印机.Modem和其他一些外设.后来逐渐被USB接口所取代,现在PC上已经看不到它的身影了.开发调试时如果用到串口,一般都是用U ...

随机推荐

  1. docker安装笔记

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相 ...

  2. flume复习(一)

    关于flume官方文档介绍可以去:http://flume.apache.org/看看.接下来就介绍一下关于我个人对flume的理解 一.flume介绍: 1.flume是一个分布式.可靠.和高可用的 ...

  3. String转int,int转String

    String转int 1) int i = Integer.parseInt([String]);  int i = Integer.parseInt([String],[int radix]); 2 ...

  4. easyui,获取tabs标签页内容,以及刷新datagrid

    因为先点开tab页xxx查看表格,再点另一个tab页xxxx修改部分信息,再切换到tab页xxx,tab页xxx里的datagrid表格不会刷新,显示不了修改的信息(在此tab页按F5刷新可以解决,但 ...

  5. 原型链—— javascript

    目录 js面向对象编程 js原型链 共享方法 原型继承 class继承 js面向对象编程 js面向对象编程不同于 java 的类和对象 JavaScript 不区分类和实例的概念,而是通过原型(pro ...

  6. 利用ARouter实现组件间通信,解决子模块调用主模块问题

    如果你还没使用过ARouter请你按照这篇下面博客尝试使用下然后再往下看组件通信的内容(不然的话可能会懵逼)Android Studio接入ARouter以及简单使用 如果你使用过ARouter请继续 ...

  7. 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

    一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...

  8. GPT-2,吓坏创造者的「深度造假写手」

    简评: 今年二月份刷屏的 GPT-2 着实厉害,那个生成续写故事的例子更是效果好到吓人一跳,它到底有多厉害,本文略微讲讲.更详细的信息可参考文末 OpenAI 的博客链接. 你能从下面这两段文字里品味 ...

  9. [工具] BurpSuite--Intruder功能

    BurpSuite--Intruder功能 0x00 配置说明 intruder是进行爆破的,基本流程是标注请求的爆破参数,然后配置字段,选择爆破方式进行爆破,下面来记录下工具的使用 选中intrud ...

  10. Java基本的程序结构设计 大数操作

    大数操作 BigInteger 不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger 提供所有 Java 的基本整数操 ...