📄 modbus.c.svn-base
字号:
/****************************************************************************** * * Copyright (c) 2008 Shanghai IS Software * * All rights reserved * * $Revision$ * * $LastChangedBy$ * * $LastChangedData$ * * Description: * * Revision History: * 2008/08/28 14:33 by lcj * #1.created * *****************************************************************************/#include "md/md_manager.h"#include "md/md_info.h"#include "md/md_reg.h"#include "modbus_rtu/modbus.h"unsigned char tx_buf[MAX_TX];unsigned char rx_buf[MAX_RX];unsigned char rx_count,tx_count;unsigned char num;unsigned char caddrcode;unsigned char dev_addr;unsigned char command; unsigned char port_no;char file_data[MAX_CONF_DATA][MAX_CONF];char dev_name[MAX_DEV_NAME];int speed;int timeout;int fiequecy;int OpenDev(char *dev){ int fd = open(dev, O_RDWR | O_NONBLOCK ); if ( -1 == fd ) { perror("Can't Open Serial Port!\n"); return -1; } else return fd;} void uart_init(int fd){ set_speed(fd,9600); if ( set_parity(fd,8,1,'E') == FALSE ) { printf("Set Parity Error\n"); close(fd); exit(0); }}unsigned short crc_check(unsigned char *snd,unsigned char num){ unsigned char i,j; unsigned short c,crc = 0xFFFF; for ( i = 0; i < num; i++ ) { c = snd[i] & 0x00FF; crc ^= c; for ( j = 0; j < 8; j++ ) { if ( crc & 0x0001 ) { crc >>= 1; crc ^= 0xA001; } else crc >>= 1; } } return crc;}void delay(int time){ int i,j; for ( i = 0; i < time; i++ ) for ( j = 0; j < 0x5000; j++ ); }unsigned short makeword(unsigned char a,unsigned char b){ unsigned short temp; temp = (a << 8) + b; temp &= 0xffff; return temp;}void str2num(unsigned char *buff_der, char *buff_src){ int i,j; unsigned char temp1,temp2; for( j = 0,i = 0; buff_src[i] != '\0';i += 2,j++) { if ( buff_src[i] >= 'a' ) { temp1 = buff_src[i] - 'a' + 10; } else { temp1 = buff_src[i] - '0'; } if ( buff_src[i+1] >= 'a' ) { temp2 = buff_src[i+1] - 'a' + 10; } else { temp2 = buff_src[i+1] - '0'; } buff_der[j] = (((temp1 << 4) + temp2)); }} void set_fl(int fd, int flag){ int val; if ( (val = fcntl(fd,F_GETFL,0)) < 0) { printf("fcntl F_GETFL error!\n"); close(fd); exit(0); } val |= flag; if (fcntl(fd,F_SETFL,val) < 0 ) { printf("fcntl F_SETFL error!\n"); close(fd); exit(0); }}int sendframe(int fd, const unsigned char *buf){ int ret,i;#if 1 printf("Send Data:"); for (i = 0; i < 8; i++ ) printf("0x%x ",buf[i]); printf("\n");#endif ret = write(fd,buf,8); if ( ret < 0 ) { printf("send data error!\n"); close(fd); exit(0); } return ret;}int readframe(int fd){ int i,n,max_fd,len,j = 0; fd_set input; struct timeval timeout; unsigned char buff[MAX_LEN]; unsigned char *ptr = buff; FD_ZERO(&input); FD_SET(fd,&input); max_fd = fd + 1; printf("Recv Data:"); while (1) { timeout.tv_sec = 1; timeout.tv_usec = 0; n = select(max_fd,&input,NULL,NULL,&timeout); if ( n < 0 ) { perror("select failed"); break; } else if ( n == 0 ) { puts("\nTIMEOUT"); break; } else { ioctl(fd,FIONREAD,&len); if ( !len ) { fprintf(stderr,"Communication closed by server!\n"); close(fd); exit(0); } len = read(fd,ptr,len); if ( len < 0 ) { printf("read fail !\n"); close(fd); exit(0); } rx_count += len; for ( i = 0; i < len; i++ ) { rx_buf[j++] = buff[i]; printf("0x%x ",buff[i]); } //ptr[len] = '\0'; } } return 0;}int parseframe(unsigned char *buff){ unsigned char myaddrcode; unsigned char myfuncode; unsigned short wcrc; unsigned short number; MD_reg_addr regs_addr[NUM_OF_REGS]; MD_reg_value regs_value[NUM_OF_REGS]; MD_info* info; int i,j; int result; for ( i = 0; i <= MAX_FOR_REG_ADDR; i++ ) regs_addr[i] = (MD_reg_addr)i; for ( i = 0; i <= MAX_FOR_REG_ADDR; i++ ) regs_value[i] = 0; wcrc = makeword(buff[rx_count-1],buff[rx_count-2]); if (wcrc != crc_check(buff,rx_count -2)) { printf("Recv Data Err!\n"); return FALSE; } for (j = 4,i = 0; i < num ; i++,j+= 2 ) { regs_value[i] = makeword(buff[j-1],buff[j]); } result = init_MD_manager(2, 5, 500); if ( result ) { info = create_MD_info(dev_name,port_no,dev_addr, NUM_OF_REGS, regs_addr); if(info) { if ( 0x01 == num ) set_MD_reg_value(info,caddrcode, makeword(buff[rx_count-4],buff[rx_count - 3])); else set_MD_regs_value(info,caddrcode, num, regs_value); } print_MD_manager(get_MD_manager()); info = get_MD_info(port_no, dev_addr); if (info) { printf("The Get Value: "); get_MD_reg_value(info,0x20,&number); printf("0x%x\n",number); } } }char *trim(char *str){ int len,i = 0; char *pRet = str; while ((' ' == (*pRet))||('\t' == (*pRet))) { pRet++; } len = strlen(pRet); while (len > 0) { if ((' ' == pRet[len-1]) || ('\t' == pRet[len-1]) || ('\n' == pRet[len-1])|| ('\r' == pRet[len-1])) len--; else { break; } } *(pRet + len) = '\0'; return pRet;}void do_string(char *str){ int len,j,i = 0; char *pstr = str; char *delim = "[]\t "; char *p; len = strlen(str); if ((*pstr) != '[' || pstr[len - 1] != ']' ) { printf("config file error!\n"); exit(0); } strcpy(file_data[i++],strtok(pstr,delim)); while(p = strtok(NULL,delim)) { strcpy(file_data[i++],p); } printf("Config File:"); for ( j = 0; j < i; j++ ) { printf("%s ",file_data[j]); } printf("\n"); sscanf(file_data[0],"%x",&port_no); sscanf(file_data[1],"%d",&speed); strcpy(dev_name,file_data[2]); sscanf(file_data[3],"%x",&dev_addr); sscanf(file_data[4],"%d",&timeout); sscanf(file_data[5],"%x",&command); sscanf(file_data[6],"%x",&caddrcode); sscanf(file_data[7],"%x",&num); sscanf(file_data[8],"%d",&fiequecy); return ;} int main(int argc ,char **argv){ int fd; int i = 0; FILE *pFILE; unsigned short crc; char linebuf[CONFIGMAXLINE]; char *pLine; pFILE = fopen(CONFIG_FILE,"r"); if ( NULL == pFILE ) { printf("fopen file error!\n"); exit(0); } while ( pLine = fgets(linebuf,CONFIGMAXLINE-1,pFILE) ) { pLine = trim(pLine); if ( strlen(pLine) < 3) continue; if ('#' == (*pLine)) continue; delay(10); //??? do_string(pLine); tx_buf[0] = dev_addr; tx_buf[1] = command; tx_buf[2] = 0; tx_buf[3] = caddrcode; tx_buf[4] = 0; tx_buf[5] = num; crc = crc_check(tx_buf, 6); tx_buf[6] = crc & 0xff; tx_buf[7] = crc/0x100; tx_count = 8; fd = OpenDev(DEV_NAME0); uart_init(fd); set_fl(fd,O_RDWR); sendframe(fd,tx_buf); readframe(fd); parseframe(rx_buf); close(fd); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -