Сбой чтения/записи termios Arduino

Здравствуйте, у меня возникли проблемы с попыткой запрограммировать Arduino для получения команд из программы на C++. Я использую termios для подключения к Arduino. Arduino находится в режиме шлюза (по сути, он не выполняет сам код, а ожидает ввода от моей программы для взаимодействия с оборудованием, которое я подключаю к нему).

У меня термиос настроен так:

SerialHandler::SerialHandler(char* fPath, int bRate)
{
filePath = fPath;
baudRate = 0;

//Open the file, file is of type int
file = open(filePath, O_RDWR | O_NOCTTY);
if(file<0) //If there is an error opening the file
{
    perror(filePath);
    exit(-1);
}
//Save the old port settings
tcgetattr(file, &oldtio);
bzero(&newtio, sizeof(newtio));
//now to load the baudrate
getBaudRate(bRate, baudRate);
newtio.c_cflag = baudRate | CRTSCTS | CS8 | CLOCAL | CREAD;

//IGNPAR ignore bits with parity errors
//ICRNL  map CR to NL ..May have to change to raw input processing
newtio.c_iflag = IGNPAR;

//Raw output
newtio.c_oflag = 0;

//ICANON - enable canonical input
//disables echo functionality, doesnt send signals to calling program
newtio.c_lflag = ICANON;

//Clean and activate port
tcflush(file, TCIFLUSH);
tcsetattr(file, TCSANOW, &newtio);
}

И мой код для записи и чтения в Arduino таков:

void SerialHandler::getSerialOutput(char* readBuffer, int& bufferPoint)
{
cout <<"Beginning read\n";


bufferPointer = read(file, outputBuffer,255);
cout <<"Finished Read\n";
for(int i=0;i<bufferPointer;i++)
{
    cout << outputBuffer[i]<<endl;
    readBuffer[i] = outputBuffer[i];
}
bufferPoint = bufferPointer;
}


void SerialHandler::writeSerial(char* writeBuffer, int length)
{
cout << "Writing: " << writeBuffer<<endl;
write(file,writeBuffer,length);
cout << "Finished Write \n";
}

Сначала я посылаю Arduino тестовую команду («AT\r\n»), и она отвечает («ОК»), но после этого любое последующее чтение/запись завершается ошибкой.

В тестовой команде загораются контакты Arduino RX и TX (это означает, что он получает и передает данные), но и команды, которые я отправляю после этого, терпят неудачу. Arduino не загорается, когда я пытаюсь записать в него, и любые команды чтения зависают на неопределенный срок.

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


person scrineym    schedule 18.05.2013    source источник
comment
Всегда проверяйте возвращаемое значение write(), обрабатывайте частичные записи.   -  person    schedule 19.05.2013
comment
Привет, вы имеете в виду присвоить возвращаемое значение int? Я только что попробовал это, и результат был 4 для команды, которая сработала, и 10 для другой команды. Это имеет смысл, потому что первая команда имеет длину 4 символа, а вторая — 10, но программа все еще не записывает команду в Arduino.   -  person scrineym    schedule 19.05.2013
comment
похоже на проблему со скоростью передачи данных. Как получить информацию о скорости передачи данных? Вы знаете, что аргумент скорости передачи должен быть одной из констант BXXXX и не является произвольным?   -  person    schedule 19.05.2013
comment
Да, метод getBaudRate() определяет, какая скорость передачи необходима из переданного bRate, а затем устанавливает переменную baudRate в правильное значение BXXXX.   -  person scrineym    schedule 19.05.2013


Ответы (1)


Попробуйте удалить CRTSCTS из строки newtio.c_cflag. CRTSCTS необходим при подключении всех кабелей последовательного соединения. При использовании Arduino вы подключаете только линии tx rx и gnd. Дополнительную информацию см. на справочной странице termios http://linux.die.net/man/3/termios< /а>

person Bruno Alexandro García Tejada    schedule 26.05.2016