#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开发板上运行就可以了!