“`
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.