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

📄 seri.c

📁 s3c2440 linux2.6.24内核 串口收发程序 用串口1收发数据 波特率是9600
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
//#include "seri.h"

/////////////////////////////////////////////////////////////////////

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
	if  ( tcgetattr( fd,&oldtio)  !=  0) { 
		perror("SetupSerial 1");
		return -1;
	}
	bzero( &newtio, sizeof( newtio ) );//
	newtio.c_cflag  |=  CLOCAL | CREAD; 
	newtio.c_cflag &= ~CSIZE; 

	switch( nBits )
	{
	case 7:
		newtio.c_cflag |= CS7;
		break;
	case 8:
		newtio.c_cflag |= CS8;
		break;
	}

	switch( nEvent )
	{
	case 'O':
		newtio.c_cflag |= PARENB;
		newtio.c_cflag |= PARODD;
		newtio.c_iflag |= (INPCK | ISTRIP);
		break;
	case 'E': 
		newtio.c_iflag |= (INPCK | ISTRIP);
		newtio.c_cflag |= PARENB;
		newtio.c_cflag &= ~PARODD;
		break;
	case 'N':  
		newtio.c_cflag &= ~PARENB;
		break;
	}

switch( nSpeed )
	{
	case 2400:
		cfsetispeed(&newtio, B2400);
		cfsetospeed(&newtio, B2400);
		break;
	case 4800:
		cfsetispeed(&newtio, B4800);
		cfsetospeed(&newtio, B4800);
		break;
	case 9600:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	case 115200:
		cfsetispeed(&newtio, B115200);
		cfsetospeed(&newtio, B115200);
		break;
	case 460800:
		cfsetispeed(&newtio, B460800);
		cfsetospeed(&newtio, B460800);
		break;
	default:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	}
	if( nStop == 1 )
		newtio.c_cflag &=  ~CSTOPB;
	else if ( nStop == 2 )
	newtio.c_cflag |=  CSTOPB;
	newtio.c_cc[VTIME]  = 0;   //hhm  0      15 seconds
	newtio.c_cc[VMIN] = 0;
	tcflush(fd,TCIFLUSH);
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
		exit(0);
	}
	printf("set done!\n");

/* hhm 如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:*/

    newtio.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
    newtio.c_oflag  &= ~OPOST;   /*Output*/
	
	return 0;
}
////////////////////////////////////////////////////////////////////

int open_port(int fd,int comport) //hhm   int fd,
{
	//char *dev[]={"/dev/s3c2410_serial0","/dev/s3c2410_serial1","/dev/s3c2410_serial2"};//hhm  linux默认是/dev/ttys1 ,但被改了
	//long  vdisable;

	//int fd;   //hhm 
	
	if (comport==1)
	{	fd = open( "/dev/s3c2410_serial0", O_RDWR|O_NOCTTY|O_NDELAY);  //hhm  |O_NOCTTY|O_NDELAY
		if (-1 == fd){
			perror("Can't Open Serial Port");
			return(-1);
		}
	}
	else if(comport==2)
	{	fd = open( "/dev/s3c2410_serial1", O_RDWR|O_NOCTTY|O_NDELAY);  //hhm  |O_NOCTTY|O_NDELAY
		if (-1 == fd){
			perror("Can't Open Serial Port");
			return(-1);
		}
	}
	else if (comport==3)
	{
		fd = open( "/dev/s3c2410_serial2", O_RDWR|O_NOCTTY|O_NDELAY);  //hhm  |O_NOCTTY|O_NDELAY
		if (-1 == fd){
			perror("Can't Open Serial Port");
			return(-1);
		}
	}
	if(fcntl(fd, F_SETFL, 0)<0)
		printf("fcntl failed!\n");
	else
		printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
	if(isatty(STDIN_FILENO)==0)
		printf("standard input is not a terminal device\n");
	else
		printf("isatty success!\n");
	
	printf("fd->open = %d\n",fd);
	return fd;
}


/////////////////////////////////////////////////////////////////////
//======================================================================================

int main(void)
{
	int fd,   hhm1=0,  hhm2=0   ;
	int nread ,i ;
	char buff[512];

	char  buffer[]="0123456789 my name is hhm! \n";  //hhm  
	int   Length=27;
	int   nByte;

	
	if((fd=open_port(fd,2))<0)      //打开串口1  !!!!!!!!!!!!!!!!注意传递参数是2
	{                                  
		perror("open_port error");
		exit(0);
	}
	if((i=set_opt(fd,9600,8,'N',1))<0)   //设置串口参数
	{
		perror("set_opt error");
		exit(1);
	}	
	printf("fd = %d\n",fd);

	printf("\n===serial version: 2.1.3 date: 04:06:2009 (C) All rights reserved by hhm wilsonhuang ! ! ! ===\n");

	//fd=3;
	//nread=read(fd,buff,8);
	//printf("nread=%d,%s\n",nread,buff);
/////////////////////////////////////////////////////////
    while(1)
	//for(hhm1=0;hhm1<5;hhm1++)
	{ 
	  for(hhm2=0;hhm2<1000000;hhm2++)//;
	  {
	     //nread=read(fd,buff,8);
	     
	     while((nread=read(fd,buff,8))>0)   //测试发现一次只读入 8个字节
   		 {
      		printf("\nByteLen = %d\n",nread);
      		buff[nread+1]='\0';
      		printf("\nReceived chars: %s\n",buff);
	     }
	  }
	  nByte = write(fd, buffer ,Length);
	  printf("\nARM TO PC: Send nByte = %d\n",nByte);   //
	  
	  //nread=read(fd,buff,8);     //
	  //printf("nread=%d,%s\n",nread,buff);

    }
 	
	close(fd);
	exit(0);
	//return;
}

//***************************************************************************************
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

⌨️ 快捷键说明

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