arduino和visual studio c ++,2路串行通信

时间:2016-12-30 09:39:18

标签: c++ c visual-studio arduino serial-communication

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

我使用了来自http://playground.arduino.cc/Interfacing/CPPWindows的库文件,它们是两个文件: SerialClass.h Serial.cpp。我正在使用 readData () WriteData()功能在我的主要部分。

我想再运行几次,用户可以在控制台中输入,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:
...

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

memset(data,0,4); 

data[4]='\0';

但它仍然无法正常工作并跳过要求输入。有什么建议我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:0)

建议发布"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);