LINUX.ORG.RU

/det/ttyACM0 -> /dev/ttyGS0


0

1

На мобильном устройстве есть usb device который в системе торчит как /dev/ttyGS0. В настольную систему это устройство подключенное по usb торчит как /det/ttyACM0.

На мобильном устройстве запускаем прогу:

#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <iostream>

int main()
{
	int fd = open("/dev/ttyGS0", 0 );
	if ( fd == -1 ) std::cerr << "open: " << strerror(errno) << std::endl;;

	fd_set watch;

	while (true)
	{
		std::cerr << "wait in select" << std::endl;
		FD_ZERO(&watch);
		FD_SET(fd, &watch);

		int res = select(fd + 1, &watch, 0, 0, 0);
		if ( res == -1 )
		{
			std::cerr << "select: " << strerror(errno) << std::endl;
			return 1;
		}

		if ( res && FD_ISSET(fd, &watch) )
		{
			std::cerr << "Has data" << std::endl;
			int canRead = 0;
			if ( ioctl(fd, FIONREAD, &canRead) < 0 )
				std::cerr << "ioctl: " << strerror(errno) << std::endl;
			std::cerr << " size: " << canRead << std::endl;

			char array[canRead];
			res = read(fd, &array, canRead);
			if ( res == -1 )
			{
				std::cerr << "read: " << strerror(errno) << std::endl;;
				return 1;
			}
			std::cerr << " has read: " << res << std::endl;
		}
	}
}

на компе пускаем прогу:

#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <errno.h>
#include <string.h>

int main()
{
	int fd = open("/dev/ttyACM0", O_RDWR | O_SYNC );
	if ( fd == -1 )
	{
		std::cerr << "open: " << strerror(errno) << std::endl;
		return 1;
	}
	std::cerr << "File descriptor: " << fd << std::endl;
	char array[18];
	int res = write(fd, &array, 18);
	if ( res == -1 )
	{
		std::cerr << "write: " << strerror(errno) << std::endl;
		return 1;
	}
	std::cerr << "Has write: " << res << std::endl;
	close(fd);
}

На мобильном устройстве реакции на запуск проги на настольном компе никакой! Хотя на echo 1 > /dev/ttyACM0 прога на мобильном устройстве срабатывает. И самое прикольное: если после представленной проги запустить echo 1 > /dev/ttyACM то будут пересланы все данные которые раньше якобы отсылала программа. Коточе ЧЯДНТ и чего не хватает в моих вызовах write???

Попробуй инициализировать массив array[18]

ttnl ★★★★★
()

Тебе нужно предварительно настроить оба tty в нужный режим. man stty.

Dead ★★★★
()
Ответ на: комментарий от mskmsk1985

>ЗЫ: мне вообще-то в обе стороны поток двоичного Г передавать нужно - такое возможно?

Наверняка. Подожди, сейчас тебе подскажут, кто знает. Или погугли на тему новой строки и контроля потока.

ttnl ★★★★★
()
Ответ на: комментарий от mskmsk1985

Покаж вывод

stty -F /dev/ttyGS0 -a

stty -F /dev/ttyACM -a

Тебе нужно включить raw режим на обоих tty. Иначе у тебя драйвер терминала включает дополнительный пост и препроцессинг.

Dead ★★★★
()
Ответ на: комментарий от Dead

На компе как-то так:
stty -F /dev/ttyACM0 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

На мобилке не знаю там нет stty (Я её в busybox не компилил). А как в этот raw режим перейти (желательно программно)?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> А как в этот raw режим перейти (желательно программно)?

man tcgetattr man tcsetattr

На вскидку не вспомню, как включается raw. попробуй загугли пример, где-то раньше видел.

Dead ★★★★
()
Ответ на: комментарий от mskmsk1985

>мне вообще-то в обе стороны поток двоичного Г передавать нужно

При передаче двоичного Г надо обязательно выставить флаги «плеввать на XON/XOFF», иначе ждут сюрпризы.

//Топик читал по диагонали.

Zenom ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.