PC机与FL2440的串口通信编程

#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix标准函数定义*/
#include     <sys/types.h>  /**/
#include     <sys/stat.h>   /**/
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX终端控制定义*/
#include     <errno.h>      /*错误号定义*/
#include     <string.h>
#define TRUE    0
#define FALSE   -1

#define BUFFSIZE 1024

int open_dev(char *dev_name );
void set_serial_port_speed(int fd, int speed);
void Set_parityofport(int fd,int databits,int stopbits,char parity);

int main(void)
{  
    int  fd;
    int  read_size;
    struct timeval  timeout;
    char   buff[BUFFSIZE];
    pid_t   pid;
        

    fd = open_dev("/dev/ttyS1");
    set_serial_port_speed(fd, 115200);
    Set_ParityOfPort(fd, 8, 1, 'n');
	
/*子进程执行读操作*/
if (0 == (pid = fork()))
    {
        char w_buff[BUFFSIZE];
        while (1)
        {
            scanf("%s",w_buff);
           /*write为不带缓冲的IO函数*/
            if (0 > write(fd, w_buff, strlen(w_buff)))
            {
                perror("Write Serial Fail:");
                exit(-1);
            }
            memset(w_buff, 0x00, BUFFSIZE);
        }

    }

	/*父进程执行写操作*/
    while (1)
    {
        memset(buff, 0x00, sizeof(buff));
        if (0 > (read_size = read(fd, buff, BUFFSIZE)))
        {
            perror("Read Serial Fail:");
            exit(-1);
        }
        if (read_size > 0)
            printf("%s", buff);
        fflush(stdout);  
    }
   
	close(fd);
	return 0;
}

以上是头文件,宏定义,函数声明以及主函数

以下是各个子函数的实现

/********************************************************
 *                打开串口
 *******************************************************/
 int open_dev(char *dev_name)
 {   
	 int fd;
	 if((fd = open(dev_name, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
	 {
		 perror("open error");
		 return FALSE;
	 }
	 return fd;
 }


/***********************************************************
 *              设置波特率
 **********************************************************/
void Set_Serial_Port_Speed(int fd, int speed)
{
        struct termios  term;

	if(tcgetattr(fd, &term) != 0)
	{
	   perror("tcgetattr error");

	}
   
    tcflush(fd, TCIOFLUSH);
    switch(speed)
{ 
    
    case 2400:
          cfsetispeed(&term, B2400);//输入波特率
          cfsetospeed(&term, B2400);//输出波特率
          break;
      case 4800:
          cfsetispeed(&term, B4800);
          cfsetospeed(&term, B4800);
          break;
      case 9600:
          cfsetispeed(&term, B9600);
          cfsetospeed(&term, B9600);
          break;
      case 57600:
          cfsetispeed(&term, B57600);
          cfsetospeed(&term, B57600);
          break;
      case 115200:
          cfsetispeed(&term, B115200);
          cfsetospeed(&term, B115200);
      default:
          cfsetispeed(&term, B115200);
          cfsetospeed(&term, B115200);
          break;
}
	if(tcsetattr(fd, TCSANOW, &term) != 0)
	{
		perror("tcsetattr error");
	}
}


/******************************************************************
 *           设置奇偶校验

*****************************************************************/           
void Set_ParityOfPort(int fd,int databits,int stopbits,char parity)
{
    struct termios options;
    if(tcgetattr(fd,&options) != 0)
	{
		perror("tcgetattr error");
	
	}
        // 不屏蔽字符大小
	options.c_cflag &= ~CSIZE;
        //非规范输入,不进行回送,非可见擦除符,不启用终端产生的信号
	options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
        //不进行输出处理
	options.c_oflag  &= ~OPOST;

	switch (databits) /*设置数据位数*/
	{
	  case 7:  
		options.c_cflag |= CS7;
   		break;
           case 8:
		options.c_cflag |= CS8;
	        break;
	   default: 
		fprintf(stderr,"Unsupported data size/n");
	

	}

   
   switch (parity)
   {
	   case 'n':
	   case 'N':
	                  options.c_cflag &= ~PARENB; 
			  options.c_iflag &= ~INPCK; 
			  break;
           case 'o':
	   case 'O':
	                  options.c_cflag |= (PARODD | PARENB);
			  options.c_iflag |= INPCK;
			  break;
	   case 'e':
           case 'E':
		          options.c_cflag |= PARENB; 
			  options.c_cflag &= ~PARODD;
			  options.c_iflag |= INPCK; 
			  break;
	    case 's': 
	    case 'S':
		           options.c_cflag &= ~PARENB;
			   options.c_cflag &= ~CSTOPB; 
			   break; 
	    default:
		           fprintf(stderr,"Unsupported parity/n"); 
	
   }


   switch (stopbits)
   {
	   case 1: 
	                  options.c_cflag &= ~CSTOPB; 
			  break;
	   case 2:
	                  options.c_cflag |= CSTOPB; 
			  break;
	   default:
	                  fprintf(stderr,"Unsupported stop bits/n"); 
	
   }
   /*打开奇偶校验*/
   if (parity != 'n')
	   options.c_iflag |= INPCK;
	
   tcflush(fd,TCIFLUSH);
   /*read 立即返回[0,nbytes]*/
   options.c_cc[VTIME] = 0;
   options.c_cc[VMIN] = 0;

   if (tcsetattr(fd,TCSANOW,&options) != 0) 
   {
      perror("tcsetattr error"); 
	 
   }
   
}


将c代码在交叉编译器以编译,生成a.out文件

然后将a.out文件下载到FL2440开发板上运行就可以了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值