LINUX.ORG.RU

Проблема при использовании Com порта.


0

0

Добрый день! Проблема в следующем: Не могу отправить байты в com порт (проверяю через другой комп. фиксирую сигнал открытия и закрытия при перезагрузке Linux).

Попробывал делать так: int com; struct termios newtermios,oldtermios; if ((com=open("/dev/ttyS0",O_RDWR|O_NOCTTY))!=-1) { // значение переменной com во время выполнения == 11 char s[5]="12345"; int i ; tcgetattr(com,&oldtermios); newtermios.c_flag=B9600|CS8|CREAD|CLOCAL|CRTSCTS; newtermios.c_iflag=IGNPAR|ICRNL; tcsetattr(com,&newtermios); i=write(com,s,5); // i во время выполнения == 5 close(com); } Скорее всего я не прописал в Linux irq4 и 0x3f8 (в Windows это делается настройкой драйверов), а как в Linuxе сказать что я хочу работать не с модемом, а с COM портом? В какие файлы что добавить? (я установил RedHat)

anonymous

Re: Проблема при использовании Com порта.

Смотри функцию void cfmakeraw(struct termios *termios_p);

Для первого теста полезно поставить заглушку на СОМ порт, т.е. одним проводом замыкаешь Rx на Tx.

Для теста физической связи делай в одной консоли

ls -lt / >> /dev/ttyS0

в другой консоли cat /dev/ttyS0

yantux ()

Re: Проблема при использовании Com порта.

С прерывами, адресами портов не парься, если у тебя стандартный СОМ портна компе.

yantux ()

Re: Проблема при использовании Com порта.

говорить линуксу, что ты работаешь не как не надо, все настраивается
параметрами termios, попробуй приведенный ниже код.


void COMPORT::OpenPort()
{
	port_desc = open(port_name.c_str(), O_RDWR | O_NOCTTY); 
	if(port_desc < 0)
	{
		cerr << port_name << ": CreateFile failed with error " << errno << endl;
		return;
	}

	struct termios newtio;
	bzero(&newtio, sizeof(newtio));
	newtio.c_cflag = B9600 | CS8 | PARENB | PARODD | CLOCAL | CREAD;
	newtio.c_iflag = INPCK;
	newtio.c_oflag = 0;

	/* set input mode (non-canonical, no echo,...) */
	newtio.c_lflag = 0;
 
	newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
	newtio.c_cc[VMIN]     = 0;   /* blocking read until N chars received */

	tcflush(port_desc, TCIOFLUSH);
	tcsetattr(port_desc, TCSANOW, &newtio);
}

bool COMPORT::Write(const string &send_str) const
{	
	const int real_length = write(port_desc, send_str.data(), send_str.size());
	if(real_length == -1)
	{
		cerr << port_name << ": WriteFile failed with error " << errno << endl;
		return false;
	}
	if(((size_t) real_length) == send_str.size())
		return true;
	else
		return false;	
}

yuko ()

Проблема при использовании Com порта.

Спасибо за ответы. Попробывал! Не получается. (я, конечно, понимаю что вроде бы у меня стандартный COM порт, но что то с ним (а точнее в настройках) не то)

1. Попорядку. Попробывал выполнить тест физической связи. Правда не ставил заглушку, а использовал два компа (на обоих com. порты исправны). После этого там где стоит Linux выполнил команду cat /dev/ttyS0, на другом где стоит Windows запустил терминальную программку для прослушки Com портов(которой давно пользуюсь и даже если бы скорость, чётность и т.п. не совпадали то в ней я бы всё равно увидел какие-нибудь цифры). После этого попытался набрать какой то текст в терминале Linux, и отослать из терминала Windows сигналы. Результат нулевой, то есть ни там, ни там ничего не видно.

2. Попробывал скомпилировать примерчик, rs232.cpp ... Создал переменную r = new Port("/dev/ttyS0",115200,8,true,0); после этого выполнил команду write(r->fl,buffer,5); Проследил в отладчике как выполняется, все открывает но байты не уходят.

3. Всё же склоняюсь к мысли, что это не совсем так. Если по умолчанию Linux пытается открыть модемное устройство (которого нет) освобождается ли порт? (просто пробывал старым методом через открытие порта, система выдает что порт занят, перед этим выполнив перезагрузку).

4. Мне кажется, что данный пример аналогичен приведённому в п.2. Но всё равно попробую.

anonymous ()
Ответ на: Проблема при использовании Com порта. от anonymous

оПНАКЕЛЮ ОПХ ХЯОНКЭГНБЮМХХ Com ОНПРЮ.

оНОПНАШБЮК ОПХЛЕПВХЙ ХГ НРБЕРЮ ╧4 (ОПЮБДЮ РХО string ГЮЛЕМХК, МН ЯСРХ ЩРН МЕ ЛЕМЪЕР) НРЙПШБЮЕРЯЪ, ЙЮЙ НАШВМШИ ТЮИК.

яЙНПЕЕ БЯЕЦН С ЛЕМЪ БНГМХЙКХ ОПНАКЕЛШ ОПХ СЯРЮМНБЙЕ, ХГ-ГЮ РНЦН ВРН НАШВМЮЪ ЯАНПЙЮ ЙНЛО. ОНДПЮГСЛЕБЮЕР ДБЮ ОНПРЮ МЮ ЛЮРЕПХМЯЙНИ ОКЮРЕ, С ЛЕМЪ ФЕ РНКЭЙН НДХМ ЙЮЙНИ МНЛЕП irq Б ЩРНЛ ЯКСВЮЕ БШДЮЯР Linux, ЦДЕ ОНЯЛНРПЕРЭ?

еЫ╦ МЕАНКЭЬНИ БНОПНЯХЙ (ЙНРНПШИ МЮБНДХР МЮ ЛШЯКЭ Н МЕНАУНДХЛНЯРХ ОПНОХЯШБЮРЭ МЮЯРПНИЙХ ОНПРНБ irq Х ЮДПЕЯ ОНПРЮ БПСВМСЧ), ЕЯКХ С ЛЕМЪ АСДЕР СЯРПНИЯРБН USB (Й ЙНРНПНЛС ОНДЙКЧВЕМ ОПЕНАПЮГНБЮРЕКЭ ХМРЕПТЕИЯЮ АЕГ ДПЮИБЕПЮ ДКЪ МЕЦН ЯНГДЮ╦РЯЪ ТЮИКХЙ "/DEV/USB/02/02"), РН ЙЮЙ ЯБЪГЮРЭ ЩРНР ТЮИК(ОНРНЙ) Я ЙНМЙПЕРМШЛ ОНПРНЛ DE000000 Х irq 21 ХКХ ЙЮФДШИ ПЮГ ХЯЙЮРЭ ДПЮИБЕП Й ЙЮФДНЛС ОПЕНАПЮГНБЮРЕКЧ. ъ РЮЙ ОНМХЛЮЧ ВРН Б ЯКСВЮЕ ПЮАНРШ Я USB, ДНКФЕМ ПЮАНРЮРЭ ЮМЮКНЦХВМШЛ НАПЮГНЛ, ЙЮЙ Х Я COM ОНПРНЛ. мН РНКЭЙН ГДЕЯЭ ДПСЦЮЪ ОПНАКЕЛЮ ТЮИК РЮЙФЕ НРЙПШБЮЕРЯЪ, МН ТСМЙЖХЪ write БШДЮ╦Р НЬХАЙС (УНРЪ БПНДЕ АШ ДНЯРСО Й ТЮИКС НРЙПШК).

anonymous ()
Ответ на: Проблема при использовании Com порта. от anonymous

Re: Проблема при использовании Com порта.

Всё же я рекомендую отработать всё на локальном компе, потом уже соединять компы.

1. Соедини сом1 и сом2. Запусти утилиту minicom на каждый компорт, попробуй выполнить обмен данными. Когда это пройдёт переходи к следующему этапу.

2. Настрой оба сом порта из консоли командой stty, тебе необходимо перевести их с начала в raw режим. В одной консоли сделай cat в другой echo , играй с настройками stty , читай доки на opennet.ru

Если ты соединяешь два компа могут быть порблемы на физическом уровне:

1. компы запитываются от разных фаз

2.длина кабеля слишком большая.

поэтому научись делать устойчивуюсвязь на одном компе.

yantux ()

Re: Проблема при использовании Com порта.

я думаю, тебе стоит проверить работоспособность соединения и порта программой minicom (как посоветовали выше), а так же настройки порта утилитой setserial (ex.: setserial /dev/ttyS0), и только после того как убедишься в работоспособности, пробовать послать данные из программы. Кстати, стоит ли на этой же машине венда (в дуал буте), и если стоит, работает ли там этот порт. К вопросу о преобразователе, если ты имеешь в виду преобразователь USB->RS232, то большинство из них делается либо на prolific (pl2303), либо на FTDI (другие преобразователь не разу не попадались, даже в промышленном исполнении), обе они прекрасно работают в линуксе, то есь при присоединении устройств к USB порту, в системе появляется /dev/ttyUSB0 (при наличии в системе hal и udev) и работаешь с ним как с обычным портом

yuko ()

Re: Проблема при использовании Com порта.

Пытаюсь запустить minicom -s. При запуске выдает следующее сообщение Line 2 of the глобальном config file not understood. После этого выбираю настройка последовательного порта 115200, 8, n /dev/ttyS0. Сохраняю настройки, запускаю minicom выдает то же сообщение "Line 2 of the глобальном config file not understood." и строчку Device /dev/ttyS0 lock failed: Операция не позволяется. Что делать дальше?

anonymous ()
Ответ на: Re: Проблема при использовании Com порта. от anonymous

Re: Проблема при использовании Com порта.

1. отредактировать конфигурационный файл, сам этим не занимался

2. порт кемто занят, смотри ps -ax , какойто процесс держит СОМ порт

3. всё делаешь из под рута?

yantux ()
Ответ на: Re: Проблема при использовании Com порта. от yantux

Проблема при использовании Com порта.

Работаю c правами root. А какой файл конфигурации посмотреть (как он называется)? Попробывал перезагрузить комп. minicom стал работать по другому. 1-ую строчку выдаёт ту же самую, а затем пытается зачем-то проинициализировать модем (я так понимаю, что послать AT команды, но на выходе всё равно ничего не видно).

anonymous ()
Ответ на: Проблема при использовании Com порта. от anonymous

Re: Проблема при использовании Com порта.

У minicom по умолчанию, вроде бы, включен "Hardware Flow Control", если шнур не полный (не все провода), или на принимаемой стороне этой опции нет, то байты передаваться не будут.

>которой давно пользуюсь и даже если бы скорость, чётность и т.п. не совпадали то в ней я бы всё равно увидел какие-нибудь цифры).

