Здравствуйте, у меня возникли проблемы при попытке запрограммировать Arduino для получения команд из программы на C ++. Я использую termios для подключения к Arduino. Arduino находится в режиме шлюза (в основном он не выполняет сам код, но ожидает ввода от моей программы для взаимодействия с оборудованием, к которому я подключаюсь).
Мои настройки termios таковы:
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»), и он отвечает («OK»), но после этого любая последующая операция чтения / записи завершается неудачно.
На тестовой команде загораются контакты Rdu и TX Arduino (это означает, что они получают и передают данные), но и команды, которые я посылаю после этого, дают сбой. Arduino не горит, когда я пытаюсь записать в него, и любые команды чтения зависают на неопределенное время.
Я думаю, что проблема в чем-то вроде закрытия обработчика файлов, но я не уверен, как это проверить, или это может быть совсем другая проблема.
Попробуйте удалить CRTSCTS из строки newtio.c_cflag. CRTSCTS необходим при подключении всех кабелей последовательного соединения. При использовании Arduino вы подключаете только линии tx rx и gnd. Для получения дополнительной информации см. Справочную страницу termios. http://linux.die.net/man/3/termios
Других решений пока нет …