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

📄 com2_test.c

📁 这是基于linux的应用层的串口程序
💻 C
字号:
#include <stdio.h>              /* printf */
#include <fcntl.h>              /* open */
#include <string.h>             /* bzero */
#include <stdlib.h>             /* exit */
#include <sys/times.h>          /* times */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <limits.h>
#include <termios.h>
#include <ctype.h>
#include <errno.h>


#define NO_ACK				0
#define ACK_1				1
#define ACK_3				2

#define TIMEOUT_SEC(buflen,baud) (buflen*20/baud+2)
#define TIMEOUT_USEC 0

static struct termios termios_old, termios_new;
static struct timeval tv_timeout;
static fd_set   fs_read, fs_write;

//COM
static int BAUDRATE (int baudrate)
{
	switch (baudrate) {
	case 0:
	    return (B0);
	case 50:
	    return (B50);
	case 75:
	    return (B75);
	case 110:
	    return (B110);
	case 134:
	    return (B134);
	case 150:
	    return (B150);
	case 200:
	    return (B200);
	case 300:
	    return (B300);
	case 600:
	    return (B600);
	case 1200:
	    return (B1200);
	case 2400:
	    return (B2400);
	case 9600:
	    return (B9600);
	case 19200:
	    return (B19200);
	case 38400:
	    return (B38400);
	case 57600:
	    return (B57600);
	case 115200:
	    return (B115200);
	default:
	    return (B9600);
	}
}
static int _BAUDRATE (int baudrate)
{
/* reverse baudrate */
	switch (baudrate) {
	case B0:
	    return (0);
	case B50:
	    return (50);
	case B75:
	    return (75);
	case B110:
	    return (110);
	case B134:
	    return (134);
	case B150:
	    return (150);
	case B200:
	    return (200);
	case B300:
	    return (300);
	case B600:
	    return (600);
	case B1200:
	    return (1200);
	case B2400:
	    return (2400);
	case B9600:
	    return (9600);
	case B19200:
	    return (19200);
	case B38400:
	    return (38400);
	case B57600:
	    return (57600);
	case B115200:
	    return (115200);
	default:
	    return (9600);
	}
}
static void SetDataBit (int databit)
{
	termios_new.c_cflag &= ~CSIZE;
	switch (databit) {
	case 8:
	    termios_new.c_cflag |= CS8;
	    break;
	case 7:
	    termios_new.c_cflag |= CS7;
	    break;
	case 6:
	    termios_new.c_cflag |= CS6;
	    break;
	case 5:
	    termios_new.c_cflag |= CS5;
	    break;
	default:
	    termios_new.c_cflag |= CS8;
	    break;
	}
}
static void SetStopBit (const char *stopbit)
{
	if (0 == strcmp (stopbit, "1")) {
	    termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
	}
	else if (0 == strcmp (stopbit, "1.5")) {
	    termios_new.c_cflag &= ~CSTOPB; /* 1.5 stop bits */
	}
	else if (0 == strcmp (stopbit, "2")) {
	    termios_new.c_cflag |= CSTOPB;  /* 2 stop bits */
	}
	else {
	    termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
	}
}
static void SetParityCheck (char parity)
{
	switch (parity) {
	case 'N':                  /* no parity check */
	    termios_new.c_cflag &= ~PARENB;
	    break;
	case 'E':                  /* even */
	    termios_new.c_cflag |= PARENB;
	    termios_new.c_cflag &= ~PARODD;
	    break;
	case 'O':                  /* odd */
	    termios_new.c_cflag |= PARENB;
	    termios_new.c_cflag |= ~PARODD;
	    break;
	default:                   /* no parity check */
	    termios_new.c_cflag &= ~PARENB;
	    break;
	}
}
static int SetPortAttr (int fd,int baudrate,int databit, const char *stopbit, char parity)
{
	bzero (&termios_new, sizeof (termios_new));
	cfmakeraw (&termios_new);
	termios_new.c_cflag = BAUDRATE (baudrate);  /* set baudrate */
	termios_new.c_cflag |= CLOCAL | CREAD;      /* | CRTSCTS */
	SetDataBit (databit);
	SetParityCheck (parity);
	SetStopBit (stopbit);
	termios_new.c_oflag = 0;
	termios_new.c_lflag |= 0;
	termios_new.c_oflag &= ~OPOST;
	termios_new.c_cc[VTIME] = 1;        /* unit: 1/10 second. */
	termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
	tcflush (fd, TCIFLUSH);
	return (tcsetattr (fd, TCSANOW, &termios_new));
}

