#include "bardrv.h"
BarDrv::BarDrv(QObject *parent) :
QObject(parent)
{
}
//************************************************************
// 函数名称: UART_Open()
// 函数功能: 打开串口并返回串口设备文件描述
// 入口参数: fd 描述符
// *port 串口号(COM1,COM2,COM3,COM4,COM5)
// 出口参数: 正确返回为1,错误返回为0
//************************************************************
int BarDrv::UART_Open(int fd,const char *port)
{
if(strcmp(port,"COM1") == 0) fd = open( "/dev/ttyO1", O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞方式打开
else if(strcmp(port,"COM2") == 0) fd = open( "/dev/ttyO2", O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞方式打开
else if(strcmp(port,"COM3") == 0) fd = open( "/dev/ttyO3", O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞方式打开
else if(strcmp(port,"COM4") == 0) fd = open( "/dev/ttyO4", O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞方式打开
//printf("port: %s\n",port);
if (FALSE == fd){
perror("Can't Open Serial Port");
return(FALSE);
}
//设置并判断串口的状态是否为非阻塞状态
if(fcntl(fd, F_SETFL, FNDELAY) < 0){
// if(fcntl(fd, F_SETFL, 0) < 0){//阻塞
printf("fcntl failed!\n");
return(FALSE);
}
return fd;
}
//************************************************************
// 函数名称: UART_Close()
// 函数功能: 关闭指定串口
// 入口参数: fd 描述符
// 出口参数: 无
//************************************************************
void BarDrv::UART_Close(int fd)
{
close(fd);
}
//************************************************************
// 函数名称: UART_Set()
// 函数功能: 设置串口
// 入口参数: fd 描述符
// nSpeed 波特率
// nBits 数据位个数
// nEvent 奇偶校验
// nStop 停止位个数
// 出口参数: 正确返回为1,错误返回为0
//************************************************************
int BarDrv::UART_Set(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio;
struct termios oldtio;
if(tcgetattr(fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return FALSE;
}
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 57600:
cfsetispeed(&newtio,B57600);
cfsetospeed(&newtio,B57600);
break;
case 115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
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] = 100;
newtio.c_cc[VMIN] = 1; //阻塞条件下有效
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
{
perror("com set error");
return FALSE;
}
printf("set done!\n");
return TRUE;
}
//************************************************************
// 函数名称: UART0_Recv()
// 函数功能: 接收串口数据
// 入口参数: fd 描述符
// data_len 数据长度
// *rcv_buf 指向接收数据
// 出口参数: 正确返回为1,错误返回为0
//************************************************************
int BarDrv::UART_Recv(int fd,int data_len, char *rcv_buf)
{
int len,fs_sel;
fd_set fs_read;
struct timeval time;
FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
time.tv_sec = 0;
time.tv_usec = 0;
//使用select实现串口的多路通信
fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
if(fs_sel){
len = read(fd,rcv_buf,data_len);
return len;
}
else {
return FALSE;
}
}