Пример программы Ubuntu C ++ termios.h

Я много искал и пробовал много разных способов, но я не могу отправить данные в gtkterm через виртуальный последовательный мост (для тестирования!).

Моя идея — связаться с Atmega uC позже, но сначала я хотел проверить последовательную связь, настроив виртуальный последовательный мост с помощью soccat и управляя выходным последовательным портом с помощью gtkterm. Проблема в том, что я просто получаю бесполезные вещи в gtkterm … (см. Скриншоты)

команда soccat:

socat -d -d PTY: PTY:

Мост виртуального последовательного порта soccat кажется нормальным, потому что я могу отправлять данные с одного последовательного терминала на другой …

Настройки порта gtkterm:

Port: /dev/pts/6
Baudrate: 9600
Parity: none
Bits: 8
Stopbits: 1
Flow control: none

Мой маленький графический интерфейс компилируется и работает нормально, с входным путем «/ dev / pts / 6» и входной скоростью 9600. Кажется, что программа работает нормально, но в gtkterm есть только вопросительные знаки и четырехугольники с символами в каждом углу. Скажем, он не интерпретируется и не зависит от знаков в качестве входных данных, НО длина выходных данных в gtkterm изменяется в зависимости от длины входных данных (количество знаков, которые я набираю).

Наконец вот мой код:

main.cpp:

#include <iostream>
#include "serial/serial_communication.cpp"
std::string inputStringUser = "";
int inputIntUser = 0;
std::string pathSerial = "/dev/...";
int baudrate = 19200;

int main()
{
std::cout << "main() [communication_serial_uC] started..." <<        std::endl;

//GETTING STARTED
std::cout << "Use default port? " << pathSerial << " (Yes = y/ change port = insert the new path" << std::endl;
std::cin >> inputStringUser;
if(inputStringUser != "y" && inputStringUser != "Y")
pathSerial = inputStringUser;
std::cout << "Serial Port is set to: " + pathSerial << std::endl;

std::cout << "Use default baudrate? " << baudrate << "Yes = 0/     change baudrate = insert new baudrate" << std::endl;
std::cin >> inputIntUser;

if(inputIntUser > 0)
baudrate = inputIntUser;
std::cout << "Baudrate is set to: " << baudrate << std::endl;

Serial_communication myPort(pathSerial, baudrate);

//OPEN/ CONFIGURATE PORT
if(myPort.openPort(pathSerial, baudrate) < 0)
{
std::cout << "Error: opening" << std::endl;
return -1;
}

//WRITE PORT
std::cout << "Insert your 'message': (exit = 'exit')" << std::endl;
std::cin >> inputStringUser;
while(inputStringUser != "exit")
{
if(myPort.sendPort(inputStringUser) < 0)
{
std::cout << "Error: sending" << std::endl;
return -1;
}
std::cout << "Insert your 'message': (exit = 'exit')" << std::endl;
std::cin >> inputStringUser;
}

//CLOSE PORT
if(myPort.closePort() < 0)
{
std::cout << "Error: closing" << std::endl;
return -1;
}

std::cout << "main() [communication_serial_uC] beendet..." << std::endl;
return 0;
}

последовательный / serial_communication.hpp:

#include <iostream>
#include <string>
#include <cstring>
#include <fcntl.h>
#include <termios.h>

class Serial_communication{

public:
Serial_communication(std::string paramPathSerial, int paramBaudrate);
~Serial_communication();

int openPort(std::string pathSerial, int baudrate);
int sendPort(std::string testString);
int closePort();

private:
std::string pathSerial;
int baudrate;

//filedescriptors
int fd;
};

последовательный / serial_communcation.cpp

#include <iostream>

#include "serial_communication.h"
Serial_communication::Serial_communication(std::string paramPathSerial, int paramBaudrate)
{
fd = 0;
pathSerial = paramPathSerial;
baudrate = paramBaudrate;
}

Serial_communication::~Serial_communication()
{
}

int Serial_communication::openPort(std::string pathSerial, int baudrate)
{
std::cout << "openPort() [serial_communication] started with the following paramters... pathSerial = " << pathSerial << ", baudrate = " << baudrate << std::endl;

//OPENING PORT

//open serial port
fd = open(pathSerial.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0)
{
std::cout << "Error [serial_communcation]: opening Port: " << pathSerial << std::endl;
return -1;
}

//struct termios
struct termios serial, serial_old;

//get parameters associated with the terminal
if(tcgetattr(fd, &serial) < 0)
{
std::cout << "Error [serial_communication]: getting configuration" << std::endl;
return -1;
}

//safe old parameters
serial_old = serial;

std::cout << "[serial_communication]: Port opened" << std::endl;
//SERIAL CONFIGURATION
/* Set Baud Rate */
cfsetospeed (&serial, (speed_t)baudrate);
cfsetispeed (&serial, (speed_t)baudrate);

//     Setting other Port Stuff
serial.c_cflag     &=  ~PARENB;            // Make 8n1
serial.c_cflag     &=  ~CSTOPB;
serial.c_cflag     &=  ~CSIZE;
serial.c_cflag     |=  CS8;

serial.c_cflag     &=  ~CRTSCTS;           // no flow control
serial.c_cc[VMIN]   =  1;                  // read doesn't block
serial.c_cc[VTIME]  =  5;                  // 0.5 seconds read timeout
serial.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines/* Make raw */
cfmakeraw(&serial);

/* Flush Port, then applies attributes */
tcflush( fd, TCIFLUSH );

//set attributes to port
if(tcsetattr(fd, TCSANOW, &serial) < 0)
{
std::cout << "Error [serial_communication]: set attributes" << std::endl;
return -1;
}

//CONFIGURATION FINISHED
std::cout << "openPort() [serial_communication] finished..." << std::endl;
return 1;
}

int Serial_communication::sendPort(std::string textString)
{
std::cout << "write() [Serial_communication] started with the following parameter... textString = " << textString << std::endl;
//attempt to send
if(write(fd, &textString, std::strlen(textString.c_str())) < 0)
{
std::cout << "Error [serial_communcation]: write";
return -1;
}

//SENDING FINISHED
std::cout << "write() [serial_communcation] finished..." << std::endl;
return 1;
}

int Serial_communication::closePort()
{
close(fd);
return 1;
}

Так что … это все, что я получил. Я старался изо всех сил и присоединился к информации со многих веб-сайтов и пробовал много примеров кодов. Моя проблема в том, что я даже не знаю, где искать, поэтому я ценю любую подсказку …
Если есть какие-либо вопросы или информация отсутствует, пожалуйста, дайте мне знать!

заранее спасибо
Thorben

Кстати, я не настолько опытен с C ++, и я открыт для комментариев о моем стиле, но это не должно быть главной проблемой …

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]