arduino 和 Visual Studio C++,2 路串行通信

Posted

技术标签:

【中文标题】arduino 和 Visual Studio C++,2 路串行通信【英文标题】:arduino and visual studio c++, 2 way serial communication 【发布时间】:2016-12-30 09:39:18 【问题描述】:

我正在使用 Arduino 和 Visual Studio C++ 并尝试构建双向实时串行通信。 我使用的是win 10(在VMware Fusion中),32位系统,visual studio 2013,Arduino IDE 1.8.0和Arduino board Uno。

我使用了来自http://playground.arduino.cc/Interfacing/CPPWindows 的库文件,它们是两个文件:SerialClass.hSerial.cpp。 我正在使用 readData() WriteData() 函数在我的 main 中。

我想再运行几次,用户可以在控制台中输入,Arduino 会相应地生成输出。但是当我添加while循环时,它不能正常工作。

下面是我的main.cpp:(注释行带有while循环)

int main() 
    Serial* port = new Serial("COM3");
    if (port->IsConnected()) cout << "Connected!" << endl;

    char data[4] = "";
    char command[2] = "";
    int datalength = 4;  //length of the data,
    int readResult = 0;
    int n;

        for (int i = 0; i < 4; ++i)  data[i] = 0;  //initial the data array

        //read from user input 
        //this is where I added while loop 
      // while(1)
        std::cout << "Enter your command: ";
        std::cin.get(command, 2);     //input command 
        int msglen = strlen(command);
        if (port->WriteData(command, msglen));   //write to arduino
        printf("\n(writing success)\n");

        //delay
        Sleep(10);

        //read from arduino output
        n = port->ReadData(data, 4);
        if (n != -1)
            data[n] = 0;
            cout <<"arduino: " data << endl;
        
     //  

    system("pause");
    return 0;

还有我的arduino代码:

void setup() 
    // put your setup code here, to run once:
    Serial.begin(9600);
    


void loop() 
    // put your main code here, to run repeatedly:
    if (Serial.available() > 0) 
        char c = Serial.read();
        if (c == '1') 
          Serial.write("10");
        else if (c == '2') 
          Serial.write("20");
        else if (c == '3') 
          Serial.write("30");
        else
        Serial.write("Invalid");
    


如果我在没有while循环的情况下运行我的代码,我可以得到我想要的:

Connection established!!!
Enter your command: 1
arduino: 10

但是当添加while循环时,它会跳过询问输入,我的输出变成:

Enter your command: 1
arduino: 10
Enter your command: arduino:
Enter your command: arduino:
Enter your command: arduino:
Enter your command: arduino:
...

尝试了一些解决方案后,我认为可能是缓冲区 data[] 和 command[] ,我没有在下次运行前清空它。但我已经尝试过

memset(data,0,4); 

data[4]='\0';

但它仍然不起作用并跳过询问输入。有什么建议我该如何解决?谢谢!

【问题讨论】:

【参考方案1】:

根据"How do I flush the cin buffer?" 的建议,问题出在您的std::cin.get(command, 2); 代码之后。额外的字符保留在std::cin 中,并在下次调用时直接重复使用。第一个额外字符是'\n'(输入键),std::cin.get() 将返回 0。

最好的解决办法是在得到命令后忽略多余的字符。

std::cout << "Enter your command: ";
std::cin.get(command, 2);     //input command
std::cin.clear(); // to reset the stream state
std::cin.ignore(INT_MAX,'\n'); // to read and ignore all characters except 'EOF' 
int msglen = strlen(command);

而不是

std::cout << "Enter your command: ";
std::cin.get(command, 2);     //input command 
int msglen = strlen(command);

【讨论】:

还有一个问题...当我尝试使用蓝牙 HC-05 连接 arduino 时,它在 Arduino 串行监视器上运行良好,但如果我使用 Visual Studio 连接(即使我选择了更正COM端口),它无法提供正确的输出,并且还显示错误:_Arduino2.exe中0x00CD7037处的未处理异常:RangeChecks检测代码检测到超出范围的数组访问。_知道为什么会发生吗?提前谢谢你... 在提供的源代码中,有char data[4] = "";,后跟n = port-&gt;ReadData(data, 4);data[n] = 0;,意思是在n = 4的情况下,最后一个data[n] = 0;超出范围...所以尝试改变数据字符串的大小 ==> char data[5] = "";.

以上是关于arduino 和 Visual Studio C++,2 路串行通信的主要内容,如果未能解决你的问题,请参考以下文章

初次使用visual studio

Microsoft Visual C++ 2010 和 Arduino UNO 之间通过 USB 进行串行通信

Visual Studio 开发:安装配置Visual Studio Code

visual studio 怎么编译

visual studio 2010怎么新建c语言文件

visual studio 2010编译c的设置方法