Я пытаюсь узнать, как использовать последовательные порты с использованием C / C ++ (в основном C ++) в Xubuntu Linux 12.10. Я нашел пару полезных учебных пособий, но, как и во всех учебных пособиях, текст является консервативным и не затрагивает многие «ошибки». Я пытаюсь сделать что-то простое: открыть последовательный порт (отправленный в качестве параметра командной строки), получить начальные настройки порта и распечатать их, а затем инициализировать порт для новых настроек.
Вот что я имею до сих пор:
#include <termios.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
using namespace std;
int main(int count, char* parms[])
{
if (count != 2)
exit(1);
//open port
string fname = parms[1];
cout << fname << ": ";
int fd = open(fname.c_str(), O_RDWR | O_NOCTTY | O_NDELAY );
if (!fd)
{
cout << "error" << endl;
exit(1);
}
termios getPortSettings, setPortSettings;
//get current port settings
tcgetattr(fd,&setPortSettings);
getPortSettings = setPortSettings;
speed_t iBaud = cfgetispeed(&getPortSettings),
oBaud = cfgetospeed(&getPortSettings);
cout << "iBaud: " << iBaud << " oBaud: " << oBaud << endl;
cout << "\nPress Enter to change port status";
cin.get();
//set baud rate 19200
cfsetispeed(&setPortSettings,B19200);
cfsetospeed(&setPortSettings,B19200);
//set to no parity
setPortSettings.c_cflag &= ~PARENB;
//one stop bit
setPortSettings.c_cflag &= ~CSTOPB;
//clear out current word size
setPortSettings.c_cflag &= ~CSIZE;
//set 8 data bits
setPortSettings.c_cflag |= CS8;
//apply settings
int ret = tcsetattr(fd,TCSAFLUSH,&setPortSettings);
if (ret < 0)
{
cout << "error ("<< ret <<") in applying settings!\n";
exit(1);
};
tcgetattr(fd,&setPortSettings);
iBaud = cfgetispeed(&getPortSettings);
oBaud = cfgetospeed(&getPortSettings);
cout << "iBaud: " << iBaud << " oBaud: " << oBaud << endl;
//close port
close(fd);
return 0;
}
Когда я тестирую, я тестирую последовательные порты, такие как / dev / ttyS0, хотя / dev / ttyS31 (это действительно не должно иметь значения, какой я выберу здесь, верно?). Я могу открыть практически все интерфейсы и получить от них настройки (я хочу узнать, как извлечь другие настройки, просто скорость передачи данных выглядит как низко висящие фрукты, и мне нужно вернуться к битовой математике, необходимой для извлечь все остальное).
По сути, каждый раз, когда я выполняю вызов tcgetattr (), он завершается с общим кодом возврата -1. В конце концов, я хочу попробовать подключить два моих компьютера и отправить данные между ними с помощью простого нуль-модемного кабеля или USB-кабеля (код для этого в основном будет таким же, единственное отличие — файл устройства, верно?), и это только мой первый шаг в этом.
Задача ещё не решена.
Других решений пока нет …