OK6410开发板之串口通信
2015-09-21 21:29
399 查看
OK6410串口通信,主要是怕在以后需要的时候忘记了,放在这上面容易找,需要的可以看看,先贴出代码:
下面的mySerial是Serial的对象,Serial_id是串口的标识,int类型
以下是发送数据的使用方法:
1.将QString转换为std::string,可以通过QString的成员函数toStdString()
可能真的没有这个~于是换了下面这种
2.将QString转换为char *或者相反
直接转换不行,因为QString没有提供直接的成员函数,但是可以通过QByteArray中转一下,例如:
//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(); }
相关文章推荐
- hdu5461(2015沈阳网络赛L题)
- BASH_SUBSHELL 变量不生效的情况
- Java基础学习总结(二)
- nefu1039基地选址【三分】
- 杨辉三角序列的生成
- iOS开发之地图标注开发
- 项目23.5 我的加班费
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题
- Linux下安装gdal
- 安卓:loader访问联系人,同时设的菜单可搜索将匹配的联系人提示
- 数据库之索引浅析
- KVC中setValuesForKeysWithDictionary:
- UIView层次管理(放到最上层或放到最下层)
- Android 开发第一弹:倒计时
- Objective-C入门14:延展
- Java反射与内省(Introspector)
- KDJY整体客户端框架分析
- 航班预订系统需求说明书-登录模块3.0
- main函数调用、进程终止以及命令行参数和环境表http://www.tuicool.com/articles/FNnMNr
- MongoDB(索引)