您的位置:首页 > 其它

OK6410开发板之串口通信

2015-09-21 21:29 399 查看
OK6410串口通信,主要是怕在以后需要的时候忘记了,放在这上面容易找,需要的可以看看,先贴出代码:

//serial.h
#ifndef SERIAL_H
#define SERIAL_H
#include <stdio.h>      
#include <stdlib.h>     
#include <unistd.h>     
#include <sys/types.h> 
#include <sys/signal.h>
#include <sys/stat.h>   
#include <fcntl.h>      
#include <termios.h>    
#include <errno.h>
#include <limits.h> 
#include <string.h>
#include <unistd.h>

class Serial
{
public:
    Serial();
    ~Serial();
    
    int openPort(int index);
    int setPara(int serialfd,int speed=2,int databits=8,int stopbits=1,int parity=0);
    int nwrite(int serialfd,const char *data,int datalength);
    void closePort(int serialfd);    
    int BaudRate( int baudrate);
    int _BaudRate(int baudrate);
    int GetBaudRate();       
};
#endif
//serial.c
#include "serial.h"

static struct termios termios_old, termios_new;  

Serial::Serial()
{

}
Serial::~Serial()
{

}
int Serial::_BaudRate(int baudrate)
{
    switch(baudrate)
    {
		case B2400:
			return (2400);	
		case B4800:
			return (4800);
		case B9600:
			return (9600);
		case B19200:
			return (19200);
		case B38400:
			return (38400);
		case B57600:
			return (57600);
		case B115200:
			return (115200);
		default:
			return (9600);
    }
    
}

int Serial::BaudRate( int baudrate)
{
    switch(baudrate)
    {
		case 0:
			return (B2400);
		case 1:
			return (B4800);
		case 2:
			return (B9600);
		case 3:
			return (B19200);
		case 4:
			return (B38400);
		case 5:
			return (B57600);
		case 6:
			return (B115200);
		default:
			return (B9600);
    }
}

int Serial::setPara(int serialfd,int speed,int databits , int stopbits ,int parity )
{
    bzero( &termios_new, sizeof(termios_new));
    cfmakeraw(&termios_new);
    termios_new.c_cflag = BaudRate(speed);
    termios_new.c_cflag |= CLOCAL | CREAD;
    termios_new.c_cflag &= ~CSIZE;
	
    switch (databits) 
    {
		case 0:
			termios_new.c_cflag |= CS8;
			break;
		case 1:
			termios_new.c_cflag |= CS7;
			break;		
		case 2:
			termios_new.c_cflag |= CS6;
			break;
		case 3:
			termios_new.c_cflag |= CS5;
			break;		
		default:
			termios_new.c_cflag |= CS8;
			break;	
    }
	
    switch (parity)   
    {
		case 0:  				//as no parity
			termios_new.c_cflag &= ~PARENB;    //Clear parity enable 
			break;	
		case 1:	
			termios_new.c_cflag |= PARENB;     // Enable parity 
			termios_new.c_cflag &= ~PARODD;   
			break;
		case 2:	
			termios_new.c_cflag |= PARENB;  
			termios_new.c_cflag |=PARODD;
			break;	
		default:
			termios_new.c_cflag &= ~PARENB;   // Clear parity enable 
			break;	    		
    }
    switch (stopbits)// set Stop Bit
    {
		case 0:
			termios_new.c_cflag |= CSTOPB;
			break;
		case 1:
			termios_new.c_cflag &= ~CSTOPB;
			break;
		default:
			termios_new.c_cflag &= ~CSTOPB;
			break;		
    }
    tcflush(serialfd,TCIFLUSH); // Update the termios_new and do it NOW 
    termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */
    termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
    tcflush (serialfd, TCIFLUSH);
    return tcsetattr(serialfd,TCSANOW,&termios_new);
} 

int Serial::nwrite (int serialfd, const char *data, int datalength )
{

    int len = 0, total_len = 0;//modify8.8
    for (total_len = 0 ; total_len < datalength;) 
    {
		len = 0;
	    len = write(serialfd, &data[total_len], datalength - total_len);
        if (len > 0) 
			total_len += len;         
    }
    return (total_len);
}

int Serial::GetBaudRate()
{
    return (_BaudRate(cfgetospeed(&termios_new)));
}

void Serial::closePort(int serialfd)
{
    tcsetattr (serialfd, TCSADRAIN, &termios_old);
    ::close (serialfd);
}

int Serial::openPort(int index)
{
    char *device;
    switch(index)
    {
		case 0:
			device="/dev/ttySAC0";
			break;	
		case 1:
			device="/dev/ttySAC1";
			break;
		case 2:
			device="/dev/ttySAC2";
			break;
		case 3:
			device="/dev/ttySAC3";
			break;
		default:
			device="/dev/ttySAC1";
    }
			
    int fd=open( device, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd<0) return -1;
    tcgetattr(fd , &termios_old);
	return fd;
}


下面的mySerial是Serial的对象,Serial_id是串口的标识,int类型

Serial_id = mySerial->openPort(2);
    if(Serial_id)

    {
        mySerial->setPara(Serial_id,2,8,1,0);

        sleep(1);

        qDebug()<<Serial_id<<"打开串口成功";

    }
    else	qDebug()<<Serial_id<<"打开串口失败";


以下是发送数据的使用方法:

1.将QString转换为std::string,可以通过QString的成员函数toStdString()

QString Qstr="123";
std::string str=Qstr.toStdString();
我开发板上跑的是Qt4.4.3,用这种方法提示错误: error: 'class QString' has no member named 'toStdString'
可能真的没有这个~于是换了下面这种

2.将QString转换为char *或者相反

直接转换不行,因为QString没有提供直接的成员函数,但是可以通过QByteArray中转一下,例如:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QString str1 = "Test";
    QByteArray ba = str1.toLatin1();
    const char *c_str2 = ba.data();
    printf("str2: %s", c_str2);
    return app.exec(); 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: