串口通信Arduino,C ++

时间:2013-06-01 18:36:17

标签: c++ serial-port arduino

好的,我遇到了问题。我正在编写一些使用微软飞行模拟器X SDK和Arduino的东西。应用程序应该通过串口发送数据到arduino板,我正在使用这个函数:

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

该程序完美无缺,但突然停止工作。程序是循环,而(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正在等待空间写入吗?因为知道我没有写入串口,它似乎工作得很好......

1 个答案:

答案 0 :(得分:0)

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

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