2012-11-25 103 views
1

我在Visual Studio 2010中使用OpenCV来跟踪一个对象,我试图给Arduino发送一个值来旋转连接到摄像头的舵机。我正在使用Arduino Uno。我已经完成了跟踪物体的C++代码,并确定相机需要旋转的方向,但是我无法将这些数据发送给Arduino。我目前正在尝试使用RS-232电缆。我正在使用Type-B USB电缆编程我的Arduino和一个RS-232以尝试将数据从Visual Studio发送到Arduino。这里是我的Visual Studio的串口通信代码: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; 
} 

在Arduino的代码方面我有这个,我现在用的试图点燃两个不同的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到RX引脚连接TX引脚(数字0)在Arduino上。当我尝试上传到Arduino我给出一个错误的程序,

AVRDUDE:)stk500_getsync(:不同步:RESP = 0×00

这只有当我有一个线会发生进入RX引脚,即使这条导线没有连接任何东西。我相信这个错误发生是因为RX正在寻找一个波特率为9600的输入,但是当C++程序运行并且以9600的速率发送数据时它仍然给我这个错误。

怎么能我通过串行通信将Visual Studio项目中的值通过笔记本电脑上的实时图像处理发送给Arduino?

+1

你为什么要使用运行时数据的单独串行电缆而不是将它在相同的USB串行通道使用下载程序? –

+0

我对串行通信没有经验,并没有意识到我可以通过类型b USB继续发送与初始编程无关的数据。我会首先编程Arduino,然后运行C++程序,C++写入用于编程arduino的相同端口? – 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