linux下串口转TCP网络通信

“`

include”test.h”

include”modbus.h”

define BUFFER_SIZE 29

int ret;
modbus_t *mb;
int16_t tab_reg[32]={0};
//初始化串口端口号啊
void ComInit()
{
mb = modbus_new_rtu(“/dev/ttySAC3”,19200,’N’,8,1);//open port
modbus_set_slave(mb,1);//set slave address
modbus_connect(mb);
struct timeval t;
t.tv_sec=0;
t.tv_usec=10000000;//set modbus time 1000ms
modbus_set_response_timeout(mb,&t);
}
void *modbus_server_tcp_slave_thread()
{
printf(“void *modbus_server_tcp_slave_thread()\n”);
char signed2char[2];
int i,k,j;
unsigned int set[2];
char buf[BUFFER_SIZE];
int server_sockfd, client_sockfd;
int sin_size=sizeof(struct sockaddr_in);
struct sockaddr_in server_address;
struct sockaddr_in client_address;
memset(&server_address,0,sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr =INADDR_ANY;
server_address.sin_port = htons(601);
// 建立服务器端socket
if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
{
perror(“server_sockfd creation failed”);
}
// 设置套接字选项避免地址使用错误
int on=1;
if((setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
{
perror(“setsockopt failed”);
exit(EXIT_FAILURE);
}
// 将套接字绑定到服务器的网络地址上
if((bind(server_sockfd,(struct sockaddr *)&server_address,sizeof(struct sockaddr)))<0)
{
perror(“server socket bind failed”);
}
// 建立监听队列
listen(server_sockfd,5);
ComInit();//初始化串口端口
// 等待客户端连接请求到达
while(1)
{
client_sockfd=accept(server_sockfd,(struct sockaddr )&client_address,(socklen_t)&sin_size);
if(client_sockfd<0)
{
perror(“accept client socket failed\n”);
exit(EXIT_FAILURE);
}
// 接收客户端数据
if(recv(client_sockfd,buf,BUFFER_SIZE,0)<0)
{
perror(“recv client data failed”);
exit(EXIT_FAILURE);
}

printf("%x %x %x %x %x %x %x %x %x %x %x %x\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12]);      

k=0;
for(i=0;i<2;i++)
{
signed2char[1]=buf[k+8]; //9
signed2char[0]=buf[k+9]; //10

set[i]=*((unsigned int *)signed2char);    //save
k=k+2;

}
printf(“%d %d\n”,set[0],set[1]);
int regs=modbus_read_input_registers(mb,set[0],set[1],tab_reg);
printf(“%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n”,regs,tab_reg[0],tab_reg[1],tab_reg[2],tab_reg[3],tab_reg[4],tab_reg[5],tab_reg[6],tab_reg[7],tab_reg[8],tab_reg[9],regs,tab_reg[10],tab_reg[11],tab_reg[12],tab_reg[13],tab_reg[14],tab_reg[15],tab_reg[16],tab_reg[17],tab_reg[18],tab_reg[19]);
// int str_len = sizeof(tab_reg)/sizeof(tab_reg[0]);
//printf(“str_len=%d\n”,str_len);
for(i=0;i<20;i++)
{
buf[9+i]=tab_reg[i];
}

    buf[5]=set[1]*2+3;
    buf[8]=20; 
  // 发送数据到客户端   
    if(send(client_sockfd,buf,BUFFER_SIZE,0)<0)  
    {  
    perror("send failed");  
    exit(EXIT_FAILURE);  
    }  
   close(client_sockfd);  
} 

modbus_free(mb);
modbus_close(mb);    
close(server_sockfd);     

}
void main()
{
pthread_t modbus_tcp_slave_thread ;
pthread_create(&modbus_tcp_slave_thread,NULL,modbus_server_tcp_slave_thread,NULL);
/等待线程结束/
//pthread_join会阻塞主线程,等待子线程结束。
pthread_join(modbus_tcp_slave_thread,NULL);
return;
}

TCP服务器部分程序需优化。实现思路:modbus TCP client访问程序中的modbus TCP slave,然后通过调用modbus库访问 串口设备,再将串口设备的数据传给modbus TCP client.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值