2011-10-24 20 views
6

Este es mi primer programa en C. ¡Hola Mundo! Estoy seguro de que esto no es un problema para los programadores de secundaria en estos días, pero no tenían programación cuando estaba en la escuela secundaria. :)No se puede obtener C para escribir y leer el puerto serie

Quiero escribir en un puerto serie hasta que la secuencia que escribo se me devuelva. Luego haz otras cosas. Mi código a continuación se ejecuta durante unos segundos y luego afirma ver la cadena y los extremos, incluso cuando en realidad no podría haber visto la cadena. Se comporta igual sin importar qué, obviamente tengo algo muy mal.

Sí, el dispositivo en serie/dev/gatitos es real y, desde un terminal, las cadenas repetidas por bash a/dev/gatitos se reciben (eco) en el puerto serie cuando se realiza un bucle en el puerto.

Estaría muy agradecido con cualquiera que pudiera corregir mis errores.

#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 para los gatitos solos! – vines

+1

Su llamada a 'open()' utiliza '/ dev/kitens'. ¿Es eso un error tipográfico? –

+0

Sí. Fue un error tipográfico en mi publicación. Gracias. –

Respuesta

8

En primer lugar,

if (buff=msg) 

es tarea, no la comparación :) Este último es ==.

En segundo lugar,

if (buff == msg) 

es en realidad la comparación de puntero, no la comparación de cadenas. Para la comparación de cadenas, vea strcmp() de la biblioteca estándar C.

En tercer lugar,

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

buff queda sin inicializar - no hay memoria asignada para ello, por lo que está bastante feliz que no se desplome en absoluto.

Bueno, hay más que verificar, pero ya mencionado es suficiente para evitar que el programa funcione correctamente.

Como consejo: intente poner una depuración printf debajo de la línea read para ver lo que se lee realmente del puerto. Y recuerde, no se garantiza que los datos leídos desde el puerto terminen en cero (vea zero-terminated strings para referencia), así que debe observar esto también (agregue un cero después de los datos reales o de alguna manera limite las operaciones de cadena en el búfer , como usar strncmp() en lugar de strcmp()).

+0

Estuve a punto de comentar lo mismo hasta que vi el tuyo. Touché – gkiar

+1

Pero lo que realmente quiere es 'if (strncmp (msg, buff, strlen (msg)) == 0)' –

+0

iKiar: =) @ ott--: right. Acabo de insinuar dónde mirar, ya que el hombre está estudiando :) – vines

0

Este código no funcionará:

while (buff != msg); 

aficionado y msg son punteros. No puede comparar las cadenas usando == o! =. Tienes que usar strcmp()

0

¿Dónde están los puntos buff? no está inicializado

Además, recuerde que en C no puede comparar cadenas usando ==, o estaría comparando direcciones de cadenas. Y tampoco =, eso es asignación. Para comparar cadenas use strcmp o memcmp si no hay caracteres NUL al final y las longitudes son conocidas.

3

veo muchos errores:

  • Siempre debe comprobar el valor de retorno de errores. Su función open_port puede devolver -1 si no pudo abrir el puerto, pero continúa en el bucle principal.
  • No revisa el resultado de la lectura, puede ser -1, más probable desde que configuró NDELAY en el archivo.
  • No inicializa buf, apunta a un lugar que no conoce porque no está inicializado. Es posible que desee utilizar char buffer[1024] o algo así.
  • En C, la comparación de dos cadenas se realiza utilizando strcmp, memoria usando memcmp. Está comparando dos punteros, no su contenido.

creo que esto es suficiente para que pueda empezar a arreglar el código :-)

Cuestiones relacionadas