2013-12-02 2 views
1

Я работаю над проектом, который включает в себя чтение данных из последовательного порта Arduino Uno. В Arduino IDE, я замечаю, что я успешно печатать значения через последовательный порт в следующем формате:Чтение значений через последовательный порт

Serial.print(x, DEC); 
    Serial.print(' '); 
    Serial.print(y, DEC); 
    Serial.print(' '); 
    Serial.println(z, DEC); 

например:

2 4 -41

4 8 -32

10 5 -50

... и т.п.

Тогда у меня есть программа, написанная на C с использованием XCode для чтения этих значений в виде типов данных с плавающей запятой. Однако при запуске программы в терминале программа оказывается застрявшей (значения не читаются, и я должен использовать ctrl + C для выхода).

Любые идеи, что я могу делать неправильно? Ниже мой код. На данный момент я просто использую цикл for, чтобы проверить, действительно ли я читаю эти значения. Дайте мне знать, если вам нужна дополнительная информация. Спасибо за вашу помощь.

#include <stdio.h> 
#include <ApplicationServices/ApplicationServices.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 

// buffer for data 
float buffer[100]; 

int main(int argc, const char* argv[]) 
{ 

    // open serial port 
    int port; 

    port = open("/dev/tty.usbmodem1411", O_RDONLY); 
    if (port == -1) 
    { 
     printf("Unable to open serial port."); 
    } 

    // testing read of data 

    fcntl(port, F_SETFL, FNDELAY); 

    for (int i = 0; i < 10; i++) 
    { 

     read(port, buffer, 12);  
     printf("%.2f %.2f %.2f\n", buffer[3*i], buffer[3*i+1], buffer[3*i+2]); 
    } 

    // close serial port 
    close(port); 

    return 0; 
} 
+0

возможно дубликат [Чтение последовательного порта данных] (http://stackoverflow.com/questions/20383780/reading-serial-port-data) –

ответ

0

Что вы пытаетесь с

read(port, buffer, 12);  
    printf("%.2f %.2f %.2f\n", buffer[3*i], buffer[3*i+1], buffer[3*i+2]); 

??? buffer будет содержать строковые данные, как следующее (не плавающие точек):

{'2', ' ', '4', '0', ' ', '-', '4', '1', 0x0D, 0x0A, '4', ' ', '8'} 
//0 1 2 2 3 4 5 6  7  8 9 10 11 

Вашей первой ошибки чтения ровно 12 байт - каждая строка может иметь различное количество байт. Вторая ошибка пытается отформатировать char как float. Даже printf может получить недопустимые данные, так как он ожидает 3 поплавка, и вы получаете 3 символа.

Итак, вам нужно проанализировать свои входные данные! Некоторые направления:

#include <stdio.h> 

float input[3]; 

int main(int argc, const char* argv[]) { 
    FILE *port; 
    port=fopen("/dev/tty.usbmodem1411", "r"); //fopen instead, in order to use formatted I/O functions 
    if (port==NULL) { 
     printf("Unable to open serial port."); 
     return 1; //MUST terminate execution here! 
    } 
    for (int i = 0; i < 10; i++) { 
     fscanf(, "%f %f %f", &input[0], &input[1], &input[2]); 
     printf("%.2f %.2f %.2f\n", input[0], input[1], input[2]); 
    } 
    fclose(port); 
    return 0; 

} 
+0

Благодаря LS_Dev. Почему буфер содержит строковые данные с запятыми? Мое понимание заключается в том, что я отправляю данные через последовательный порт из Arduino без запятых, следовательно, плавающие точки? Затем я храню эти данные в буфере, который является всего лишь массивом. – Victor

+0

'{,,}' - это просто представление C массива байтов, например '2 40 -41 ?? 4 8' в ASCII или' 32203430202D34310D0A342038' в шестнадцатеричном формате. За последовательным подключением байты обмениваются - только байты. Способ, которым вы форматируете, перед отправкой или интерпретацией при чтении не меняет своей природы: просто байты. –

+0

Я понимаю сейчас. Я попробовал новый код, и кажется, что у меня проблемы с открытием порта. Программа запускается при выполнении fopen. – Victor

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