linux下多线程多串口数据转发程序
2016-01-19 11:17
507 查看
linux下多线程多串口数据转发程序
#include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <linux/un.h> #include <string.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <errno.h> #include <unistd.h> #include <unistd.h> #include <signal.h> #include <sys/ioctl.h> #include <pthread.h> #include <sys/time.h> #include <sys/select.h> #include <fcntl.h> #include <unistd.h> #include"modbus.h" void *modbus_server_client_thread() { while(1) { sleep(1); modbus_t *mb; int16_t tab_reg[32]={0}; mb = modbus_new_rtu("/dev/ttySAC2",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=1000000;//set modbus time 1000ms modbus_set_response_timeout(mb,&t); int regs=modbus_read_registers(mb, 30, 10, tab_reg); printf("%d %d %d %d %d %d %d %d %d %d %d\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]); modbus_free(mb); modbus_close(mb); } } void *modbus_server_slave_thread() { while(1) { int socket; modbus_t *ctx; modbus_mapping_t *mb_mapping; int rc; int use_backend; ctx = modbus_new_rtu("/dev/ttySAC3", 19200, 'N', 8, 1); modbus_set_slave(ctx, 1); modbus_connect(ctx); mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, MODBUS_MAX_READ_REGISTERS, 0); if (mb_mapping == NULL) { fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno)); modbus_free(ctx); return ; } for(;;) { uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH]; rc = modbus_receive(ctx, query); if (rc >= 0) { modbus_reply(ctx, query, rc, mb_mapping); printf("%d,%d,%d,%d, %d,%d,%d,%d, %d,%d,%d,%d, %d,%d,%d,%d, %d,%d,%d,%d\n",query[0],query[1],query[2],query[3],query[4],query[5],query[6],query[7],query[8],query[9],query[10],query[11],query[12],query[13],query[14],query[15],query[16],query[17],query[18],query[19]); } else { /* Connection closed by the client or server */ break; } } printf("Quit the loop: %s\n", modbus_strerror(errno)); modbus_mapping_free(mb_mapping); close(socket); modbus_free(ctx); } } void main() { int ret; pthread_t modbus_client_thread,modbus_slave_thread; pthread_create(&modbus_client_thread,NULL,modbus_server_client_thread,NULL); pthread_create(&modbus_slave_thread,NULL,modbus_server_slave_thread,NULL); /*等待线程结束*/ pthread_join(modbus_client_thread,NULL);//pthread_join会阻塞主线程,等待子线程结束。 pthread_join(modbus_slave_thread,NULL); return; }一个线程串口当主机采集数据,另一个线程串口当从机发送数据。利用libmodbus库,动态编译生成后,运行程序。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