/* Open serial port ComPort at baudrate baud rate. */
int OpenComPort (int ComPort, int baudrate, int databit,
                 const char *stopbit, char parity)
{
	char   *pComPort;
	int      retval;
    int        fd;
	struct termios termios_old;

	switch (ComPort) {
	case 0:
		pComPort = "/dev/ttymxc/0";
		break;
	case 1:
	    	pComPort = "/dev/ttymxc/1";
	    	break;
	case 2:
		pComPort = "/dev/ttymxc/2";
		break;
    case 3:
	pComPort = "/dev/ttymxc/3";
	break;
	default:
	    	pComPort = "/dev/ttymxc/0";
	    	break;
	}
	
	fd = open (pComPort, O_RDWR);
	if (fd == -1) 
	{
	    fprintf (stderr, "cannot open port %s\n", pComPort);
	    return (-1);
	}
	tcgetattr (fd, &termios_old);       /* save old termios value */
    retval = SetPortAttr (fd,baudrate,databit, stopbit, parity);
	if (retval == -1) 
	{
	     	fprintf (stderr, "\nport %s cannot set baudrate at %d\n", pComPort,
	             baudrate);
        return -1;
	}
    return fd;
}

void CloseComPort (int fd)
{
    /* flush output data before close and restore old attribute */
    tcsetattr (fd, TCSADRAIN, &termios_old);
    close (fd);
}

static int GetBaudrate ()
{
    return (_BAUDRATE (cfgetospeed (&termios_new)));
}

int WriteComPort (int fd, char * data, int datalength)
{
	int   retval, len = 0, total_len = 0;
	int i;
	
	#if 0
	printf("write: ");
	for(i=0;i<datalength; i++)
		printf("0x%02x  ",data[i]);
	printf("\r\n");	
	#endif
	
	FD_ZERO (&fs_write);
	FD_SET (fd, &fs_write);
	tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
	tv_timeout.tv_usec = TIMEOUT_USEC;

	for (total_len = 0, len = 0; total_len < datalength;) 
	{
		retval = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout);
        	if (retval) 
		{
			len = write (fd, &data[total_len], datalength - total_len);
			if (len > 0) {
				total_len += len;
			}
        	}
		else if(retval == 0)
		{
			printf("WriteComPort  timeout \n");
			break ;
		}
		else {
			tcflush (fd, TCOFLUSH);     /* flush all output data */
			break;
		}
	}
	usleep(1000);
	return (total_len);
}
#if 1
int  ReadComPort (int fd, void *data, int  datalength, int option)
{
	int    retval = 0;
	int 	len = 0;
	
	FD_ZERO (&fs_read);
	FD_SET (fd, &fs_read);
	switch(option)
	{
	case NO_ACK:
		retval = select (fd + 1, &fs_read, NULL, NULL, NULL);	
		break;
	case ACK_1:
		tv_timeout.tv_sec = 0.1;
		tv_timeout.tv_usec = 0;
		retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);	
		break;
	case ACK_3:
		tv_timeout.tv_sec = 0.3;
		tv_timeout.tv_usec = 0;
		retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);	
		break;
	default:
		retval = select (fd + 1, &fs_read, NULL, NULL, NULL);	
		break;
	}

	if (retval) 
	{
		len = read (fd, data, datalength);
		printf("ReadComPort  len=%d \n",len);
		return len;
	}
	else if(retval == 0)
	{		printf("ReadComPort  timeout \n");		return 0;	}	else	{		printf("selct() call failed : %s \n",strerror(errno));	    	return -1;	}
}
#endif 
//end COM

int  checksum(char * strbuf ,int len)
{
	int i, temp = 0;
	
	for(i=0; i<len; i++)
		temp += strbuf[i];

	return  temp;
}


int main(int argc, char **argv)
{
	int  i;
	unsigned char  redbuf[30];
	static int fd; 
	int ret = 0;
	int len = 8;
	
	/* open comport */
	fd = OpenComPort(2, 115200, 8,  "1",'N');
	if(fd < 0)
	{		
		printf("Can not open the serial port\n");		
		return -1;	
	}

	memset(redbuf, 0, sizeof(redbuf));
	ret = ReadComPort(fd, redbuf, len,NO_ACK);
	if(ret < 0)
	{
		printf("ReadComPort failed \n");
		return 0;
	}
	else
	{
		for( i=0; i<len; i++)
		printf("0x%02x  ",redbuf[i]);
		printf("\r\n");
		WriteComPort (fd, redbuf, len);
	}
	close(fd);  	

}


⌨️ 快捷键说明

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