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

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

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

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

ls -lt / >> /dev/ttyS0

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

yantux
()

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

yantux
()

говорить линуксу, что ты работаешь не как не надо, все настраивается
параметрами 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 порт, но что то с ним (а точнее в настройках) не то)

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
()
Ответ на: комментарий от anonymous

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

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

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

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

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

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

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

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

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

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

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

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

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

попробуй в биосе поменять параметры ком порта

rh9
()

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

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

Пытаюсь запустить 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
()
Ответ на: комментарий от anonymous

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

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

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

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

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

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

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

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

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

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

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

anonymous
()
Ответ на: комментарий от yantux

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

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

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

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

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

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