2013-03-06 2 views
0

с использованием этого кода, я пытаюсь отправить файл на CC430f5137 и получить обратно от него. Я использую 2 программы, одна из которых является программой ниже (она предназначена для отправки и получения файлов обратно в мою Linux-консоль, а другая - для CC430f5137 (она содержит код rx, tx для моего устройства, который находится в окнах). возможность отправить один байт (напр, A) из файла на устройство, но не нескольких байтов.отправка файла через последовательный порт

//sample1.c 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/signal.h> 
#include <sys/ioctl.h> 
#include <sys/poll.h> 
#include <termios.h> 
#define BUFSIZE   1300 //1 

int open_serial(char *dev_name, int baud, int vtime, int vmin) 
{ 
    int fd; 
    struct termios newtio; 

    fd = open(dev_name, O_RDWR | O_NOCTTY); 
    if (fd < 0) 
    { 
     printf("Device OPEN FAIL %s\n", dev_name); 
     return -1; 
    } 
    memset(&newtio, 0, sizeof(newtio)); 
    newtio.c_iflag = IGNPAR|INLCR; // non-parity void UARTHandler(int fd); 
    newtio.c_oflag = 0; 
    newtio.c_cflag = CS8 | CLOCAL | CREAD; // NO-rts/cts 

    switch(baud) 
    { 
     case 115200 : newtio.c_cflag |= B115200; break; 
     case 57600 : newtio.c_cflag |= B57600; break; 
     case 38400 : newtio.c_cflag |= B38400; break; 
     case 19200 : newtio.c_cflag |= B19200; break; 
     case 9600 : newtio.c_cflag |= B9600; break; 
     case 4800 : newtio.c_cflag |= B4800; break; 
     case 2400 : newtio.c_cflag |= B2400; break; 
     default  : newtio.c_cflag |= B115200; break; 
    } 
    //set input mode (non-canonical, no echo,.....) 
    newtio.c_lflag = 0; 
    newtio.c_cc[VTIME] = vtime; 
    newtio.c_cc[VMIN] = vmin; 
    tcflush (fd, TCIFLUSH); 
    tcsetattr(fd, TCSANOW, &newtio); 

    return fd; 
} 

int sendfile(int fd)  //void sendfile(int fd) 
{ 
    int fd1,readc; 
    unsigned short fileLength; 
    unsigned char buf[BUFSIZE]; 

    fd1=open("cert.pem",O_RDONLY); 

    fileLength=lseek(fd1,0,SEEK_END); 
    printf("file length is %d bytes\n",fileLength); 
    lseek(fd1,0,SEEK_SET); 

    write(fd,(unsigned char*)&fileLength, 2); 
      while(fileLength>0) 
      { 
       if(fileLength>=BUFSIZE) 
       { 
        readc=read(fd1,buf,BUFSIZE); 
        if(readc==-1) 
        { 
        printf("read failed!!\n"); 
        } 
        if(read>0) 
        { 
        buf[BUFSIZE]='\0'; 
        printf("%s\n",buf); 
        if(write(fd,buf,BUFSIZE)) 
        fileLength -= BUFSIZE; 
        } 
       } 
       else 
       { 
        readc=read(fd1,buf,fileLength); 
        if(readc==-1) 
        { 
        printf("read failed!!\n"); 
        } 
        if(readc>0) 
        { 
        buf[fileLength]='\0'; 
        printf("%s\n",buf); 
        if(write(fd, buf, fileLength)) 
        fileLength=0; 
        } 
       } 
      } 
    printf("%s\n",fd); 
    printf("file sent succssfully\n"); 
    return fd1;//close(fd1); 
    close(fd); 

} 

void receivefile(int fd) 
    { 
     char buf[1300],read_byte,buf2[1300]; 
     int fd2,readc; 
     unsigned short fileLength; 

     fd2=open("test.pem", O_WRONLY|O_CREAT); 

       if(fd2<0) 
       { 
       printf("file open failed!!\n"); 
         } 
       while(!(read(fd,(unsigned char*)&fileLength,2)>0)); 

       printf("i am in receive file\n"); 

       while(fileLength>0) 
       { 
        readc = read(fd, buf, BUFSIZE); 
        if(readc==-1) 
        { 
        printf("read failed!!\n"); 
        } 
       printf("read %d bytes, value is %s\n",readc,buf); 

        if(readc >0) 
        { 
        buf[readc]='\0'; 
        printf("buf value is%s\n", buf); 
        write(fd2,buf,readc); 
        fileLength -= readc; 
        } 
       } 
      close(fd2); 
      close(fd); 
    } 

void close_serial(int fd) 
{ 
    close(fd); 
    printf("ClosePort!!\n"); 
} 

int main(int argc, char **argv) 
{ 
    int fd; 
    int baud; 
    char dev_name[128]; 

    if (argc != 3) 
    { 
     printf(" sample_serial [device] [baud]\n" \ 
       " device : /dev/ttySAC0 ...\n" \ 
       " baud : 2400 ... 115200\n"); 
     return -1; 
    } 
    printf(" Serial test start... (%s)\n", __DATE__); 

    strcpy(dev_name, argv[1]); 
    baud = strtoul(argv[2], NULL, 10); 

    fd = open_serial(dev_name, baud, 4, 1); 

    sendfile(fd); 
    receivefile(fd);   
    close_serial(fd);   
    printf(" Serial test end\n"); 

    return 0; 
} 

это выход отправки 1 байт из файла последовательного порта

[[email protected] ~]# gcc -std=c99 -std=gnu99 sample1.c -o out1 
    sample1.c:151:50: warning: backslash and newline separated by space 
    sample1.c:152:45: warning: backslash and newline separated by space 
    [[email protected] ~]# ./out1 /dev/ttyUSB20 115200 
    Serial test start... (Mar 6 2013) 
    file length is 2 bytes 
    A 
    wrote 3 bytes 
    file sent succssfully 
    i am in receive file 
    read 1 bytes, value is A 
    buf value isA 
    read 1 bytes, value is A 
    buf value isA 
    read 1 bytes, value is A 
    buf value isA 
    read 1 bytes, value is A 
    buf value isA 

это вывод отправки нескольких байтов из файла в последовательный порт

[[email protected] ~]# gcc -std=c99 -std=gnu99 sample1.c -o out1 
    sample1.c:151:50: warning: backslash and newline separated by space 
    sample1.c:152:45: warning: backslash and newline separated by space 
    [[email protected] ~]# ./out1 /dev/ttyUSB20 115200 
    Serial test start... (Mar 6 2013) 
    file length is 2 bytes 
    i am doing well today 
    wrote 3 bytes 
    file sent succssfully 
    i am in receive file 
    read 1 bytes, value is 
    buf value is 
    read 1 bytes, value is 
    buf value is 
    read 1 bytes, value is 
    buf value is 
    read 1 bytes, value is 
    buf value is 

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

SendFile() работает нормально, я могу в состоянии написать «cert.pem» в port.I есть проблемы с чтением файла из порта и письма обратно в «test.pem» .Я получаю выход некоторый оператор печати, указанный в программе приемника, но получение данных непрерывно. Флаги указаны в правильном порядке . Я также сбросил все соединения.

+2

Это очень много кода для нас, чтобы читать ... Можете ли вы более конкретно о том, что работает и не работает? Может быть, только показывать только соответствующие части вашего кода? – Simon

+0

Последовательные порты могут быть волосатыми животными. Вы не можете опубликовать свой код и попросить нас рассказать вам, почему «он не работает». Вы должны начать с самостоятельного исследования. Возьмите код для подключения и проверьте, что он работает. Убедитесь, что все флаги портов установлены правильно. Попробуйте отправить и получить одиночные байты. Проверьте, что ваши файлы открываются и читаются правильно. Проверьте, что принимающая сторона может создать файл. – paddy

+0

И в приведенной выше заметке ... Я замечаю, что вы никогда не проверяете, действительны ли ваши дескрипторы файлов при открытии 'test.pem'. – paddy

ответ

1

Начнем с очевидного.

: с Sendfile не имеет циклическую построить в нем ...

б: переполнение буфера, например:

unsigned char buf[BUFSIZE]; 
... 
buf[BUFSIZE]=0 

C: У вас есть отладки, как это «читать 1 байт, значение A ', но это не в коде. Трудно исправить код, который вы еще не опубликовали ...

+0

спасибо. Не могли бы вы рассказать мне немного больше? Я могу написать файл на порту. Но не смог получить обратно в файл test.pem. Я пропустил строку в коде раньше (как вы сказали). Я редактировал код. – aparna

+0

@aparna: a: когда вы отправляете файл длиннее одного буфера, вам понадобится цикл ('for' или' while'), как в вашем коде получения. * Переполнение буфера *. Индексы массива C идут от 0 до n-1, поэтому buf [BUFSIZE] записывает вне вашего массива и разлагает что-то еще. – Roddy

2

Вы делаете это неправильно - вместо того, чтобы Переизобретая решение проблемы отправки двоичного файла через последовательные каналы связи, использовать уже существующие стандартные решения, такие как ZMODEM

Когда вы делаете, вы не должны напишите программу на стороне Linux, так как бесплатная программа для этого уже существует, и вы сможете перенести существующую программу на свой CC430f5137, независимо от того, что это такое.

+0

Благодарим вас. В частности, я отправляю файл (сертификат для проверки подлинности) микроконтроллера, файл генерируется с использованием открытого кода в Linux Virtual Machine. Я отправляю файл в другой открытый код (этот код предназначен для запуска на микроконтроллеры) в windows.Please, дайте мне знать вашу респату сейчас. вы говорите об этом случае? – aparna

+0

Я говорю, что вам нужно использовать существующие библиотеки и протоколы, такие как ZMODEM. Это позволит сэкономить время кодирования и отладки. – gby

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