Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с com портом. Проблема с символом 13

19K
16 октября 2006 года
NightSpider
8 / / 16.10.2006
Пишу программу по передаче данных через com порт. Для отладки использую один комп, порты ttyS0 и ttyS1 соединены нуль модемным кабелем. Оба порта открываю одним и тем же способом. В целом, передача данных проходит без проблем, но возникает проблема всего с одним символом. При передаче символа с кодом 13 с ttyS0, второй порт ttyS1 упорно принимает символ с кодом 10. В обратном направлении возникает та же проблема. С другими символами проблем не возникает, если передаешь символ 10, то и принимаешь символ 10. Подскажите возможную причину проблемы здесь или вышлите на мыло [email]witek@yandex.ru[/email]

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

Открытие:
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;
}

Функция передачи символов

//---------------------------------------------------------------------------
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;
}
Функция чтения символов

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);

}
}
19K
16 октября 2006 года
NightSpider
8 / / 16.10.2006
Разобрался. Проблема возникала из-за поднятого флага icrnl. После его снятия передача символа13 началась без проблем.
Почему-то из моей программы флаг не снимался (запускаю под root)
options.c_cflag &=~ICRNL;

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

Флаг снимал из терминалки stty -F /dev/ttyS0 -icrnl – помогло.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог