1

Visual Studio 2010 でOpenCVを使用してオブジェクトを追跡しています。Arduino に値を送信して、カメラに接続されているサーボを回転させようとしています。私はArduino Unoを使用しています。オブジェクトを追跡し、カメラを回転させる必要がある方向を決定するC++コードを完成させましたが、このデータを Arduino に送信するのに問題があります。現在、これにRS-232ケーブルを使用しようとしています。Type-B USB ケーブルを使用して Arduino をプログラムし、RS-232 を使用して Visual Studio から Arduino にデータを送信しようとしています。Visual Studio シリアル通信のコードは次のとおりです。

     int portspeed(int centerpix, int xmid)
{HANDLE hDevice = CreateFile(L"COM5",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
    DCB lpTest;
    GetCommState(hDevice,&lpTest);
    lpTest.BaudRate = CBR_9600;
    lpTest.ByteSize = 8;
    lpTest.Parity = NOPARITY;
    lpTest.StopBits = ONESTOPBIT;
    SetCommState(hDevice,&lpTest);
    DWORD btsIO;

    if (centerpix<xmid)
    {
        char test[] = "2";
        WriteFile(hDevice,test,strlen(test),&btsIO,NULL);
        cout << "Turn right " << test << endl;
    }
    else
    {
        char test[] = "3";
        WriteFile(hDevice,test,strlen(test),&btsIO,NULL);
        cout << "Turn left " << test << endl;
    }

    return 0;
}

Arduinoコード側では、これを使用して2つの異なるLEDを点灯させ、プログラムが回転する必要がある方向を正しく通信できるかどうかを確認しています。

int incomingByte = 0;   // For incoming serial data
void setup()
{
    Serial.begin(9600);     // Opens serial port, sets data rate to 9600 bit/s
}

void loop()
{
    // Send data only when you receive data:
    if (Serial.available() > 0)
    {
        incomingByte = Serial.read();
        if (incomingByte==50)   //if =2
            analogWrite(9,100);
        else
            analogWrite(9,0);
        if (incomingByte==51)   //if =3
            analogWrite(10,50);
        else analogWrite(10,0);
            delay(3000);
    }
    else
        analogWrite(9,255);
}

私の解釈では、C++ プログラム (シリアル通信を介してデータを継続的に送信する) を開始し、RS-232 からの TX ピンを Arduino の RX ピン (デジタル 0) に接続する必要があるということです。プログラムを Arduino にアップロードしようとすると、エラーが表示されます。

avrdude: stk500_getsync(): 同期していません: resp=0x00

これは、ワイヤがどこにも接続されていなくても、RX ピンにワイヤが接続されている場合にのみ発生します。このエラーは、RX がボー レート 9600 の入力を探しているために発生すると考えられますが、C++ プログラムが実行され、レート 9600 でデータが送信されている場合でも、このエラーが発生します。

ラップトップでリアルタイムの画像処理を行うVisual Studioプロジェクトから、シリアル通信を介してArduinoに値を送信するにはどうすればよいですか?

4

1 に答える 1

0

Win32の経験が限られている人(実際には.NETの人)として言えば、あなたの問題は書き込みバッファリングにあると思います。

デフォルトでは、ファイルまたはポートへの書き込みはメモリにバッファリングされます。おそらく、ファイル ハンドルを閉じたり、[FlushFileBuffers][3].

の前にこれを追加してみてくださいreturn 0;:

//After a time, sensitive write
FlushFileBuffers(hDevice);

//or, more properly for the end of the program.
CloseHandle(hDevice);
于 2012-11-25T02:05:16.383 に答える