Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с com портом. Проблема с символом 13 / 8 сообщений из 8, страница 1 из 1
16.10.2006, 13:45
    #34057099
NightSpider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
Пишу программу по передаче данных через com порт. Для отладки использую один комп, порты ttyS0 и ttyS1 соединены нуль модемным кабелем. Оба порта открываю одним и тем же способом. В целом, передача данных проходит без проблем, но возникает проблема всего с одним символом. При передаче символа с кодом 13 с ttyS0, второй порт ttyS1 упорно принимает символ с кодом 10. В обратном направлении возникает та же проблема. С другими символами проблем не возникает, если передаешь символ 10, то и принимаешь символ 10. Подскажите возможную причину проблемы здесь или вышлите на мыло witek@yandex.ru

Функции открытия порта, передачи и приема символов порта прилагаю.

Открытие:
Код: plaintext
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.
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); // Установили скорость отправки сообщений
/* set raw input, 1 second timeout */
options.c_cflag |= (CLOCAL | CREAD);
//No parity (8N1)
options.c_cflag &=~PARENB;
options.c_cflag &=~CSTOPB;
options.c_cflag &=~CSIZE;
options.c_cflag |=CS8;
//Установка аппаратного контроля передачи данных

options.c_cflag |=CRTSCTS;
options.c_iflag &=~(IXON|IXOFF|IXANY);

// Программное управление передачей данных
// options.c_cflag &=~CRTSCTS;
// options.c_iflag |=(IXON|IXOFF|IXANY);

//Устанавливаем RAW INPUT
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_cc[VMIN] =  0 ; // Минимальное количество символов для чтения
options.c_cc[VTIME] = timeout; //Время ожидания
/* set the options */
tcsetattr(handle, TCSANOW, &options);
ioctl(handle,TCFLSH, 2 ); // Сбарываем очереди ввода вывода
return  0 ;
}
Функция передачи символов

//---------------------------------------------------------------------------
Код: plaintext
1.
2.
3.
4.
5.
6.
long TComPortFunctions::Write(unsigned char *answer, long len)
{
if (handle==- 1 ) return - 1 ;
if (write(handle, answer, len)!=len) return - 2 ;
printf("Write len: %d\n",len);
return  0 ;
}
Функция чтения символов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void TComPortFunctions::ReadToScreen()
{

unsigned char block_from;
block_len= 1 ;

while (block_len!= 0 )
{
block_len=read(handle, &block_from, block_len);
if (block_len> 0 ) printf("Resutlt: %d\n",block_from);

}
}
...
Рейтинг: 0 / 0
16.10.2006, 13:50
    #34057124
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
13 - перевод каретки, 10 - конец строки. в Windows используются оба одновременно, в других ОС - по одиночке. суть в том, что если это не бинарка, то разницы нет, если бинарка - то придется по-своему выкрычиватся.
(нопример обозвать 1 спецсимволом:
1->1+1->1
10->1+2->10
13->1+3->13
и т.д.
)

аффтопитезь
...
Рейтинг: 0 / 0
16.10.2006, 14:02
    #34057173
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
У меня так:

c: CRTSCTS, CS8, CLOCAL, CREAD
i: IGNPAR
o: 0
l: 0

Сдается мне, дело в IGNPAR.
...
Рейтинг: 0 / 0
16.10.2006, 14:09
    #34057207
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
AkhУ меня так:

c: CRTSCTS, CS8, CLOCAL, CREAD
i: IGNPAR
o: 0
l: 0

Сдается мне, дело в IGNPAR.

Сорри. Попробуй сбросить в i: INLCR (NL->CR), ICRNL(перевод каретки в конец строки); в o: ONLCR, OCRNL

А вообще, лучше, устанавливать нужные биты, а не изменять существующие
...
Рейтинг: 0 / 0
16.10.2006, 15:28
    #34057468
NightSpider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
Снятие флага
Код: plaintext
options.c_oflag &= ~OPOST;
убирает возможность обработанного вывода, т.е. никаких замен не производится. На всякий случай устанавливал и снимал флажки INLCR,ONLCR, OCRNL - как и положено никаких замен не происходило. Мой символ 13 в любом случае меняется на 10.
...
Рейтинг: 0 / 0
16.10.2006, 15:44
    #34057550
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
NightSpiderСнятие флага
Код: plaintext
options.c_oflag &= ~OPOST;
убирает возможность обработанного вывода, т.е. никаких замен не производится. На всякий случай устанавливал и снимал флажки INLCR,ONLCR, OCRNL - как и положено никаких замен не происходило. Мой символ 13 в любом случае меняется на 10.

ICRNL?

OPOST - как написано в документации, включение режима, определяемого реализацией по умолчанию.
...
Рейтинг: 0 / 0
16.10.2006, 16:33
    #34057822
NightSpider
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
Разобрался. Проблема возникала из-за поднятого флага icrnl. После его снятия передача символа13 началась без проблем.
Почему-то из моей программы флаг не снимался (запускаю под root)
options.c_cflag &=~ICRNL;

Если знаете почему это может происходить, скажите.

Флаг снимал из терминалки stty -F /dev/ttyS0 -icrnl – помогло.

Спасибо всем откликнувшимся.
...
Рейтинг: 0 / 0
16.10.2006, 16:39
    #34057843
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с com портом. Проблема с символом 13
NightSpiderРазобрался. Проблема возникала из-за поднятого флага icrnl. После его снятия передача символа13 началась без проблем.
Почему-то из моей программы флаг не снимался (запускаю под root)
options.c_cflag &=~ICRNL;

Если знаете почему это может происходить, скажите.

Флаг снимал из терминалки stty -F /dev/ttyS0 -icrnl – помогло.

Спасибо всем откликнувшимся.

Не c flag, а i flag
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с com портом. Проблема с символом 13 / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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