MgErr CINRun(LStrHandle portName, int16 *baudRate, int32 *timeout, int32 *fc, int32 *fport) { struct termios options; *fport = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); // відкриваємо порт if(*fport!=-1) // якщо вдалось відкрити { // налаштувати порт fcntl(*fport, F_SETFL, 0); // виконувати операцію читання із порта із блокуванням if(tcgetattr(*fport, &options)==0) // прочитати поточні параметри порут, якщо вдало, налаштувати { cfsetispeed(&options, B19200); // налаштувати шкидвість прийому cfsetospeed(&options, B19200); // та передачі // Enable the receiver and set local mode... options.c_cflag |= (CLOCAL | CREAD); // інші параметри порта (8N1 режим) options.c_cflag &= ~PARENB; // вимкнути перевірку паритету options.c_cflag &= ~CSTOPB; // 1 стоп біт options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // кількість біт даних //#ifdef CNEW_RTSCTS // options.c_cflag &= ~CNEW_RTSCTS; //#endif // відключити обробку символа драйвером порта options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; // відмінити програмне управління потоком передачі даних options.c_iflag &= ~(IXON | IXOFF | IXANY); // налаштувати таймаути options.c_cc[VMIN]=0; options.c_cc[VTIME]=*timeout; // встановити параметри порту if(tcsetattr(*fport, TCSANOW, &options)!=0) // якщо невдалося встановити тоді TCSAFLUSH { close(*fport); //закрити порт *fport=-1; } } else // якщо невдало прочитані параметри - закрити порт { close(*fport); *fport=-1; } } return noErr;}
Two elements of the c_cc array are used for timeouts: VMIN and VTIME. Timeouts are ignored in canonical input mode or when the NDELAY option is set on the file via open or fcntl.
#include <stdio.h>#include <unistd.h> #include <fcntl.h>#include <termios.h>int main(int argc,char **argv){ int fp; struct termios options; char buff[10]; fp = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); // відкриваємо порт fcntl(fp, F_SETFL,0 ); // виконувати операцію читання із порта із блокуванням // якби було FNDELAY то було б читання без блокування. функція if(tcgetattr(fp, &options)==0) // прочитати поточні параметри порут, якщо вдало, налаштувати { cfmakeraw(&options); options.c_cflag |= (CLOCAL | CREAD); cfsetspeed(&options, B19200); // налаштувати шкидвість // налаштувати таймаути options.c_cc[VMIN]=0; options.c_cc[VTIME]=50; // чекати байта 5 секунд // встановити параметри порту if(tcsetattr(fp, TCSANOW, &options)!=0) // якщо невдалося встановити тоді TCSAFLUSH { close(fp); //закрити порт printf("Невдалося нашаштувати порт\n"); } } printf("Записано байт %d\n",write(fp,buff,10)); printf("Прочитано байт %d\n",read(fp,buff,10)); close(fp); return 0;}
i=read(fPort,b,len);if(i<len)i+=read(fPort,b+i,len-i);if(i<len)i+=read(fPort,b+i,len-i);
Если MIN = 0 и TIME > 0, то TIME является величиной таймаута. Возврат из read случится либо при появлении символа, либо при достижении таймаута (t = TIME * 0.1 с). При выходе по таймауту никакие символы не возвращаются.