/***************************
*基于OK6410的串口程序
*2012.12.4
*孙旭
***************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<string.h>
/*串口设置,"串口,波特率,数据位,奇偶校验,停止位"*/
int set_Baudrate(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
//保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息
if(tcgetattr(fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return -1;
}
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 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
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] = 0;
newtio.c_cc[VMIN] = 0;
//处理为接收字符
tcflush(fd,TCIFLUSH);
//激活新配置
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
return 0;
}
/*数据解析*/
int analysis_data(char buf[100])
{
printf("recv data %s \n",buf);
}
/*波特率为115200串口0*/
int serial_port0(void)
{
int fd_port;
int return_value=0;
int length_data=0;
char buffer[100]; //从串口读取数据的buffer
memset(buf,0,sizeof(buf));
//打开串口0
fd_port = open("/dev/ttySAC0",O_RDWR);
if(-1 == fd_port)
{
exit(1);
}
//串口,波特率,数据位,奇偶校验,停止位
return_value = set_Baudrate(fd_port,115200,8,'N',1);
if(-1 == return_value)
{
exit(1);
}
//接收串口0的数据
while(1)
{
length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1); buf为要发送的字符串
if(-1 == length_data)
{
exit(1);
}
if(0 > analysis_data(buf))
return -1;
memset(buf,0,100);
}
close(fd_port);
return 1;
}
/*波特率为4800串口1*/
int serial_port1(void)
{
int fd_port;
int return_value=0;
int length_data=0;
char buffer[100]; //从串口读取数据的buffer
memset(buf,0,sizeof(buf));
//打开串口1
fd_port = open("/dev/ttySAC1",O_RDWR);
if(-1 == fd_port)
{
return -1;
}
//串口,波特率,数据位,奇偶校验,停止位
return_value = set_Baudrate(fd_port,4800,8,'N',1);
if(-1 == return_value)
{
return -1;
}
//接收串口1的数据
while(1)
{
length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1);
if(-1 == length_data)
{
exit(1);
}
if(0 > analysis_data(buf))
return -1;
memset(buf,0,100);
}
close(fd_port);
return 1;
}
/*主函数*/
int main(void)
{
if(0 > serial_port0())
{
exit(1);
}
if(0 > serial_port1())
{
exit(1);
}
return 0;
}