QT 시리얼 통신 프로그램 질문입니다!
안녕하세요, QT 초보입니다!!!!
타겟보드와 리눅스 간 시리얼 통신 프로그램을 만들려고 합니다.
커널로 부팅했을 시에는 정상적으로 값이 오고가는데요
문제는 부트로더에 들어갔을 때 정상적인 작동이 되지 않습니다.
스페이스바를 입력 받고! (EZ-S3C2440 사용 중)
그다음 EZBOOT> 프롬프트가 뜬 다음에 엔터가 쳐지고
그다음 프롬프트가 떠야 하는데... 전혀 안뜨고 반응이 없습니다.ㅠㅠㅠㅠㅠㅠ
어디가 문제일까요 ㅠㅠ
소스 첨부 합니다.
//serial.h
#ifndef SERIAL_H
#define SERIAL_H
#define DEVICE01 "/dev/ttyS0"
#define DEVICE02 "/dev/ttyS1"
#define DEVICE03 "/dev/ttyS2"
#define DEVICE04 "/dev/ttyUSB0"
#define DEVICE05 "/dev/ttyUSB1"
// Baudrate 설정은 에 정의되어 있다.
// 는 에서 include 된다.
#define BAUDRATE1200 B1200
#define BAUDRATE2400 B2400
#define BAUDRATE4800 B4800
#define BAUDRATE9600 B9600
#define BAUDRATE14400 B14400
#define BAUDRATE19200 B19200
#define BAUDRATE38400 B38400
#define BAUDRATE56000 B56000
#define BAUDRATE57600 B57600
#define BAUDRATE115200 B115200
#define FALSE 0
#define TRUE 1
#define BUFF_SIZE 1024
#define _POSIX_SOURCE 1 /*POSIX 호환 소스*/
//volatile int STOP = FALSE;
#include
#include
#include
#include // O_RDWR, O_NOCTTY 등의 상수 정의
#include // B115200, CS8 등의 상수 정의
#include
#include
#include
#include
#include
class Serial : public QObject
{
Q_OBJECT
public:
Serial()
{
}
void setPort(QString port)
{
this->port = port;
}
void setBaudrate(QString baudrate)
{
this->baudrate = baudrate;
}
char* readBuf();
signals:
void readBuffer();
public slots:
int writeMsg(const char *msg, int size);
int connect_serial();
protected slots:
void ssetEvent();
private:
int fd;
QSocketNotifier *notRsRead;
QString port;
QString baudrate;
char buf[BUFF_SIZE + 5];
};
#endif // SERIAL_H
//serial.cpp
#include "/home/june/QT/serial.h"
int Serial::connect_serial()
{
struct termios newtio;
int res;
if(port == "ttyS0")
{
fd = ::open(DEVICE01, O_RDWR | O_NOCTTY | O_NONBLOCK);
}
else if(port == "ttyS1")
{
fd = ::open(DEVICE02, O_RDWR | O_NOCTTY | O_NONBLOCK);
}
else if(port == "ttyS2")
{
fd = ::open(DEVICE03, O_RDWR | O_NOCTTY | O_NONBLOCK);
}
else if(port == "ttyUSB0")
{
fd = ::open(DEVICE04, O_RDWR | O_NOCTTY | O_NONBLOCK);
}
else
{
fd = ::open(DEVICE05, O_RDWR | O_NOCTTY | O_NONBLOCK);
}
if(fd < 0)
{
return fd;
}
else
{
memset(&newtio, 0, sizeof(newtio));
if(baudrate == "1200")
newtio.c_cflag = BAUDRATE1200;
else if(baudrate == "2400")
newtio.c_cflag = BAUDRATE2400;
else if(baudrate == "4800")
newtio.c_cflag = BAUDRATE4800;
else if(baudrate == "9600")
newtio.c_cflag = BAUDRATE9600;
else if(baudrate == "19200")
newtio.c_cflag = BAUDRATE19200;
else if(baudrate == "38400")
newtio.c_cflag = BAUDRATE38400;
else if(baudrate == "57600")
newtio.c_cflag = BAUDRATE57600;
else if(baudrate == "115200")
newtio.c_cflag = BAUDRATE115200;
newtio.c_cflag |= CS8;
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
notRsRead = new QSocketNotifier(fd, QSocketNotifier::Read, this);
connect(notRsRead, SIGNAL(activated(int)), this, SLOT(ssetEvent()));
}
}
void Serial::ssetEvent()
{
int szRead;
szRead = ::read(fd, buf, sizeof(buf));
buf[szRead] = '\0';
emit readBuffer();
}
char* Serial::readBuf()
{
return buf;
}
int Serial::writeMsg(const char *msg, int size)
{
int i = ::write(fd, msg, size);
return i;
}
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include "/home/june/QT/serial.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void fn_sendProc(char *input, int size);
public slots:
void setEvent();
protected slots:
//void keyPressEvent(QKeyEvent *e);
// pushButton 사용자 정의 함수
private slots:
void on_connectButton_clicked();
void on_sendButton_clicked();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
Serial *serial;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
serial = new Serial();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
//lable 변경 하는 버튼 함수
void MainWindow::on_connectButton_clicked()
{
/*
#define DEVICE01 "/dev/ttyS0"
#define DEVICE02 "/dev/ttyS1"
#define DEVICE03 "/dev/ttyS2"
#define DEVICE04 "/dev/ttyUSB0"
#define DEVICE05 "/dev/ttyUSB1"
#define BAUDRATE1200 B1200
#define BAUDRATE2400 B2400
#define BAUDRATE3800 B4800
#define BAUDRATE9600 B9600
#define BAUDRATE14400 B14400
#define BAUDRATE19200 B19200
#define BAUDRATE38400 B38400
#define BAUDRATE56000 B56000
#define BAUDRATE57600 B57600
#define BAUDRATE115200 B115200
*/
QString port = ui->portBox->currentText();
QString baudrate = ui->baudrateBox->currentText();
serial->setPort(port);
serial->setBaudrate(baudrate);
int fd = serial->connect_serial();
QObject::connect(serial, SIGNAL(readBuffer()),this, SLOT(setEvent()));
if(fd < 0)
{
QMessageBox::warning(this,tr("COM Port Open Error"), tr("Didn't open the this COM port"), QMessageBox::Yes);
}
}
void MainWindow::setEvent()
{
ui->textEdit->insertPlainText(QString::fromLocal8Bit(serial->readBuf()));
ui->textEdit->moveCursor(QTextCursor::End);
}
void MainWindow::on_sendButton_clicked()
{
QString inputString = ui->sendEdit->text() + "\n";
const char* sendText = inputString.toStdString().data() ;
if( 0 > serial->writeMsg(sendText, strlen(sendText)))
QMessageBox::critical(this, tr("Error"), tr("Send Error"), QMessageBox::Ok);
ui->sendEdit->clear();
}
자답입니다.
부트로더가 인식하는 "\n"을 ㅠㅠ "\r\n"으로 해주니 바로 해결되었습니다.
Source 상의 문제가 아니라 Boot-loader와 Kernel의 "\n"인식 여부에 대한 차이였네요! 참고가 되었으면 좋겠습니다! ㅠㅠㅠㅠㅠ
고맙습니다
좋은 feedback 고맙습니다
댓글 달기