2011-10-24 20 views
6

To jest mój pierwszy program C. Witaj świecie! Jestem pewien, że obecnie nie jest to problemem dla programistów szkół średnich, ale nie mieli programowania, gdy byłem w szkole średniej. :)Nie można uzyskać C do zapisu i odczytu portu szeregowego

Chcę napisać do portu szeregowego, dopóki napis napisany przeze mnie nie zostanie wysłany do mnie. Potem rób inne rzeczy. Mój kod poniżej działa przez kilka sekund, a następnie roszczeń, aby zobaczyć ciąg i kończy się, nawet jeśli nie może faktycznie widział ciąg. Zachowuje się tak samo bez względu na wszystko, oczywiście mam coś bardzo nie tak.

Tak, urządzenie szeregowe/dev/kittens jest prawdziwe, a z terminala, bashowane echo smyczki do/dev/kittens są odbierane (echo) na porcie szeregowym, gdy port jest zapętlony.

Byłbym bardzo wdzięczny każdemu, kto mógłby poprawić moje błędy.

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <termios.h> 


int fd; 
char *buff; 



int open_port(void) 
{ 

fd = open("/dev/kitens", O_RDWR | O_NOCTTY | O_NDELAY); 
if (fd == -1) 
{ 
    perror("open_port: Unable to open /dev/kittens "); 
} 
    else 
    fcntl(fd, F_SETFL, 0); 

return (fd); 
} 



int main() 
{ 
int wr,rd; 
open_port(); 

char msg[]="There are mice in the wire.\r"; 


do 
{ 
/* Read from the port */ 
fcntl(fd, F_SETFL, FNDELAY); 
rd=read(fd,buff,sizeof(msg)); 

/* Write to the port */ 
wr = write(fd, msg, sizeof(msg)); 
printf("debugging - Wrote to port\n"); 
usleep(10000); 

if (wr < 0) { 
    fputs("write() to port /dev/kittens failed!\n", stderr); 
    break; 
      } 
} while (buff != msg); 

if (buff=msg) 
printf(buff, "String Found! Now do the work."); 
/* 
system("dostuff.sh); 
*/ 

/* Close the port on exit. */ 
close(fd); 

return 0; 
} 
+0

+1 dla samych kociąt! – vines

+1

Twoje wołanie do 'open()' używa '/ dev/kitens'. Czy to literówka? –

+0

Tak. To był literówka w moim poście. Dzięki. –

Odpowiedz

8

pierwsze

if (buff=msg) 

jest przydział, a nie porównanie :) Ten ostatni jest ==.

drugie,

if (buff == msg) 

jest rzeczywiście wskaźnik porównanie, nie porównanie ciąg. Aby porównać łańcuch, zobacz strcmp() ze standardowej biblioteki C.

trzecie,

char *buff; 
... 
rd=read(fd,buff,sizeof(msg)); 

buff pozostało niezainicjowany - nie ma dla niego przydzielona pamięć, więc jesteś na tyle szczęśliwy, że nie psuje w ogóle.

Cóż, jest więcej do sprawdzenia, ale wymienione powyżej już wystarcza, aby uniemożliwić prawidłowe działanie programu.

Doradztwo: spróbuj umieścić debugowanie printf poniżej linii , aby zobaczyć, co faktycznie jest czytane z portu. I pamiętaj, że dane odczytane z portu nie są gwarantowane jako zakończone zerem (patrz referencja zero-terminated strings), więc musisz to również obejrzeć (albo dodaj zero po danych rzeczywistych, albo w jakiś sposób ogranicz operacje ciągów na buforze , jak przy użyciu strncmp() zamiast strcmp()).

+0

Chciałem to skomentować, dopóki nie zobaczyłem twojego. Touché – gkiar

+1

Ale to, czego naprawdę chce, to 'if (strncmp (msg, buff, strlen (msg)) == 0)' –

+0

iKiar: =) @ ott--: right. Właśnie sugerowałem, gdzie szukać, odkąd mężczyzna się uczy :) – vines

0

Ten kod nie zadziała:

while (buff != msg); 

buff i MSG są wskaźnikami. Nie możesz porównać ciągów za pomocą == lub! =. Musisz użyć polecenia strcmp()

0

Gdzie jest wskazywany port buff? nie jest zainicjowany.

Pamiętaj też, że w C nie możesz porównywać ciągów przy użyciu == lub porównywałbyś adresy ciągów. I nie ma też żadnego przypisania, to jest zadanie. Aby porównać łańcuchy, należy użyć strcmp lub memcmp, jeśli na końcu nie ma znaków NUL, a długości są znane.

3

widzę wiele błędów:

  • Należy zawsze sprawdzić zwracanej wartości błędów. Twoja funkcja open_port może zwrócić -1, jeśli nie może otworzyć portu, ale kontynuujesz w głównej pętli.
  • Nie sprawdzasz zwrotu z odczytu, może on wynosić -1, co jest bardziej prawdopodobne, ponieważ ustawiłeś NDELAY na pliku.
  • Nie zainicjalizujesz bufu, wskazuje on gdzieś, czego nie znasz, ponieważ nie został zainicjowany. Możesz użyć char buffer[1024] lub coś podobnego.
  • W języku C porównywanie dwóch łańcuchów odbywa się za pomocą strcmp, pamięć za pomocą memcmp. Porównywasz dwa wskaźniki, a nie ich zawartość.

Myślę, że to wystarczy, aby rozpocząć ustalania kodu :-)

Powiązane problemy