//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtGui>
#include <QTimer>
#include <QPushButton>
#include <QComboBox>
#include <QLabel>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QLineEdit>
#include <QTime>
#include <QFile>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *);
public slots:
void checkPort();
void openPort();
void readData();
void sendData();
private:
inline void toDigit(QString s);
inline void getReadValue(QByteArray readBuf);
void delay();
private:
Ui::Widget *ui;
QSerialPort *serialPort;
bool readNow;
int xPos[6][460];
int txPos[6];
const int wStart = 20;
const int hStart = 20;
const int wLength = 450;
const int hLength = 250;
int middle[6];
const QColor color[6] = {
QColor(238, 44, 44),
QColor(125, 38, 205),
QColor(238, 18, 137),
QColor(255, 106, 106),
QColor(110, 110, 110),
QColor(0, 0, 0)
};
struct{
char zheng;
char xiao;
char fu;
}code;
// QByteArray sendBuf;
// QByteArray readBuf;
QTimer *updateTimer;
QLabel *portLabel;
QLabel *baudLabel;
QComboBox *portComboBox;
QComboBox *baudComboBox;
QPushButton *openButton;
QLineEdit *xTextEdit;
QLineEdit *yTextEdit;
QLabel *xLabel;
QLabel *yLabel;
QPushButton *sendButton;
QLabel *degree0;
QLabel *degreeP90;
QLabel *degreeP180;
QLabel *degreeN90;
QLabel *degreeN180;
QFile *file;
// QTextStream textStrea;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(700,400);
openButton = new QPushButton("open",this);
openButton->setGeometry(560,120,80,30);
connect(openButton,SIGNAL(clicked()),this,SLOT(openPort()));
portLabel = new QLabel("port:",this);
portLabel->setGeometry(520,20,80,20);
portLabel->setFont(QFont("Microsoft YaHei",9));
baudLabel = new QLabel("baudrate:",this);
baudLabel->setGeometry(520,70,80,20);
baudLabel->setFont(QFont("Microsoft YaHei",9));
xLabel = new QLabel("Xposition:",this);
xLabel->setGeometry(520,220,80,20);
xLabel->setFont(QFont("Microsoft YaHei",9));
yLabel = new QLabel("Yposition:",this);
yLabel->setGeometry(520,270,80,20);
yLabel->setFont(QFont("Microsoft YaHei",9));
xTextEdit = new QLineEdit(this);
xTextEdit->setGeometry(600,220,80,20);
yTextEdit = new QLineEdit(this);
yTextEdit->setGeometry(600,270,80,20);
sendButton = new QPushButton("send",this);
sendButton->setGeometry(560,320,80,30);
sendButton->setEnabled(false);
connect(sendButton,SIGNAL(clicked()),this,SLOT(sendData()));
portComboBox = new QComboBox(this);
portComboBox->setGeometry(600,20,80,20);
baudComboBox = new QComboBox(this);
baudComboBox->setGeometry(600,70,80,20);
baudComboBox->addItem("115200");
baudComboBox->addItem("9600");
degree0 = new QLabel("0",this);
degree0->setGeometry(5,200-10,50,20);
degreeP90 = new QLabel("90",this);
degreeP90->setGeometry(5,200-10-90,50,20);
degreeP180 = new QLabel("180",this);
degreeP180->setGeometry(5,200-10-180,50,20);
degreeN90 = new QLabel("-90",this);
degreeN90->setGeometry(5,200-10+90,50,20);
degreeN180 = new QLabel("-180",this);
degreeN180->setGeometry(5,200-10+180,50,20);
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
portComboBox->addItem(serial.portName());
serial.close();
}
}
updateTimer = new QTimer(this);
updateTimer->setInterval(500);
connect(updateTimer,SIGNAL(timeout()),this,SLOT(checkPort()));
updateTimer->start();
memset(xPos,0,sizeof(xPos));
memset(txPos,0,sizeof(txPos));
middle[0] = middle[1] = middle[2] = middle[3] = middle[4] = middle[5] = 200;
code.zheng = 0;
code.fu = 0;
code.xiao = 0;
readNow = false;
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(QColor(1, 1, 1));
painter.setBrush(QColor(45, 204, 112));
painter.drawRect(0,0,500,400);
painter.setBrush(Qt::NoBrush);
for(int k = 0; k < 6; k++){
painter.setPen(color[k]);
int prePos = txPos[k]+1;
for(int i = wStart;i < wLength+wStart; ++i){
painter.drawLine(i,middle[k]-xPos[k][prePos],i+1,middle[k]-xPos[k][prePos+1]);
if(++prePos > wLength){
prePos = 0;
}
}
}
}
void Widget::checkPort()
{
readNow = false;
portComboBox->clear();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
portComboBox->addItem(serial.portName());
serial.close();
}
}
}
void Widget::openPort()
{
if(openButton->text() == "open"){
QDateTime time = QDateTime::currentDateTime();
QString str = time.toString("yyyyddhhmmss");
QString fileName = "zb" + str + ".txt";
file = new QFile(fileName);
file->open(QIODevice::WriteOnly | QIODevice::Text);
serialPort = new QSerialPort;
serialPort->setPortName(portComboBox->currentText());
serialPort->open(QIODevice::ReadWrite);
serialPort->setBaudRate(baudComboBox->currentText().toInt());
serialPort->setFlowControl(QSerialPort::NoFlowControl);
QObject::connect(serialPort,&QSerialPort::readyRead,this,&Widget::readData);
// qDebug()<<"hello";
updateTimer->stop();
openButton->setText("close");
sendButton->setEnabled(true);
}else{
serialPort->clear();
serialPort->close();
serialPort->deleteLater();
updateTimer->start();
openButton->setText("open");
sendButton->setEnabled(false);
file->close();
}
}
void Widget::readData()
{
QByteArray readBuf;
readBuf.clear();
readBuf = serialPort->readAll();
if(!readNow)
getReadValue(readBuf);
}
void Widget::sendData()
{
if(!xTextEdit->text().isEmpty() && !yTextEdit->text().isEmpty()){
QByteArray sendBuf;
sendBuf.clear();
sendBuf.append((char)0xc1);
delay();
serialPort->write(sendBuf);
QString s = xTextEdit->text();
code.zheng = 0;
code.fu = 0;
code.xiao = 0;
toDigit(s);
sendBuf.clear();
sendBuf.append(code.zheng);
delay();
serialPort->write(sendBuf);
sendBuf.clear();
sendBuf.append(code.xiao);
delay();
serialPort->write(sendBuf);
sendBuf.clear();
sendBuf.append(code.fu);
delay();
serialPort->write(sendBuf);
s = yTextEdit->text();
code.zheng = 0;
code.fu = 0;
code.xiao = 0;
toDigit(s);
sendBuf.clear();
sendBuf.append(code.zheng);
delay();
serialPort->write(sendBuf);
sendBuf.clear();
sendBuf.append(code.xiao);
// qDebug("%d",sendBuf.at(0));
delay();
serialPort->write(sendBuf);
sendBuf.clear();
sendBuf.append(code.fu);
delay();
serialPort->write(sendBuf);
sendBuf.clear();
sendBuf.append((char)0xc2);
delay();
serialPort->write(sendBuf);
// qDebug()<<"hh";
// for(int i = 0; i < 8; i++){
// delay();
// serialPort->write(sendBuf);
// }
}
}
void Widget::toDigit(QString s)
{
int length = s.size();
int begin = s[0] == '-' ? 1 : 0;
int pos = 0;
for(;pos<length;pos++){
if(s[pos] == '.')
break;
}
QString ss=s.mid(begin,pos-begin);
int shi = ss.toInt();
code.zheng = shi;
ss.clear();
ss = s.mid(pos+1);
int ge = ss.toInt();
code.xiao = ge;
if(begin){
code.fu = 1;
}else{
code.fu = 0;
}
}
void Widget::getReadValue(QByteArray readBuf)
{
if(!readNow){
QTextStream ts(file);
ts.seek(file->size());
readNow = true;
int readarry[150];
int length = readBuf.size();
for(int i = 0; i < length; i++){
readarry[i] = readBuf.at(i) & 0xff;
}
int pos = 0,pos1=0;
while (readarry[pos++] != 0xc1 && pos < 100) {
}
// qDebug()<<readarry[pos-1];
pos1=pos;
while (readarry[pos1++] != 0xc2) {
if((pos1 - pos) > 20){
readNow = false;
return;
}
}
for(int i = 0; i < (pos1-pos-1)/3; i++){
int value = readarry[pos+i*3];
double dec;
double wdec;
dec = readarry[pos+i*3+1];
while(dec >= 1){
dec /= 10;
}
wdec = dec;
wdec += value;
if(dec > 0.5) {
++value;
}
if(readarry[pos+i*3+2] == 1){
value = -value;
wdec = -wdec;
}
if(++txPos[i] > wLength) txPos[i] = 0;
xPos[i][txPos[i]] = value;
// qDebug()<<value;
if(i == (pos1-pos-1)/3-1)
ts<<wdec<<'\n';
else
ts<<wdec<<'\t';
// qDebug()<<wdec;
}
// ts.seek(file->size());
update();
readNow = false;
}
}
void Widget::delay()
{
QTime reachtime = QTime::currentTime().addMSecs(1);
while(QTime::currentTime() < reachtime);
}