Мусорные данные из последовательного порта - PullRequest
5 голосов
/ 07 июня 2010

Я написал код на платформе Linux, который считывает данные через последовательный порт, мой код ниже:

int fd;
char *rbuff=NULL;
struct termios new_opt, old_opt;
int ret;

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if( fd == -1 )
{
   printf("Can't open file: %s\n", strerror(errno));
   return -1;
}
tcgetattr(fd, &old_opt);
new_opt.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
new_opt.c_iflag = IGNPAR /*| ICRNL*/;
new_opt.c_oflag = 0;
new_opt.c_lflag = ICANON;

tcsetattr(fd, TCSANOW, &new_opt);
rbuff = malloc(NBUFF);
printf("reading..\n");
memset(rbuff,0x00,NBUFF);
ret = read(fd, rbuff, NBUFF);
printf("value:%s",rbuff);
if(ret == -1)
{
   printf("Read error:%s\n",strerror(errno));
   return -1;
}
tcsetattr(fd, TCSANOW, &old_opt);
close(fd);

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

Я пропустил настройку в последовательном порту?

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Звучит так, будто настройки вашего последовательного порта отключены - по-видимому, вы читаете в 8 битах вместо 7. У вас есть , чтобы обе стороны передавали с одинаковыми настройками.

То, что я хотел бы сделать, - это иметь таблицу «ожидаемых байтов, полученных байтов» и запускать ее для 5-6 испытаний.

Затем, если это не поможет, накрутите скорость передачи данных с обеих сторон до 2400 или около того. Да я серьезно. Это может исправить некоторые странные ошибки.

Тебе следует изучить вопрос о получении осциллографа. Если вы ожидаете, что это будет чем-то, что вы поддерживаете в долгосрочной перспективе, о-сфера может быть весьма полезна.

0 голосов
/ 16 июня 2010

Если вы говорите об аппаратном последовательном порте (RS-232), я бы порекомендовал использовать анализатор последовательного порта, такой как BusBee, чтобы увидеть, что на самом деле отправляется на последовательный порт. Если вы используете пчелиную шину, не забудьте также разместить трансивер перед BusBee для регулировки уровней напряжения от RS-232 до TTL. В качестве альтернативы, если у вас есть доступ к осциллографу, вы можете использовать его для считывания сигналов на линиях RS-232 и декодирования байтов самостоятельно.

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