int open_port(char *portName, int baudRate, int timeout)
{
struct termios options;
int fport;
fport = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);
if(fport!=-1)
{
if(tcgetattr(fport, &options)==0)
{
cfmakeraw(&options);
cfsetspeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD /*| CRTSCTS*/);
options.c_cc[VMIN]=0;
options.c_cc[VTIME]=timeout;
if(tcsetattr(fport, TCSANOW, &options)!=0)
{
close(fport);
fport=-1;
}
fcntl(fport, F_SETFL,0);
}
else
{
close(fport);
(fport)=-1;
}
}
return fport;
}
Чтение из последовательного порта. не могу понять алгоритм работы функции read
вообщем оно читает по 8 байт за раз даже если я просил больше. а если прошу меньше то некоторые байты теряются. как-то можна перенастроить чтоб читало сколько попрошу?
а при чём здесь алгоритм ? порт не может выдать больше байт чем вы в него физически вводите . если запрошено больше чем есть , то выдается сколько есть . а если запрошено меньше , то данные обрезаются .
вообщем какое-то странное поведение, потому и спрашиваю.
физический размер буфера последовательного порта всего 12 байт - нельзя посылать больше . сам порт - не разделяемый ресурс и потому вся работа должна быть с блокировками . драйвер порта об этом знает и потому не выдает ничего .
И еще добавлю что тот-же код только с заменой write на WriteFile, read на ReadFile и заменой соответствующих функций открытия и настройки порта под виндой работает без всяких танцев с бубном.
"А как тогда принимать большие обьемы данных?" - ответ очевиден . куча маленьких операций по 12 байт )