Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение из COM порта

11K
26 января 2007 года
Skol
27 / / 14.07.2006
Здравствуйте!
Не подскажете в чем может быть проблема в проге :

struct termios term, tmp;
int fd,flag;
fd = open(COMPORT_ADDRESS,O_RDWR | O_NOCTTY |O_NONBLOCK);
fcntl(fd,F_SETFL,0);
tcgetattr(fd,&term);
cfsetospeed(&term,BAUDRATE);
term.c_cflag &= ~PARENB;
term.c_cflag &= ~CSTOPB;
term.c_cflag &= ~CSIZE;
term.c_cflag |= CS8;
tcsetattr(fd,TCANOW,&term);

После всего этого пишу : recv = read(fd,&boot,2);
Программа зависает в ожидании чтения, хотя должно читать....
Подскажите пожалуйста, что я неправильно делаю.
Заранее спасибо.
361
26 января 2007 года
Odissey_
661 / / 19.09.2006
приходилось программировать СИ8 как-то, у него интерфейс через rs485 (тот же ком только еще RTS приходится манипулировать через rts_bit = TIOCM_RTS; ioctl (_com, TIOCMBIS, &rts_bit); ).
Работает:

Код:
int open_port(void)
{
  int fd;

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

void set_default_config(int fd)
{
 struct termios oldOptions, newOptions;
 
 tcgetattr(fd, &oldOptions);
 bzero(&newOptions, sizeof(newOptions));
 
 // сокрость передачи (по умолчанию у СИ8 9600)
 cfsetispeed(&newOptions, B9600);
 cfsetospeed(&newOptions, B9600);

 // размер передаваемых данных - 8 байт
 //newOptions.c_cflag &= ~CSIZE;
 newOptions.c_cflag |= CS8;
 
 //  контроль четности
 newOptions.c_cflag &= ~PARENB;
 //newOptions.c_cflag |= PARODD;
 
 // число стоп- битов =1
 newOptions.c_cflag &= ~CSTOPB;
 
 //  активирования аппаратного управления потоком передаваемых данных
 newOptions.c_cflag |= CRTSCTS;
 
 // разрешаем доступ к порту
 newOptions.c_cflag |= (CLOCAL | CREAD);
 
 // режим ввода не канонический
 newOptions.c_lflag &= ~(ICANON | ECHO | ECHOE| ISIG);
 
 // контроль четности при вводе
// newOptions.c_iflag |= (INPCK | ISTRIP);
 
 // программное flow control при вводе
 newOptions.c_iflag &= ~(IXON | IXOFF | IXANY);
 
 // вывод у нас не обрабатываемый - raw
 newOptions.c_oflag &= ~OPOST;

 tcsetattr(fd, TCSANOW, &newOptions);
};
11K
26 января 2007 года
Skol
27 / / 14.07.2006
Спасибо! Но вот только теперь он все время читает пустую строку, хотя у меня неблокирующий режим отключен, а по com порту вроде ничего не пересылается... Чего-то я совсем не понимаю почему так получается...
11K
27 января 2007 года
Skol
27 / / 14.07.2006
Все наконец заработало, оказывается когда выставляешь аттрибуты не все равно в каком они идут порядке, к тому же tcsetattr может за один раз не выставить все изменения аттрибутов.
Но на самом деле очень интересно, почему read не блокируется при чтении и читает пустую строчку, правда если перед ним select поставить, то все хорошо становится=)
Всем спасибо!
17K
31 января 2007 года
Виктор А.
36 / / 10.01.2007
Кстати, между делом, читать лучше по "многу и сразу" - на собственном примере убедился - установил размер приёмного буфера в 1024 - всё пошло и сразу. А пока свои 16 байт ловил... столько проблеммм нажил. Кстати, где-то рекомендовано - работать размером блока (по умолчанию - 4096)..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог