1. 程式人生 > >linux下串列埠轉TCP網路通訊

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.