Rev 345 | Blame | Last modification | View Log | Download | RSS feed
#include "SerialController.h"SerialController::SerialController(QObject *parent) : QObject(parent){connected = false;speeds << "9600" << "19200" << "38400" << "57600" << "115200" << "230400" << "250000";bufferInIndex = 0;bufferInOverflow = false;}SerialController::~SerialController(){serialPort->close();delete serialPort;}void SerialController::Serial_QueryParameters(){QList<QSerialPortInfo> portsList = QSerialPortInfo::availablePorts();QStringList ports;for (int i = 0; i < portsList.size(); i++) {ports.append(portsList[i].portName());}emit Serial_UpdateParameters(ports, speeds);}void SerialController::Serial_Connect(QString port, QString speed){if (!connected) {serialPort = new QSerialPort();connect(serialPort, SIGNAL(readyRead()), this, SLOT(Serial_ProcessIncomingData()));serialPort->setPortName(port);if (!serialPort->open(QIODevice::ReadWrite)) {Serial_Disconnect();} else {connected = true;bool ok = false;int baud = speed.toInt(&ok);if (ok) serialPort->setBaudRate(baud);serialPort->setDataBits(QSerialPort::Data8);serialPort->setParity(QSerialPort::NoParity);// serialPort->setFlowControl(QSerialPort::HardwareControl);serialPort->setStopBits(QSerialPort::OneStop);// See http://umforum.ultimaker.com/index.php?/topic/5886-um2-controller-resetreboot-when-opening-usb-port-on-linux/serialPort->setDataTerminalReady(1);if (ok) emit Serial_Connected();}}}void SerialController::Serial_Disconnect(){serialPort->close();delete serialPort;connected = false;emit Serial_Disconnected();}void SerialController::Serial_TransmitString(QString string){serialPort->write(string.toStdString().c_str());serialPort->write(SERIAL_NEWLINE_CHAR);}void SerialController::Serial_ProcessIncomingData(){char tmpBuffer[SERIAL_BUFFER_SIZE];int len = serialPort->read(tmpBuffer, sizeof(tmpBuffer));while (len > 0) {for (int i = 0; i < len; i++) {// Save received data into local bufferbufferIn[bufferInIndex] = tmpBuffer[i];// If newline char is received, end current stringif (tmpBuffer[i] == '\n') {if (bufferInOverflow)currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));elsecurrString = QString::fromLocal8Bit(bufferIn, bufferInIndex);bufferInOverflow = false;bufferInIndex = 0;emit Serial_ReceivedString(currString);} else {bufferInIndex++;}// If received string is larger than our serial buffer, append to previous dataif (bufferInIndex == SERIAL_BUFFER_SIZE-1) {bufferIn[SERIAL_BUFFER_SIZE-1] = 0x0;if (bufferInOverflow)currString.append(QString::fromLocal8Bit(bufferIn, bufferInIndex));elsecurrString = QString::fromLocal8Bit(bufferIn, bufferInIndex);bufferInOverflow = true;bufferInIndex = 0;}}// Check if there is more data to be read from the serial portlen = serialPort->read(tmpBuffer, sizeof(tmpBuffer));}}