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

📄 com_client.c

📁 linux下的串口编程软件!很好用 详细的介绍了MODBUS的协议内容 包括传输格式
💻 C
字号:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/times.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
//
#include <pthread.h>
#include <semaphore.h>
//
#include     <sys/stat.h>   /**/
#include     <errno.h>      /*错误号定义*/
//////////////////////////////////////////////////////////////////////////
typedef struct  {
	char prompt;
	int baudrate;
	char databit;
	char debug;
	char echo;
	char fctl;
	char tty;
	char parity;
	char stopbit;
	const int reserved;
}portinfo_t;

typedef portinfo_t *pportinfo_t;
//////////////////////////////////////////////////////////////////////////
#define  TTY_DEV "/dev/ttyS"
#define TIMEOUT_SEC(buflen,baud)(buflen*20/baud+2)
#define TIMEOUT_USEC 0
//////////////////////////////////////////////////////////////////////////
sem_t bin_sem;
//////////////////////////////////////////////////////////////////////////
char *get_ptty(pportinfo_t pportinfo)
{
	char *ptty;

	switch(pportinfo->tty) 
	{
	case '0':
		ptty=TTY_DEV"0";
		break;
	case '1':
		ptty=TTY_DEV"1";
		break;
	case '2':
		ptty=TTY_DEV"2";
		break;
	default:
		ptty=TTY_DEV"0";
	}
	return(ptty);
}
//////////////////////////////////////////////////////////////////////////
int convbaud(unsigned long baudrate)
{
	switch(baudrate) 
	{
	case 2400:
		return B2400;
	case 4800:
		return B4800;
	case 9600:
		return B9600;
	case 38400:
		return B38400;
	case 57600:
		return B57600;
	case 115200:
		return B115200;
	default:
		return B115200;
	}
}
//////////////////////////////////////////////////////////////////////////
int PortSet(int fdcom, const pportinfo_t pportinfo)
{
	struct termios termios_old, termios_new;
	int baudrate, tmp;
	char databit,stopbit,parity,fctl;

	bzero(&termios_old,sizeof(termios_old));
	bzero(&termios_new,sizeof(termios_new));
	
	cfmakeraw(&termios_new);
	tcgetattr(fdcom,&termios_old);
	
	//baudrate
	baudrate=convbaud(pportinfo->baudrate);
	cfsetispeed(&termios_new,baudrate);
	cfsetospeed(&termios_new,baudrate);
	termios_new.c_cflag |=CLOCAL;
	termios_new.c_cflag |=CREAD;

	//
	fctl=pportinfo->fctl;
	switch(fctl) {
	case '0':
		termios_new.c_cflag &= ~CRTSCTS;
		break;
	case '1':
		termios_new.c_cflag |= CRTSCTS;
		break;
	case '2':
		termios_new.c_iflag |= IXON|IXOFF|IXANY;
		break;
	}

	//
	termios_new.c_cflag &= ~CSIZE;
	databit=pportinfo->databit;
	switch(databit) 
	{
	case '5':
		termios_new.c_cflag |=CS5;
		break;
	case '6':
		termios_new.c_cflag |=CS6;
		break;
	case '7':
		termios_new.c_cflag |=CS7;
		break;	
	default:
		termios_new.c_cflag |=CS8;
	}
		
	//
	parity=pportinfo->parity;
	switch(parity) 
	{
	case '0':
		termios_new.c_cflag &=~PARENB;
		break;
	case '1':
		termios_new.c_cflag |=PARENB;
		termios_new.c_cflag &=~PARODD;
		break;
	case '2':
		termios_new.c_cflag |=PARENB;
		termios_new.c_cflag |=~PARODD;
		
		break;
	default:
	}

	//
	stopbit=pportinfo->stopbit;
	if (stopbit=='2') 
	{
		termios_new.c_cflag |=CSTOPB;
	}
	else
	{
		termios_new.c_cflag &=~CSTOPB;
	}

	//
	termios_new.c_oflag &=~OPOST;
	termios_new.c_cc[VMIN]=1;
	termios_new.c_cc[VTIME]=1;

	 tcflush(fdcom,TCIFLUSH);
	 tmp=tcsetattr(fdcom,TCSANOW,&termios_new);
	 tcgetattr(fdcom,&termios_old);

	 return(tmp);
}
//////////////////////////////////////////////////////////////////////////
int PortOpen(pportinfo_t pportinfo)
{
	int fdcom;
	char *ptty;

	ptty=get_ptty(pportinfo);
	fdcom=open(ptty,O_RDWR|O_NOCTTY|O_NONBLOCK);

	return(fdcom);
}
//////////////////////////////////////////////////////////////////////////
void PortClose(int fdcom)
{
	close(fdcom);
}
//////////////////////////////////////////////////////////////////////////
int PortSend(int fdcom, char *data, int datalen)
{
	int len=0;
	len=write(fdcom,data,datalen);
	if (len==datalen) 
	{
		return(len);
	}
	else
	{
		tcflush(fdcom,TCOFLUSH);
		return -1;
	}

}
//////////////////////////////////////////////////////////////////////////
int PortRecv(int fdcom,char *data, int datalen,int baudrate)
{
	int readlen,fs_sel;
	fd_set fs_read;
	struct timeval tv_timeout;

	FD_ZERO(&fs_read);
	FD_SET(fdcom,&fs_read);
	tv_timeout.tv_sec=TIMEOUT_SEC(datalen,baudrate);
	tv_timeout.tv_usec=TIMEOUT_USEC;

	fs_sel=select(fdcom+1,&fs_read,NULL,NULL,&tv_timeout);
	if (fs_sel) 
	{
		readlen=read(fdcom,data,datalen);
		return(readlen);
	}
	else
	{
		return(-1);
	}
	return(readlen);
}
//////////////////////////////////////////////////////////////////////////
void *thread_function(void *arg) 
{
    sem_wait(&bin_sem);
	 printf("sssssssssssssssssss\n");
	 sem_wait(&bin_sem);
//    while(strncmp("end", work_area, 3) != 0) 
//	{
//        printf("You input %d characters\n", strlen(work_area) -1);
//        sem_wait(&bin_sem);
//    }

    pthread_exit(NULL);
}
//////////////////////////////////////////////////////////////////////////
int main(int argc,char *argv[])
{
	int fdcom,i,SendLen,RecvLen,res;
	struct termios termios_cur;
	char RecvBuf[10];

	portinfo_t portinfo=
	{
		'0',//print prompt after receiving
		115200,//baudrate 9600
		'8',//databit 8
		'0',//debug:off
		'0',//echo:off
		'2',//flow control:software
		'1',//default ttyS0
		'0',//parity
		'1',//stopbit
		0//reserved
	};

	//
	if (argc !=2) 
	{
		printf("usage:<type0-send1-recvice>\n");
		printf("     eg:");
		printf("        MyPort0");
		exit(-1);
	}

	//
	fdcom=PortOpen(&portinfo);
	if (fdcom<0) {
		printf("error open serial error!\n");
		exit(1);
	}
	
	//
	PortSet(fdcom,&portinfo);

	if (atoi(argv[1])==0) 
	{
		for(i=0;i<100;i++)
		{
			SendLen=PortSend(fdcom,"1234567",10);
			if (SendLen>0) 
			{
				printf("\n No %d send %d data 1234567.\n",i,SendLen);
			}
			else
			{
				printf("error:send failed\n");
			}
			sleep(1);
		}
		PortClose(fdcom);
	}
	else
	{
		for(;;)
		{
			RecvLen=PortRecv(fdcom,RecvBuf,10,portinfo.baudrate);
			if(RecvLen>0) 
			{
				for(i=0;i<RecvLen;i++)
				{
					printf("\n recevie data No %d is %x.\n",i,RecvBuf[i]);
				}
			    printf("\n Total frame length is %d.\n",RecvLen);
				//
				sem_post(&bin_sem);
			}
			else
			{
				printf("error:receive error\n");
			}
			sleep(2);
		}
	}

//////////////////////////////////////////////////////////////////////////
	res = sem_init(&bin_sem, 0, 0);
    if (res != 0) 
	{
        perror("Semaphore initialization failed");
        exit(EXIT_FAILURE);
    }
    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (res != 0) 
	{
        perror("Thread creation failed");
        exit(EXIT_FAILURE);
    }
    printf("Input some text. Enter 'end' to finish\n");
//////////////////////////////////////////////////////////////////////////
	




	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -