您的位置:首页 > 其它

基于OK6410的串口数据收发

2013-05-22 17:43 471 查看
转自http://blog.csdn.net/pzhsunxu/article/details/8257939

***************************
*基于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: