⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.c.svn-base

📁 modbus rtu协议 linux 平台的实现.读取相关配置文件信息.通过串口发送数据.
💻 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 + -