И еще, если скорости com-портов сильно отличаются, например 9600 и 115200, то ничего видно не будет... А если еще проверка четности включена...

mky ★★★★★ ()

Проблема при использовании Com порта.

Переустановил Linux. При первой загрузке попробывал запустить minicom. Связь была (после того как поставил програмное управление потоком). Сегодня пришёл опять всё пропало. Может кто-нибудь всё ж объяснит или даст ссылку (где почитать о том) как в Linuxе связать ttyS0 с конкретным портом (какие процессы должны быть запущены, чтобы всё работало).

anonymous ()
Ответ на: Re: Проблема при использовании Com порта. от yantux

Проблема при использовании Com порта.

Спасибо, получилось. И ещё маленький вопросик. Какие утилиты я должен использовать, если подключаю преобразователь USB - RS485 и какой файл связывать? У меня есть файл >dev/bus/usb/002/001 при подключении преобразователя создается файл dev/bus/usb/002/002, если повторно вставляю, то dev/bus/usb/002/003 и т.д.

anonymous ()
Ответ на: Проблема при использовании Com порта. от anonymous

Re: Проблема при использовании Com порта.

например что драйвера автоматически не подгрузились...

или железка не поддерживается

или надо набрать dmesg и посмотреть реальное имя файла устройства

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