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. phpmyadmin导入大容量.sql文件

    phpmyadmin导入大容量.sql文件 在phpmyadmin目录文件夹下建立一个文件夹,如importSqlFile 将想要导入的sql文件放入importSqlFile文件夹中 打开confi ...

  2. JS实现hasClass addClass removeClass

    // 判断class有无 function hasClass(ele, cls) { if (ele) { cls = cls || '' if (cls.replace(/\s/g, '').len ...

  3. kali 下安装 vmtools

    网上的教程都是默认路径下的,kali是定制版本的,路径不同,所以首先要找到media下安装包的路径,然后进入该路下,将安装包复制到想要的路径下,并解压缩到想要的路径下,剩下的就跟网上的差不多了,即找到 ...

  4. centos7部署nagios(二)

    一.Nagios简介 分类: 监控 undefined Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系 ...

  5. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  6. 解决input 中placeholder的那些神坑

    **昨天后台小哥哥提到placehold无法显示问题,我这边总结一下,顺便写个小文章分享给大家..** ============================================== 一 ...

  7. python selenium 相关操作

    selenium : 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fi ...

  8. python tkinter菜单

    python3中,Tkinter编写菜单界面案例 from tkinter import * top=Tk() top.wm_title("菜单") top.geometry(&q ...

  9. Jenkins自动打包并部署(以java -jar形势运行)

    1.打包 与平常maven项目打包一致,不再赘述 2.杀死原有进程 通过 pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` 获取当前 ...

  10. Vue-Router的简单使用

    Vue-Router的最简单使用 1.先注册路由 2.将路由注册到VM组件中 3.定义组件 4.页面定义跳转路径 <!DOCTYPE html> <html> <head ...