mysql监听串口_tcp与串口透传(select)
介绍
tcp作为服务端,监听端口8888,实现串口透传,这里是使用select监听tcp的receive和串口的read,单工通信
-p 指定tcp端口
-s 指定串口
-b 指定波特率 支持4800 9600 115200
-? 打印具体用法
##程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void Test_err(int flg)
{
if(flg<0)
{
perror(strerror(errno));
exit(1);
}
}
int main(int argc, char** argv)
{
printf("usage : %s ?\n",argv[0]);
short listenPort=8888;
unsigned char uart_port[100]={"/dev/ttyS2"};
int bps=0;
unsigned int baudRate= B9600;
int opt;
while ((opt=getopt(argc,argv,"p:s:b:?")) != -1)
{
switch (opt)
{
case 'p':
listenPort = atoi(optarg);
break;
case 's':
memset(uart_port,0,sizeof(uart_port));
strncpy(uart_port,optarg,99);
break;
case 'b':
bps = atoi(optarg);
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-p port -s serial port -b baund] \n",
argv[0]);
exit(EXIT_FAILURE);
}
}
switch(bps)
{
case 4800:
baudRate=B4800;
break;
case 19200:
baudRate=B19200;
break;
case 38400:
baudRate=B38400;
break;
case 57600:
baudRate=B57600;
break;
case 115200:
baudRate=B115200;
break;
default:
baudRate=B9600;
bps=9600;
break;
}
printf("tcp-server...enter\n");
printf("set uartport is %d\n",bps);
printf("set uartspeed is %s\n",uart_port);
printf("set tcpport is %d\n",listenPort);
// uart--------------------------------------------------------
int uart_fd=open(uart_port, O_RDWR | O_NOCTTY | O_NDELAY);
struct termios newtio;
memset(&newtio,0, sizeof( newtio ));
newtio.c_cflag=0;
newtio.c_iflag=0;
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
cfsetispeed(&newtio, baudRate);
cfsetispeed(&newtio, baudRate);
tcflush(uart_fd,TCIFLUSH);
if((tcsetattr(uart_fd,TCSANOW,&newtio))!=0)
{
perror("uart open error\n");
return -1;
}
int portfd;
#if (__GNUC__ == 4 && __GNUC_MINOR__ == 3)
struct my_serial_rs485 rs485conf;
struct my_serial_rs485 rs485conf_bak;
#else
struct serial_rs485 rs485conf;
struct serial_rs485 rs485conf_bak;
#endif
portfd=uart_fd;
/* Driver-specific ioctls: ...\linux-3.10.x\include\uapi\asm-generic\ioctls.h */
#define TIOCGRS485 0x542E
#define TIOCSRS485 0x542F
if (ioctl (portfd, TIOCGRS485, &rs485conf) < 0)
{
/* Error handling.*/
// Log::Inf("ioctl TIOCGRS485 error.\n");
printf( "[ERR] ioctl TIOCGRS485 error.\n");
}
/* Enable RS485 mode: */
rs485conf.flags |= SER_RS485_ENABLED;
/* Set logical level for RTS pin equal to 1 when sending: */
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
//rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
/* set logical level for RTS pin equal to 0 after sending: */
rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
//rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
/* Set rts delay after send, if needed: */
rs485conf.delay_rts_after_send = 0x80;
if (ioctl (portfd, TIOCSRS485, &rs485conf) < 0)
{
/* Error handling.*/
printf("ioctl TIOCSRS485 error.\n");
}
if (ioctl (portfd, TIOCGRS485, &rs485conf_bak) < 0)
{
/* Error handling.*/
printf("ioctl TIOCGRS485 error.\n");
}
/*----------------------------------------------------*/
unsigned char test_msg[]="this is send by uart\n";
int uart_sent_cnt = write(uart_fd, test_msg, sizeof(test_msg));
// tcp--------------------------------------------------------
int listen_fd=-1;
int accept_fd=-1;
int flags;
int max_listen_num=10;
unsigned char r_buf[255];
int n;
struct sockaddr_in server_addr;
struct sockaddr_in clinet_addr;
listen_fd=socket(AF_INET, SOCK_STREAM, 0);
Test_err(listen_fd);
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(listenPort);
int i = 1;/* 允许重复使用本地地址与套接字进行绑定 */
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
flags=bind(listen_fd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr));
Test_err(flags);
flags= listen(listen_fd, max_listen_num);
Test_err(flags);
int clinet_addr_len=sizeof(clinet_addr);
__ACCEPT_AGAIN__:
accept_fd= accept(listen_fd, (struct sockaddr *)&clinet_addr, &clinet_addr_len);
// show clinet message
printf("accept_fd is %d \n",accept_fd);
printf("port=%d\n",ntohs(clinet_addr.sin_port));
unsigned char strbuf[20];
inet_ntop(AF_INET,&clinet_addr.sin_addr,strbuf,sizeof(strbuf));
printf("ip=%s\n",strbuf);
memset(r_buf , 0, sizeof(r_buf));
int maxfd;
fd_set rset, allset;
struct timeval tv;
FD_ZERO(&allset);
FD_SET(uart_fd, &allset);
FD_SET(accept_fd, &allset);
memset(&tv, 0, sizeof(tv));
tv.tv_usec = 1000 * 1000;
int len=0;
while (accept_fd)
{
rset=allset;
maxfd=(accept_fd>uart_fd?accept_fd:uart_fd);
flags=select(maxfd + 1, &rset, NULL, NULL, &tv);
Test_err(flags);
// get from tcp>>>>>uart
if (FD_ISSET(accept_fd, &rset))
{
n = recv(accept_fd, r_buf, 100, 0);
Test_err(n);
if(n)
{
//write(0,r_buf,n);
printf("Get from tcp %d\n",n);
write(uart_fd,r_buf,n);
}
else
{
printf("socket is disconnect\n");
goto __ACCEPT_AGAIN__;
}
}
// get from uart>>>>tcp
else if (FD_ISSET(uart_fd, &rset))
{
usleep(100000);//100ms 这里等待接受多一点的数据
int ret = read(uart_fd, (char*)r_buf,sizeof(r_buf));
if (ret < 0)
{
if ((errno == EAGAIN) ||
(errno == EWOULDBLOCK) ||
(errno == EINTR))
{
printf("Serial,read timeout error:%s. ignore ti!!!", strerror(errno));
ret = 0;
}
}
else
{
printf("Get from uart %d\n",ret);
send(accept_fd, r_buf, ret, 0);
}
}
}
printf("tcp-server...exit\n");
return 0;
}
mysql监听串口_tcp与串口透传(select)相关推荐
- c# 怎样监听已经打开的串口
如题,用C#怎么实现监听已经打开的串口,我从网上查了查都不能实现 实现监视需要的工作很多.你有这功夫,不如买一根1分2的线来做监视了.如果研究之用或是项目必须.要考虑api钩子,勾住createfil ...
- ESP-01S模块通过串口助手进行TCP透传
ESP-01S模块通过串口助手进行TCP透传 使用工具 3.3V电源:ESP-01S模块:USB转TTL接口:串口工具SSCOM V5.13.1 ESP模块设置 1.将ESP模块通过串口与PC进行连接 ...
- 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性
前言 本文从UART串口型WIFI模组的"透传"概念的本质入手,解释了"透传"的实际机理,点出了UART串口型模组的"透传",其目的是为了避 ...
- mysql 监听tcp6_切换MySQL以监听TCP
mysql 监听tcp6 By default, MySQL only allows connections from the localhost address. The configuration ...
- mysql监听地址的设定 —— 解决外部网址无法连接mysql的办法服务器
今天在进行X项目转移时发现新服务器无法连接旧服务器的mysql. 经过确认,mysql的账号密码以及连接主机设置是没有问题的. 于是在旧服务器上查看了端口绑定状态,如图 3306端口只监听了本地loc ...
- 如何修改MySQL监听IP地址
Mysql默认在本地环路地址127.0.0.1的3306端口监听,要使用其它IP地址需要修改配置文件. 1.编辑 vi /etc/mysql/mysql.conf.d/mysqld.cnf (ubun ...
- windows mysql 监听地址_MYSQL地址监听问题
你的位置: 问答吧 -> 服务器 -> 问题详情 MYSQL地址监听问题 RedHat 9 系统 在论坛里找了很久发现通过改/etc/init.d/mysqld这个文件里的 $bindir ...
- 全网最详细、最简单 canal同步mysql 监听单实例、监听多实例 配置
修改涉及的文件 deployer /conf/canal.properties /conf/example/instance.properties canal-adapter /conf/applic ...
- 我的Vu啊(vue 2.0,数据监听,计算属性,组件传参)
提示:个人Vue学习工作总结 (持续更新中如果有不对的地方还请前辈多多指点) 文章目录 vue 计算属性 computed vue 数据监听 wacth 提示:以下是本篇文章正文内容,下面案例可供 ...
最新文章
- java stringbuilder 替换字符串_java中的经典问题StringBuilder替换String
- 大连理工大学计算机原理实验交通灯,大连理工大学计算机原理第四次实验.docx...
- shell getopt 获取参数
- spring-amqp生产者手动ACK
- POJ 1765 November Rain
- Java微服务(三)【本地maven配置与环境变量】(手把手编写,超级详细)
- hive 语句总结_HiveQL查询语句总结
- 一个年轻人为什么毫无欲望?
- nodejs操作mysql查询返回的数据_nodejs连接mysql进行数据库查询返回前台数据的坑...
- Oracle 统计信息收集
- 【KITTI可视化】kitti三维目标标注可视化
- 基于Android设备的 Kali Linux渗透测试教程(内部资料)
- excel 将两列数据合并,以逗号分隔
- arm-linux-gcc踩坑1
- 给不给你升职,领导关心的是什么?
- python猴子分桃子的数学题_小学奥数猴子分桃练习及答案【三篇】
- 时间管理 |《小强升职记》学习笔记 | Part1
- 保护计算机数据库,保护Access2000数据库的安全
- 微机原理之汇编语言程序设计
- ch03:复杂一点的查询
热门文章
- java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
- vivado和modelsim联合仿真实现占空比1:15的分频
- 24分钟让AI跑起飞车类游戏
- 记git升级版本之后出现fatal: NullReferenceException encountered问题
- WebStorm连接Github教程
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
- 00049_super关键字
- Codeforces Round #121 (Div. 1) A. Dynasty Puzzles DP
- 网络流 poj 2195
- linux下安装erlang,以及cowboy的初步接触的一些环境安装