int TComPortFunctions::OpenPort()
{
struct termios options;
printf("Bus System communication device name: %s\n",devicename) ;
printf("Befor open: handle = %d\n",handle) ;
if(handle != -1) return -1; // Порт уже открыт нашей программой
/* open the port */
handle = open(devicename, O_RDWR | O_NOCTTY| O_NDELAY);
printf("After open: handle = %d\n",handle) ;
if(handle < 0) return -2; // Какая-то другая проблема
fcntl(handle, F_SETFL, 0);
/* get the current options */
tcgetattr(handle, &options);
/* Устанавливаем скорость приема и предачи */
cfsetispeed(&options, B9600); // Установили скорость приема сообщений
cfsetospeed(&options, B9600); // Установили скорость отправки сообщений
options.c_cflag |= (CLOCAL | CREAD);
//No parity (8N1)
options.c_cflag &=~PARENB;
options.c_cflag &=~CSTOPB;
options.c_cflag &=~CSIZE;
options.c_cflag |=CS8;
//Установить режим RAW
cfmakeraw(&options);
// Убираем флаг замены ВХОДЯЩИХ символов 10 и 13
options.c_iflag &=~ICRNL;
options.c_iflag &=~INLCR;
//Установка аппаратного контроля передачи данных
options.c_cflag |=CRTSCTS;
options.c_iflag &=~(IXON|IXOFF|IXANY);
options.c_cc[VMIN] =0; // Минимальное количество символов для чтения
options.c_cc[VTIME] =timeout; //Время ожидания
/* set the options */
tcsetattr(handle, TCSANOW, &options);
ioctl(handle,TCFLSH,2); // Сбарываем очереди ввода вывода
return 0;
}
Проблемы с записью данных в порт, открытый с Hardware flow control
Соединил на своем компе (Linux) ttyS0 и ttyS1 нуль модемным кабелем, открыл оба порта с Hardware flow control в режиме передачи бинарных данных. Написал две маленькие функци: одна отправляет 3 блока данных в порт ttyS0, вторая получает данные из ttyS1 и выводит на экран.
В программе вызвал две эти функции последовательно. По идее, ода функция должна отправить 3 блока данных в порт, вторая получить весь этот блок (из 3 маленьких блоков) и вывести на экран. Но почему-то на экран выводится только первый блок данных (из трех), остальные два функция так и не получает. В чем может быть проблема?
Функция открытия порта
//---------------------------------------------------------------------------
Код:
функция записи в порт
Код:
long TComPortFunctions::WriteBlockWithoutAnswer(unsigned char* block_to)
{
ioctl(handle,TCFLSH,2); // сбрасываем очереди ввода вывода
if (write(handle, block_to, block_len)!=block_len)
return -2;
return 0;
}
{
ioctl(handle,TCFLSH,2); // сбрасываем очереди ввода вывода
if (write(handle, block_to, block_len)!=block_len)
return -2;
return 0;
}
функция чтения из порта
Код:
//---------------------------------------------------------------------------
void TComPortFunctions::ReadToScreen()
{
unsigned char block_from[264];
int block_len=264;
int block_len_from=1;
while (block_len_from!=0)
{
block_len_from=read(handle, &block_from[0], block_len);
if (block_len_from>0)
{
printf("Resutlt:");
for(int i=0;i<block_len_from;i++)
printf(" %d",block_from);
printf("\n");
}
}
}
void TComPortFunctions::ReadToScreen()
{
unsigned char block_from[264];
int block_len=264;
int block_len_from=1;
while (block_len_from!=0)
{
block_len_from=read(handle, &block_from[0], block_len);
if (block_len_from>0)
{
printf("Resutlt:");
for(int i=0;i<block_len_from;i++)
printf(" %d",block_from);
printf("\n");
}
}
}
С одного порта в другой отправляю 3 блока данных: 6 байт, 256 байт, 2 байта.
Если выполнить подряд 3 отправки, а потом, чтение, то read прочтет только первый блок из 6 байт. Оставшиеся блоки (2) так и не придут, даже если потом много раз выполнять read.
НО если между отправками сделать паузу, вроде:
write блок 1 com1;
sleep(1); //задержка 1 секунда
write блок 2 com1;
write блок 3 com1;
read com2;
ТО read читает абсолютно все данные, как и положено, без проблем.
Почему такое происходит понять не могу. Есть у кого-нибудь соображения на этот счет прошу высказаться.
Т.к. функции write выполнялись очень быстро, блоки не успевали уйти из порта, а их уже убивали с помощью TCFLUSH следующего write.