powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы с записью данных в порт, открытый с Hardware flow control
6 сообщений из 6, страница 1 из 1
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34060892
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно ли выполнять
Соединил на своем компе (Linux) ttyS0 и ttyS1 нуль модемным кабелем, открыл оба порта с Hardware flow control в режиме передачи бинарных данных. Написал две маленькие функци: одна отправляет 3 блока данных в порт ttyS0, вторая получает данные из ttyS1 и выводит на экран.
В программе вызвал две эти функции последовательно. По идее, ода функция должна отправить 3 блока данных в порт, вторая получить весь этот блок (из 3 маленьких блоков) и вывести на экран. Но почему-то на экран выводится только первый блок данных (из трех), остальные два функция так и не получает. В чем может быть проблема?

Функция открытия порта

//---------------------------------------------------------------------------
Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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;
}

функция записи в порт

Код:
1.
2.
3.
4.
5.
6.
7.
8.
long TComPortFunctions::WriteBlockWithoutAnswer(unsigned char* block_to)
{

	ioctl(handle,TCFLSH,2); // сбрасываем очереди ввода вывода
	if (write(handle, block_to, block_len)!=block_len)
		return -2;
return 0;	
}

функция чтения из порта

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
//---------------------------------------------------------------------------
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");
	    }
	}
}

...
Рейтинг: 0 / 0
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34061423
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
возможно буфера порта не хватает.
еще стоит попробовать при чтении (while (block_len_from!=0))
если block_len_from==0, то сделать задержку и попробовать прочитать снова,
что бы убедиться, что данные точно не дошли.
...
Рейтинг: 0 / 0
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34065198
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-что раскопал, но до сих пор не понимаю, почему так происходит.
С одного порта в другой отправляю 3 блока данных: 6 байт, 256 байт, 2 байта.
Если выполнить подряд 3 отправки, а потом, чтение, то read прочтет только первый блок из 6 байт. Оставшиеся блоки (2) так и не придут, даже если потом много раз выполнять read.
НО если между отправками сделать паузу, вроде:
write блок 1 com1;
sleep(1); //задержка 1 секунда
write блок 2 com1;
write блок 3 com1;
read com2;

ТО read читает абсолютно все данные, как и положено, без проблем.

Почему такое происходит понять не могу. Есть у кого-нибудь соображения на этот счет прошу высказаться.
...
Рейтинг: 0 / 0
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34065617
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мое такое :) :
Специфика работы ОСи, относиться к этому со снисхождением, и всегда выполнять, хоть какую-то малейшую задержку между отправками. Все равно, для того чтобы ушел первый блок должно пройти некоторое время (хотябы 1/115200*8 сек).
...
Рейтинг: 0 / 0
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34065737
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы результат write проверяете ? Может они не отправились вовсе ?
А еще у вас
Код: plaintext
1.
ioctl(handle,TCFLSH, 2 ); // сбрасываем очереди ввода вывода
сбрасывает данные в очереди, не успевшие отправиться.
...
Рейтинг: 0 / 0
Проблемы с записью данных в порт, открытый с Hardware flow control
    #34066285
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огроменное спасибо.
Проблемы действительно были из-за функции ioctl(handle,TCFLSH,2);
Т.к. функции write выполнялись очень быстро, блоки не успевали уйти из порта, а их уже убивали с помощью TCFLUSH следующего write.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблемы с записью данных в порт, открытый с Hardware flow control
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]