LINUX.ORG.RU

установка скорости RS232


0

0

Может кто подскажет как установить нестандартую скорость на ком порт (100 бод)?

tcsetattr, и cfsetispeed не подходит т.к работают через константы (B50 B75 B110 и т.д)

с ioctl - похоже тоже самое

вроде както можно установить через inb outb но куда что писать я не знаю

может у кого исходники программ есть которые скорость RS232 ставят.


Тебе нужны исходники setserial, там есть опция custom: 
spd_cust
       Use the custom divisor to set the speed when the  application
       requests 38.4kb. In this case, the baud rate is the baud_base
       divided by the divisor.  This parameter may be specified by a
       non-privileged user. 
 
Вот, по быстрому сообразил (кстати это полный strace, такой маленький, да): 
root@mmx:/# strace -f setserial /dev/ttyS0 baud_base 115200 divisor 1152 spd_cust 
execve("/sbin/setserial", ["setserial", "/dev/ttyS0", "baud_base", "115200", "divisor", "1152", "spd_cust"], [/* 46 vars */]) = 0 
brk(0) = 0x804cdaf 
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=87590, ...}) = 0 
old_mmap(NULL, 87590, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40000000 
close(3) = 0 
open("/lib/libc.so.6", O_RDONLY) = 3 
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0\326\357"..., 512) = 512 
fstat64(3, {st_mode=S_IFREG|0755, st_size=1343525, ...}) = 0 
old_mmap(0x45ee8000, 1152420, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x45ee8000 
old_mmap(0x45ff8000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10f000) = 0x45ff8000 
old_mmap(0x45fff000, 9636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x45fff000 
close(3) = 0 
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000 
munmap(0x40000000, 87590) = 0 
open("/dev/ttyS0", O_RDWR|O_NONBLOCK) = 3 
ioctl(3, TIOCGSERIAL, 0xbffff4c0) = 0 
ioctl(3, TIOCSSERIAL, 0xbffff480) = 0 
close(3) = 0 
exit_group(0) = ? 

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

>open("/dev/ttyS0", O_RDWR|O_NONBLOCK) = 3

>ioctl(3, TIOCGSERIAL, 0xbffff4c0) = 0

>ioctl(3, TIOCSSERIAL, 0xbffff480) = 0

слыш CL ето именно то что тебе нужно.

только там есть ещё какието нюансы, например _иногда_ сии изменения не сразу дают нужный еффект.

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

Спасибо за ответы.
Только я пошел несколько по другому пути
вот что у меня получилось для ком порта 1

void set_100_com1(void)
{
ioperm(0x3F8,4,1);
tmp=inb(0x3FB);
outb(tmp|0x80,0x3FB);
inb(0x04,0x3F9);//115200/V где V=100 =0x0480
inb(0x80,0x3F8);
ioperm(0x3F8,4,0);
}

подробнее
http://www.linux.ru/forum/index.php?t=msg&th=81948&start=0&rid=0&...

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

В файле /usr/src/linux-2.4.28/include/net/irda/ircomm_param.h есть строки:
#define IRCOMM_1_STOP_BIT 0x00
#define IRCOMM_2_STOP_BIT 0x04 /* 1.5 if char len 5 */

То есть 1.5 можно таки выставить штатно. Я понимаю, что это для irda, но у меня нет времени искать в ядре более точную информацию, я только хочу намекнуть, что всё можно найти. Кроме того (это моё IMHO) лучше использовать ioctl, ведь вызовы есть и они определены, опускаться до ассемблера - смысла нет.

Я не программист :-)

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

/usr/include/linux/serial_reg.h
#define UART_LCR_STOP 0x04 /* Stop bits: 0=1 bit, 1=2 bits */
#define UART_LCR_WLEN5 0x00 /* Wordlength: 5 bits */

Я надеюсь тут тоже, если в UART_LCR_STOP 2 и UART_LCR_WLEN5, то получаем 1.5 бита :-)

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