介绍

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)相关推荐

  1. c# 怎样监听已经打开的串口

    如题,用C#怎么实现监听已经打开的串口,我从网上查了查都不能实现 实现监视需要的工作很多.你有这功夫,不如买一根1分2的线来做监视了.如果研究之用或是项目必须.要考虑api钩子,勾住createfil ...

  2. ESP-01S模块通过串口助手进行TCP透传

    ESP-01S模块通过串口助手进行TCP透传 使用工具 3.3V电源:ESP-01S模块:USB转TTL接口:串口工具SSCOM V5.13.1 ESP模块设置 1.将ESP模块通过串口与PC进行连接 ...

  3. 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性

    前言 本文从UART串口型WIFI模组的"透传"概念的本质入手,解释了"透传"的实际机理,点出了UART串口型模组的"透传",其目的是为了避 ...

  4. mysql 监听tcp6_切换MySQL以监听TCP

    mysql 监听tcp6 By default, MySQL only allows connections from the localhost address. The configuration ...

  5. mysql监听地址的设定 —— 解决外部网址无法连接mysql的办法服务器

    今天在进行X项目转移时发现新服务器无法连接旧服务器的mysql. 经过确认,mysql的账号密码以及连接主机设置是没有问题的. 于是在旧服务器上查看了端口绑定状态,如图 3306端口只监听了本地loc ...

  6. 如何修改MySQL监听IP地址

    Mysql默认在本地环路地址127.0.0.1的3306端口监听,要使用其它IP地址需要修改配置文件. 1.编辑 vi /etc/mysql/mysql.conf.d/mysqld.cnf (ubun ...

  7. windows mysql 监听地址_MYSQL地址监听问题

    你的位置: 问答吧 -> 服务器 -> 问题详情 MYSQL地址监听问题 RedHat 9 系统 在论坛里找了很久发现通过改/etc/init.d/mysqld这个文件里的 $bindir ...

  8. 全网最详细、最简单 canal同步mysql 监听单实例、监听多实例 配置

    修改涉及的文件 deployer /conf/canal.properties /conf/example/instance.properties canal-adapter /conf/applic ...

  9. 我的Vu啊(vue 2.0,数据监听,计算属性,组件传参)

    提示:个人Vue学习工作总结  (持续更新中如果有不对的地方还请前辈多多指点) 文章目录 vue 计算属性 computed vue  数据监听 wacth 提示:以下是本篇文章正文内容,下面案例可供 ...

最新文章

  1. java stringbuilder 替换字符串_java中的经典问题StringBuilder替换String
  2. 大连理工大学计算机原理实验交通灯,大连理工大学计算机原理第四次实验.docx...
  3. shell getopt 获取参数
  4. spring-amqp生产者手动ACK
  5. POJ 1765 November Rain
  6. Java微服务(三)【本地maven配置与环境变量】(手把手编写,超级详细)
  7. hive 语句总结_HiveQL查询语句总结
  8. 一个年轻人为什么毫无欲望?
  9. nodejs操作mysql查询返回的数据_nodejs连接mysql进行数据库查询返回前台数据的坑...
  10. Oracle 统计信息收集
  11. 【KITTI可视化】kitti三维目标标注可视化
  12. 基于Android设备的 Kali Linux渗透测试教程(内部资料)
  13. excel 将两列数据合并,以逗号分隔
  14. arm-linux-gcc踩坑1
  15. 给不给你升职,领导关心的是什么?
  16. python猴子分桃子的数学题_小学奥数猴子分桃练习及答案【三篇】
  17. 时间管理 |《小强升职记》学习笔记 | Part1
  18. 保护计算机数据库,保护Access2000数据库的安全
  19. 微机原理之汇编语言程序设计
  20. ch03:复杂一点的查询

热门文章

  1. java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
  2. vivado和modelsim联合仿真实现占空比1:15的分频
  3. 24分钟让AI跑起飞车类游戏
  4. 记git升级版本之后出现fatal: NullReferenceException encountered问题
  5. WebStorm连接Github教程
  6. [BZOJ5010][FJOI2017]矩阵填数(状压DP)
  7. 00049_super关键字
  8. Codeforces Round #121 (Div. 1) A. Dynasty Puzzles DP
  9. 网络流 poj 2195
  10. linux下安装erlang,以及cowboy的初步接触的一些环境安装