2016-12-30 4 views
0

Я использую Arduino и Visual studio C++ и пытаюсь построить двухстороннюю последовательную связь в реальном времени. Я использую win 10 (в VMware Fusion), 32-битную систему, визуальную студию 2013, Arduino IDE 1.8.0 и Arduino board Uno.arduino и visual studio C++, двухсторонняя последовательная связь

Я использовал библиотеку файлов из http://playground.arduino.cc/Interfacing/CPPWindows, которые два файла: SerialClass.h и Serial.cpp. И я использую readData() и WriteData() Функция в моем основном.

Я хочу запустить его еще несколько раз, пользователь может ввести ввод в консоль, и Arduino будет генерировать результат соответственно. Но когда я добавил цикл while, он работает неправильно.

Ниже мой main.cpp: (с в то время как цикл в строке комментария)

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 

Но когда добавить во время цикла, он пропускает просит вход, и мой выход становится:

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'; 

Но она по-прежнему не работает, и пропустить задаёте. Любое предложение, как я могу его решить? Благодаря!

ответ

0

Как предложить этот столбец "How do I flush the cin buffer?", возникнует проблема после кода std::cin.get(command, 2);. Дополнительные символы остаются в std::cin и могут быть использованы повторно при следующем вызове. И первый дополнительный символ - '\n' (Enter Key), и 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); 
+0

Спасибо! Оно работает!! – Vera

+0

Еще одна проблема ... Когда я попытался подключить arduino, используя bluetooth, HC-05, он отлично работает на серийном мониторе Arduino, но если я использую визуальную студию для подключения (даже я выбрал правильный COM-порт), это не может дать корректный вывод, а также показывает ошибку: Исключенное исключение в 0x00CD7037 в Arduino2.exe: Код измерительной системы RangeChecks обнаружил доступ к диапазону вне диапазона. Любая идея, почему это происходит? Заранее благодарю вас ... – Vera

+0

В предоставленном исходном коде есть 'char data [4] =" ";, а затем' n = port-> ReadData (данные, 4); 'и' data [n] = 0; 'означает, что в случае' n = 4', последние 'data [n] = 0;' находятся вне диапазона ... Поэтому попробуйте изменить размер строки данных ==> 'char data [5 ] = ""; ". –

Смежные вопросы