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

📄 comrecv.c

📁 嵌入式 linux 扩展串口 驱动 测试程序
💻 C
字号:
//
//	Description
//		COM receive and printf
//
//	Copyright (C) 2004  Hyesco Technology Co.,Ltd
//
//	Author: Zheng Geng <gzheng@hyesco.com>
//
//	History:
//
//	2004.10   Zheng Geng  <gzheng@hyesco.com>
//               Original version


#include     <stdio.h>      
#include     <stdlib.h>    
#include     <unistd.h>     
#include     <sys/types.h>  
#include     <sys/stat.h>   
#include     <fcntl.h>     
#include     <termios.h>   
#include     <errno.h>     
#include  	 <string.h>


typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned long U32;

#define  CMSPAR 010000000000
#define UART_RS485_CONFIG 0x5AA1
#define UART_RS485_READ   0x5AA2
#define UART_RS485_WRITE  0x5AA3


void setTermios(struct termios * pNewtio, U16 uBaudRate)
{
	bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */

	//8N1
	//pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL;
	//pNewtio->c_iflag = IGNPAR;
	
	//8E1
	//pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL |PARENB;
	//pNewtio->c_iflag = 0;
	
	//8O1
	//pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL |PARENB | PARODD;
	//pNewtio->c_iflag = 0;
	
	//8S1
	//pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL |PARENB | CMSPAR;
	//pNewtio->c_iflag = 0;
	
	//8M1
	pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL |PARENB | PARODD | CMSPAR;
	pNewtio->c_iflag = 0;
	
	pNewtio->c_oflag = 0;
	pNewtio->c_lflag = 0; //non ICANON
	/* 
	initialize all control characters 
	default values can be found in /usr/include/termios.h, and 
	are given in the comments, but we don't need them here
	*/
	pNewtio->c_cc[VINTR]    = 0;     /* Ctrl-c */ 
	pNewtio->c_cc[VQUIT]    = 0;     /* Ctrl-\ */
	pNewtio->c_cc[VERASE]   = 0;     /* del */
	pNewtio->c_cc[VKILL]    = 0;     /* @ */
	pNewtio->c_cc[VEOF]     = 4;     /* Ctrl-d */
	pNewtio->c_cc[VTIME]    = 5;     /* inter-character timer, timeout VTIME*0.1 */
	pNewtio->c_cc[VMIN]     = 0;     /* blocking read until VMIN character arrives */
	pNewtio->c_cc[VSWTC]    = 0;     /* '\0' */
	pNewtio->c_cc[VSTART]   = 0;     /* Ctrl-q */ 
	pNewtio->c_cc[VSTOP]    = 0;     /* Ctrl-s */
	pNewtio->c_cc[VSUSP]    = 0;     /* Ctrl-z */
	pNewtio->c_cc[VEOL]     = 0;     /* '\0' */
	pNewtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */
	pNewtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */
	pNewtio->c_cc[VWERASE]  = 0;     /* Ctrl-w */
	pNewtio->c_cc[VLNEXT]   = 0;     /* Ctrl-v */
	pNewtio->c_cc[VEOL2]    = 0;     /* '\0' */
}

#define BUFSIZE 512
int main(int argc, char **argv)
{
	int fd;
	int nread;
	char buff[BUFSIZE];
	struct termios oldtio,newtio;
   	struct timeval tv;
	char *dev ="/dev/ttyS4";
	fd_set rfds;
	
	if ( (fd = open(dev,O_RDWR | O_NOCTTY ))<0)
	{
		printf("Can't Open Serial Port!\n");
		return -1;
	}

	tcgetattr(fd,&oldtio); /* save current serial port settings */
	setTermios(&newtio,B115200);

	tcflush(fd, TCIFLUSH);
	tcsetattr(fd,TCSANOW,&newtio);

        ioctl(fd,UART_RS485_CONFIG,0);

        ioctl(fd,UART_RS485_READ,0);

	tv.tv_sec=30;
	tv.tv_usec=0;
	while(1)
  	{
		FD_ZERO(&rfds);
		FD_SET(fd,&rfds);
		if (select(1+fd,&rfds,NULL,NULL,&tv)>0)
		{
			if(FD_ISSET(fd,&rfds))
			{	
				nread=read(fd, buff, BUFSIZE);
				printf("readlength=%d\n",nread);
				buff[nread]='\0';
				printf("%s\n",buff);
			}
		}
  	}
	tcsetattr(fd,TCSANOW,&oldtio);
    close(fd);
}

⌨️ 快捷键说明

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