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