2015-05-17 4 views
0

я боролся этот вопрос на некоторое время теперь, и это сводит меня с ума:Связь между C & Arduino

Я пытаюсь общаться очень просто с Arduino Mega 2560 (через USB в качестве последовательного устройства) с компьютера под управлением Linux (Knoppix на usb-dok), когда все, что я пытаюсь выполнить на этом этапе, заключается в том, что для каждого номера, отправленного ноутбуком в Arduino, сигнал «stobe» переключается на High-Low или наоборот, и я использую этот строб для включения и выключения светодиода.

шт код сторона C:

#include <stdio.h> 
 

 
int main() 
 
{ 
 
\t FILE * Device = NULL; 
 
\t int counter = 0; 
 
\t 
 
\t Device = fopen("/dev/ttyACM0", "w+"); 
 
\t if(Device == NULL) 
 
\t { 
 
\t \t printf("could not open Device\n"); 
 
\t \t return -1; 
 
\t } 
 

 
\t while (counter < 10) 
 
\t { 
 
\t \t fprintf(Device, "%d\n", counter); 
 
\t \t printf("Sent to Device: %d\n", counter); 
 
\t \t counter++; 
 
\t \t sleep(2); 
 
\t } 
 

 
\t fclose(Device); 
 

 
return 0; 
 
}

Arduino код:

int cnt = 0; 
 
int strobe = 0; 
 
int num; 
 
int ValidInput = 0; 
 

 
char intBuffer[12]; 
 
String intData = ""; 
 
int delimiter = (int) '\n'; 
 

 
void setup() { 
 
    // put your setup code here, to run once: 
 
    Serial.begin(9600); 
 
    pinMode(3, OUTPUT); 
 
} 
 

 
int input; 
 

 
void loop() 
 
{ 
 
    while(num = Serial.available()) 
 
    { 
 
    delay(5); 
 
// Serial.println(num); 
 
    int ch = Serial.read(); 
 
    if(ch == delimiter) 
 
    { 
 
    ValidInput = 1; 
 
    break; 
 
    } 
 
    else 
 
    { 
 
     intData += (char) ch; 
 
    } 
 
    } 
 
    int intLen = intData.length() + 1; 
 
    intData.toCharArray(intBuffer, intLen); 
 
    intData = ""; 
 
    int i = atoi(intBuffer); 
 
    
 
    if(ValidInput) 
 
    { 
 
     if(i == 0) 
 
     { 
 
     strobe = 0; 
 
     Serial.print("Initializing strobe"); 
 
     } 
 
     else 
 
     { 
 
     strobe = !strobe; 
 
     } 
 
     
 
     digitalWrite(3, (strobe) ? HIGH : LOW); 
 
     Serial.println(i); 
 
     ValidInput = 0; 
 
    } 
 
}

Проблемы, которые я имею:

  1. Не уверен, что fopen - это правильный способ связи с последовательным устройством в Linux, и если да, то в каком режиме?
  2. Это основная проблема: я испытываю недетерминированное поведение: , если я запустил этот код прямо перед открытием «Последовательного монитора» редактора Arduino, он не работает, как я объяснял выше, вместо этого он превратит светодиод и сразу же, для каждого входящего нового номера. , но как только я открою «Серийный монитор», он будет действовать так, как я хочу, чтобы изменить состояние светодиода для каждого нового входящего номера.

Я думаю, что это имеет какое-то отношение к перезагрузке Ардуино или что-то в этом роде.

Я смотрел во многих разделах здесь и на других форумах и не мог найти решения этой проблемы.

Я бы очень признателен вам за понимание.

+0

Ваш код Arduino выглядит разумным. Попробуйте использовать http://www.libusb.org/ для ПК. –

+0

@SoundConception - нет, libusb здесь не логический выбор. Устройство USB обрабатывается последовательным интерфейсом ядра/модуля USB или (в данном случае) CDC/ACM. В прикладных программах должен использоваться Serial API, который пытается выполнить программа. Самая очевидная вещь, отсутствующая (и точно коррелированная с наблюдаемой проблемой), - это конфигурация порта и обычно требует дескриптора файла из open(), а не потока из fopen(). –

ответ

1

Прежде всего, сторона arduino выглядит нормально. На стороне Linux вам нужно провести некоторое повторное исследование, поскольку последовательная связь в системах posix немного сложнее, чем открытие файла и запись на него. Пожалуйста, используйте страницы руководства linux для терминов, где вы можете найти информацию о том, как настроить параметры коммуникационного порта, и использовать этот документ http://tldp.org/HOWTO/Serial-Programming-HOWTO/, чтобы узнать, как все это положить. Последовательное программирование howto проведет вас через процесс настройки порта, узнает, как его контролировать, и узнайте, как принимать входные данные из нескольких источников. Также для успешного доступа к последовательному порту из непривилегированной учетной записи вам может потребоваться добавить этого пользователя (пользователя) в определенную группу (группа удаленного доступа в Ubuntu и Fedora). Вы можете искать в Google о доступе к последовательному порту в Linux, и вы можете оценить множество образцов кода, готовых для интеграции в ваше приложение. Вы можете найти отличную ссылку и полную документацию в нижней части этой нити, также на SO How do I read data from serial port in Linux using C?

0

Простой fopen не устанавливает какие-либо параметры связи последовательных портов. Вам необходимо установить скорость передачи, количество бит, четность и количество стоповых бит. И, если вы хотите использовать дисциплину линии Linux или нет. Для этого используется termio-структура.

Есть несколько хороших уроков о том, как использовать последовательный интерфейс между linux и arduinos.

http://chrisheydrick.com/2012/06/12/how-to-read-serial-data-from-an-arduino-in-linux-with-c-part-1/

http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/

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

  • Нет связанных вопросов^_^