我在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?
你为什么要使用运行时数据的单独串行电缆而不是将它在相同的USB串行通道使用下载程序? –
我对串行通信没有经验,并没有意识到我可以通过类型b USB继续发送与初始编程无关的数据。我会首先编程Arduino,然后运行C++程序,C++写入用于编程arduino的相同端口? – jalconvolvon
是的。只要把它当作一个串口就可以了。只有在你尝试下载修改草图之前,你应该从你的自定义程序中释放端口(或退出)。另外,如果您使用的是没有电平转换器的rs232电缆,则可能是因为过压而损坏了arduino。第一个问题是,如果它将自定义布线移除,并且没有在PC启动后运行自定义程序。 –