Не могу заставить C писать и читать последовательный порт - PullRequest
6 голосов
/ 25 октября 2011

Это моя первая программа на Си.Привет, мир!Я уверен, что это не проблема для программистов старших классов в эти дни, но у них не было программирования, когда я учился в старших классах.:)

Я хочу записывать в последовательный порт, пока строка, которую я пишу, не будет возвращена мне.Тогда делай другие вещи.Мой код, приведенный ниже, выполняется в течение нескольких секунд, а затем утверждает, что видит строку, и завершается, даже если он на самом деле не мог видеть строку.Он ведет себя одинаково, несмотря ни на что, у меня, очевидно, есть что-то очень неправильное.

Да, последовательное устройство / dev / kittens является реальным, и от терминала принимаются bash-эхо-строки в / dev / kittens (эхо) на последовательном порту, когда порт зациклен.

Я был бы очень признателен всем, кто мог бы исправить мои ошибки.

#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;
}

Ответы [ 4 ]

8 голосов
/ 25 октября 2011

Во-первых,

if (buff=msg)

- это присвоение, а не сравнение :) Последнее - ==.

Во-вторых,

if (buff == msg)

- это фактически сравнение указателей,не сравнение строк.Для сравнения строк см. strcmp() из стандартной библиотеки C.

В-третьих,

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

buff оставлено неинициализированным - для него нет выделенной памяти, поэтому вы достаточно счастливыон вообще не падает.

Что ж, есть еще что проверить, но перечисленного выше уже достаточно, чтобы помешать правильной работе программы.

Совет: попробуйте поставитьотладка printf ниже строки read, чтобы увидеть, что на самом деле читается из порта.И помните, что данные, считываемые из порта, не обязательно заканчиваются нулем (см. zero-terminated strings для справки), поэтому вы должны следить за этим также (либо добавить ноль после фактических данных, либо как-то ограничить строковые операции набуфер, например, используя strncmp() вместо strcmp()).

3 голосов
/ 25 октября 2011

Я вижу много ошибок:

  • Вы всегда должны проверять возвращаемое значение на наличие ошибок. Ваша функция open_port может возвращать -1, если она не может открыть порт, но вы продолжаете в основном цикле.
  • Вы не проверяете возврат из чтения, это может быть -1, более вероятно, так как вы установили NDELAY для файла.
  • Вы не инициализируете buf, оно указывает на то, что вы не знаете, потому что оно не инициализировано. Возможно, вы захотите использовать char buffer[1024] или что-то вроде этого.
  • В C сравнение двух строк выполняется с использованием strcmp, память с использованием memcmp. Вы сравниваете два указателя, а не их содержимое.

Я думаю, этого достаточно, чтобы начать исправлять код: -)

0 голосов
/ 25 октября 2011

Где DOS buff указывают на? он не инициализирован.

Также помните, что в C вы не можете сравнивать строки, используя ==, или вы сравниваете адреса строк. И нет =, это назначение. Для сравнения строк используйте strcmp или memcmp, если в конце нет NUL-символов и длины известны.

0 голосов
/ 25 октября 2011

Этот код не будет работать:

while (buff != msg);

buff и msg - указатели. Вы не можете сравнивать строки, используя == или! =. Вы должны использовать strcmp ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...