2015-07-22 3 views
1

В основном у меня был COM-порт, подключенный к малине pi, и я пытаюсь добавить данные, полученные в TXT-файл. До сих пор мне удалось только открыть файл. Как мне изменить существующий код, чтобы он мог «сохранить» данные в открытый файл?Запись данных, полученных из COM-порта в файл .txt (raspbian)

Я также попытался редактировать его:

FILE *f; 
f = fopen("try.txt", "a"); 

    if (f == NULL) 
    { 
    printf("Error opening file!\n"); 
    exit(1); 
    } 

int r;   
char buf[255];  
    while(1) 
    {   
    r = read(fd, buf, 255);   
    buf[r]=0;   
    fprintf(f, "%s", buf); 
    } 
fclose(f); 

, но кажется, что это остановит данные поступают.

Теперь существующий код выглядит следующим образом:

#include <fcntl.h> 
#include <stdio.h> 
#include <termios.h> 
#include <stdlib.h> 
#include <strings.h> 

#define SPEED B9600 
#define PORT "/dev/ttyUSB0" 

int main() 
{  
int fd = open(PORT, O_RDONLY | O_NOCTTY);   
    if (fd <0) 
    { 
    perror(PORT); 
    exit(-1); 
    }   
struct termios options; 

bzero(&options, sizeof(options));   
options.c_cflag = SPEED | CS8 | CLOCAL | CREAD | IGNPAR;   
tcflush(fd, TCIFLUSH);   
tcsetattr(fd, TCSANOW, &options); 

FILE *f; 
f = fopen("try.txt", "a"); 

    if (f == NULL) 
    { 
    printf("Error opening file!\n"); 
    exit(1); 
    } 

int r;   
char buf[255];  
    while(1) 
    {   
    r = read(fd, buf, 255);   
    buf[r]=0;   
    printf("%s", buf); 
    } 
} 

Новое в raspbian и т.д .. любая помощь будет принята с благодарностью.

+0

Отформатируйте свой код. –

+0

@MichaelWalz Извините ... формат ..? что означает? – Athena

+0

Формат или идентификатор означает помещение пробела в начале каждой строки, чтобы представлять блоки вашей программы, чтобы она была более читаемой. Посмотрите на программу _your_ и посмотрите примеры в своем учебнике C, вы заметите разницу –

ответ

0

Первая проблема заключается в том, что вы пытаетесь напечатать строку, и ваш буфер не отформатирован правильно: строка заканчивается на «\ 0», и printf будет искать это.

Вы можете прочитать 254 символа и вручную добавить '\ 0' в качестве последнего символа или использовать какой-либо другой механизм (например, cout).

Но даже это более грязно. Существует более сложное решение, но гораздо более элегантное решение:

  1. Read - функция блокировки; т.е. он будет блокироваться, пока вы не прочитаете ожидаемый объем данных. Вы можете избежать этого путем настройки порта вы читаете от быть не блокирующим (см O_NONBLOCK)
  2. Использования выбрать тайм-аут, чтобы знать, когда данные становятся доступными
  3. Когда данные доступны, прочитать его следующим образом:

    nr_bytes = read (fd, buf, 255);

    Да, это то же самое, что вы использовали только на этот раз, когда он читает доступные данные вместо ожидания всех 255 байтов. Итак, вы только что прочитали nr_bytes байт, которые вы можете записать в свой файл.

  4. Repeat ...

Надеется, что это помогает!

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