0

こんにちは、C++ プログラムからコマンドを取得するように Arduino をプログラムしようとして問題が発生しています。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」)で応答しますが、その後の読み取り/書き込みは失敗します。

テスト コマンドでは、Arduino の RX および TX ピンが点灯します (データを送受信していることを意味します) が、その後に送信したコマンドは失敗します。Arduinoに書き込もうとしても点灯せず、読み取りコマンドが無期限にハングします。

問題はファイル ハンドラーが閉じているようなものだと思いますが、これをテストする方法がわからないか、まったく別の問題である可能性があります。

4

1 に答える 1

0

CRTSCTS を newtio.c_cflag 行から削除してみてください。CRTSCTS は、シリアル接続のすべてのケーブルを接続するときに必要です。Arduino を使用する場合は、tx rx および gnd ラインのみを接続します。詳細については、termios のマニュアル ページを参照してくださいhttp://linux.die.net/man/3/termios

于 2016-05-26T11:37:40.267 に答える