0

好的,我有问题。我正在编写一些使用微软飞行模拟器 X SDK 和 Arduino 的东西。该应用程序应该通过串行端口将数据发送到 arduino 板,我正在使用以下功能:

http://playground.arduino.cc/Interfacing/CPPWindows

该程序运行良好,只是它突然停止工作。该程序是一个循环while(1),它不断地执行一个向模拟器请求数据的函数,然后通过串行发送一个字符串。这是我调用函数 WriteData 的方式:

WriteData((char *)cadena.c_str(),8);

作为cadena我要发送的字符串。函数 WriteData 是这样的:

bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;
    //Try to write the buffer on the Serial port
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);

        return false;
    }
    else
        return true;
    }

我已经看到,如果我评论了整个if-else,所以该函数WriteFile永远不会被调用,程序不会停止工作并且会完美运行(除了信息没有发送到 Arduino 的事实)。如果该行被执行,那么程序会在一分钟左右后停止。停止我并不是指崩溃或任何事情,我只是说它停止了,控制台仍然存在所有消息,它只是停止工作。

会发生什么?

编辑:好的,arduino 还在连续发送程序从未读取过的数据,这可能是个问题吗?可能是缓冲区已满,WriteFile 正在等待空间写入它?,因为知道我不写入串行,它似乎工作得很好......

4

1 回答 1

0

当传输缓冲区被填满时,WriteFile() 将停止。只有当您正确设置握手时,它才会清空。无论是电气,还是连接 DSR 和 CTS 信号,这在 Arduino 上往往会被跳过。或者通过禁用握手,SetCommState() 函数。使用 SetCommTimeouts() 设置超时是添加一些最小错误恢复的另一个不错的策略。

不读取 Arduino 发送的数据也不会获得很多分数。最好是逐步实现这一点,这样您就可以一次专注于解决一个问题。但是,它通常不会阻止 PC 传输数据,以握手接线错误为模。

于 2013-06-01T20:25:37.760 回答