QT 시리얼 통신 프로그램 질문입니다!

god10276의 이미지

안녕하세요, 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();
}

god10276의 이미지

부트로더가 인식하는 "\n"을 ㅠㅠ "\r\n"으로 해주니 바로 해결되었습니다.

Source 상의 문제가 아니라 Boot-loader와 Kernel의 "\n"인식 여부에 대한 차이였네요! 참고가 되었으면 좋겠습니다! ㅠㅠㅠㅠㅠ

라스코니의 이미지

좋은 feedback 고맙습니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.