powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с com портом. Проблема с символом 13
8 сообщений из 8, страница 1 из 1
Работа с com портом. Проблема с символом 13
    #34057099
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу программу по передаче данных через 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
Работа с com портом. Проблема с символом 13
    #34057124
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13 - перевод каретки, 10 - конец строки. в Windows используются оба одновременно, в других ОС - по одиночке. суть в том, что если это не бинарка, то разницы нет, если бинарка - то придется по-своему выкрычиватся.
(нопример обозвать 1 спецсимволом:
1->1+1->1
10->1+2->10
13->1+3->13
и т.д.
)

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

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

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

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

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

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

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

ICRNL?

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

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

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

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

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

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

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

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


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