【问题标题】:Visual Studio 2010 Arduino serial communicationVisual Studio 2010 Arduino 串行通信
【发布时间】:2012-11-25 01:52:56
【问题描述】:

我在 Visual Studio 2010 中使用 OpenCV 来跟踪对象,并且我正在尝试向 Arduino 发送一个值以旋转连接到相机的伺服系统。我正在使用Arduino Uno。我已经完成了C++ 代码,该代码跟踪对象并确定相机需要旋转的方向,但我无法将此数据发送到 Arduino。我目前正在尝试为此使用RS-232 电缆。我正在使用 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 代码方面,我有这个,我用它来尝试点亮两个不同的 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++ 程序(它通过串行通信连续发送数据),然后将 TX 引脚从 RS-232 连接到 Arduino 上的 RX 引脚(数字 0)。当我尝试将程序上传到 Arduino 时出现错误,

avrdude:stk500_getsync():不同步:resp=0x00

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

如何通过串行通信将值从在笔记本电脑上进行实时图像处理的 Visual Studio 项目发送到 Arduino?

【问题讨论】:

  • 为什么要使用单独的串行电缆来传输运行时数据,而不是通过用于下载程序的同一个 USB 串行通道发送数据?
  • 我对串口通信没有经验,没有意识到我可以通过type b usb继续发送与初始编程无关的数据。我会先对 Arduino 进行编程,然后再运行 C++ 程序,将 C++ 写入用于对 arduino 进行编程的同一端口?
  • 是的。只需将其视为串行端口即可。唯一要注意的是,您应该在尝试下载对草图的修改之前从您的自定义程序中释放端口(或退出它)。此外,如果您使用没有电平转换器的 rs232 电缆,您可能已经因过压损坏了 arduino。第一个问题是,它是否会在移除自定义电缆的情况下进行编程,并且自电脑启动以来没有运行您的自定义程序。
  • 根据您的建议,我能够让它工作,谢谢!

标签: winapi visual-c++ opencv serial-port arduino


【解决方案1】:

作为Win32 经验有限的人(实际上更像是.NET 的人),我认为您的问题可能出在写缓冲上。

默认情况下,对文件或端口的写入缓存在内存中。也许写入永远不会发送到端口,因为您永远不会关闭文件句柄或调用 [FlushFileBuffers][3]

尝试在return 0;之前添加这个:

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

//or, more properly for the end of the program.
CloseHandle(hDevice);

【讨论】:

  • 结合您的建议和 cmets 中的建议,我得以解决,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多