//uart_api.c接口函数
//串口设置函数
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
struct termios new_cfg,old_cfg;
int speed;
/*保存并测试现有的串口参数设置*/
if(tcgetattr(fd,&old_cfg)!=0){
perror("tcgetattr");
return -1;
}
/*设置字符大小*/
new_cfg = old_cfg;
cfmakeraw(&new_cfg);
new_cfg.c_cflag &= ~CSIZE;
/**/
switch(baud_rate)
{
case 2400:
{
speed = B2400;
}
break;
case 4800:
{
speed = B4800;
}
break;
case 9600:
{
speed = B9600;
}
break;
case 19200:
{
speed = B19200;
}
break;
case 38400:
{
speed = B38400;
}
break;
case 115200:
{
speed = B115200;
}
break;
}
cfsetispeed(&new_cfg,speed);
cfsetospeed(&new_cfg,speed);
/*数据位*/
switch(data_bits)
{
case 7:
{
new_cfg.c_cflag |=CS7;
}
break;
default:
case 8:
{
new_cfg.c_cflag |=CS8;
}
break;
}
/*奇偶校验*/
switch(parity)
{
default:
case 'n':
case 'N':
{
new_cfg.c_cflag &=~PARENB;
new_cfg.c_iflag &=~INPCK;
}
break;
case 'o':
case 'O':
{
new_cfg.c_cflag |= (PARODD | PARENB);
new_cfg.c_iflag |= INPCK;
}
break;
case 'e':
case 'E':
{
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_iflag |= INPCK;
}
break;
case 's':
case 'S':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~CSTOPB;
}
break;
}
/*设置停止位*/
switch(stop_bits)
{
default:
case 1:
{
new_cfg.c_cflag &= ~CSTOPB;
}
break;
case 2:
{
new_cfg.c_cflag |= CSTOPB;
}
}
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;
/*处理未接受字符*/
tcflush(fd,TCIFLUSH);
/*激活新配置*/
if((tcsetattr(fd,TCSANOW,&new_cfg))!=0){
perror("tcsetattr");
return -1;
}
return 0;
}
//打开串口函数
int open_port(int com_port)
{
int fd = 0;
#if(COM_TYPE == GNR_COM) //使用普通串口
char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3"};
#else //使用USB转串口
char *dev[]={"/dev/ttyUSB0","/dev/ttyUSB1","/dev/ttyUSB2","/dev/ttyUSB3"};
#endif
if(com_port < 0 || com_port >MAX_COM_MUM)
{
return -1;
}
//打开串口
fd = open(dev[com_port -1],O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < 1)
{
perror("open serial port");
return(-1);
}
//恢复串口阻塞状态
if(fcntl(fd,F_SETFL,0)<0)
{
perror("fcntl F_SETFL\n");
}
//测试是否为终端设备
if(isatty(STDIN_FILENO)==0)
{
printf("standard input is not a termina device\n");
}
printf("fd=%d\n",fd);
return fd;
}
//com_writer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <error.h>
#include "uart_api.h"
#include "define.h"
int main()
{
int fd =0;
char buffer[BUFFER_SIZE];
//fd = open_port(HOST_COM_POST); //打开串口
fd = open_port(2);
if( fd < 0)
{
perror("open_port");
}
if(set_com_config(fd, 9600, 8, 'N', 1) < 0) //配置串口
{
perror("set_com_config");
return 1;
}
do
{
printf("input some words(enter 'quit' to exit):");
memset(buffer, 0, BUFFER_SIZE);
if(fgets(buffer,BUFFER_SIZE,stdin) == NULL)
{
perror("fgets");
break;
}
write(fd, buffer, strlen(buffer));
}while(strncmp(buffer, "quit", 4));
close(fd);
return 0;
}
//com_reader.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "uart_api.h"
#include "define.h"
int main(void)
{
int fd;
char buff[BUFFER_SIZE];
fd = open_port(2);
if( fd < 0 ) /* 打开串口 */
{
perror("open_port");
return 1;
}
if(set_com_config(fd, 115200, 8, 'N', 1) < 0) /* 配置串口 */
{
perror("set_com_config");
return 1;
}
do
{
memset(buff, 0, BUFFER_SIZE);
if (read(fd, buff, BUFFER_SIZE) > 0)
{
printf("The received words are : %s", buff);
}
} while(strncmp(buff, "quit", 4));
close(fd);
return 0;
}