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);
};
Чтение из COM порта
Не подскажете в чем может быть проблема в проге :
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);
Программа зависает в ожидании чтения, хотя должно читать....
Подскажите пожалуйста, что я неправильно делаю.
Заранее спасибо.
приходилось программировать СИ8 как-то, у него интерфейс через rs485 (тот же ком только еще RTS приходится манипулировать через rts_bit = TIOCM_RTS; ioctl (_com, TIOCMBIS, &rts_bit); ).
Спасибо! Но вот только теперь он все время читает пустую строку, хотя у меня неблокирующий режим отключен, а по com порту вроде ничего не пересылается... Чего-то я совсем не понимаю почему так получается...
Но на самом деле очень интересно, почему read не блокируется при чтении и читает пустую строчку, правда если перед ним select поставить, то все хорошо становится=)
Всем спасибо!
Кстати, между делом, читать лучше по "многу и сразу" - на собственном примере убедился - установил размер приёмного буфера в 1024 - всё пошло и сразу. А пока свои 16 байт ловил... столько проблеммм нажил. Кстати, где-то рекомендовано - работать размером блока (по умолчанию - 4096)..