2012-11-25 3 views
1

Visual Studio 2010에서 OpenCV을 사용하여 개체를 추적하고 있으며 카메라에 연결된 servos를 회전시키기 위해 Arduino에 값을 보내려고합니다. Arduino Uno을 사용하고 있습니다. 객체를 추적하고 카메라를 회전해야하는 방향을 결정하는 코드 인 C++을 완성했지만이 데이터를 Arduino로 보내는 데 문제가 있습니다. 현재이 케이블에 RS-232 케이블을 사용하려고합니다. 저는 Arduino를 프로그래밍하기 위해 Type-B USB 케이블을 사용하고 Visual Studio에서 Arduino로 데이터를 보내려고 RS-232를 사용하고 있습니다. 프로그램이 제대로 된 방향을 통신 할 수 있다면보고 두 개의 서로 다른 LED가 빛을 시도하기 위해 사용하고 내가이있는 아두 이노 코드 측에Visual Studio 2010 Arduino 직렬 통신

 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; 
} 

: 여기에 비주얼 스튜디오 시리얼 통신에 대한 내 코드는

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); 
} 

내 해석 I는 (연속적으로 직렬 통신을 통해 데이터를 전송)를 C++ 프로그램을 시작하고 RX 핀에 RS-232에서 TX 핀을 부착 할 필요가있다 : 그것은 회전해야 (디지털 0) Arduino에. stk500_getsync() :하지 동기화 : 나는이 오류를 부여하고있는 아두 이노에 프로그램,

avrdude 업로드 할 때 인공 호흡기를 = × 00

내가가는 전선이 경우에만 발생 이 와이어가 아무 것도 연결되어 있지 않아도 RX 핀에 연결하십시오. 이 오류는 RX가 9600의 전송 속도로 입력을 찾고 있기 때문에 발생하지만 C++ 프로그램이 실행 중이고 9600의 속도로 데이터를 전송할 때도 여전히이 오류가 발생합니다.

어떻게 할 수 있습니까? 직렬 통신을 통해 랩톱에서 실시간 이미지 처리를 수행하는 Visual Studio 프로젝트에서 Arduino로 가치를 보냅니 까?

+1

왜 런타임 데이터에 대한 별도의 시리얼 케이블을 사용하는 대신 같은 USB 직렬 채널을 통해 전송하기 프로그램을 다운로드하는 데 사용된다? –

+0

저는 시리얼 통신에 익숙하지 않고 초기 프로그래밍과 관련이없는 데이터를 유형 b usb를 통해 계속 보낼 수 있다는 것을 깨닫지 못했습니다. 먼저 Arduino를 프로그래밍 한 다음 arduino를 프로그래밍하는 데 사용 된 것과 동일한 포트에 C++을 작성하여 C++ 프로그램을 실행합니까? – jalconvolvon

+0

예. 그냥 직렬 포트처럼 취급하십시오. 수정 사항을 스케치에 다운로드하기 전에 사용자 정의 프로그램에서 포트를 릴리스 (또는 종료)해야합니다. 또한 레벨 쉬프터없이 rs232 케이블을 사용했다면 과전압으로 arduino가 손상되었을 수 있습니다. 첫 번째 질문은 사용자 정의 케이블을 제거하고 PC 부팅 후 사용자 정의 프로그램을 실행하지 않고 프로그램하는 경우입니다. –

답변

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); 
+0

나는 당신의 제안과 코멘트의 조합을 통해 도움을 얻을 수 있었다. – jalconvolvon