NightSpider
Дата: 14.10.2006 15:20:01
Данные с одной машины (win) передаются на другую(unix). Все замечательно работает, но заметил, что при передаче символа с кодом 13 с машины Win, Unix принимает символ с кодом 10. Все остальные символы передаются без изменении.
Проверил портмоном передачу из винды - от программы в порт уходит символ 13, как и положено.
В чем может быть причина?
NightSpider
Дата: 14.10.2006 22:29:07
На втором компе установлен Linux XP, на чистом c++ написана функция открытия порта и чтения всего подряд с выводом на экран.
В понедельник попробую поперекидывать данные по нульмодемному шнурку с Unix->Unix и Win->Win
Появилась мысль, что это может быть связано с Hardware и Software flow Control.
NightSpider
Дата: 16.10.2006 15:24:11
//---------------------------------------------------------------------------
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;
//Устанавливаем RAW INPUT
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// Отключаем режим обработанного вывода (замена LR->CR и прочее. См. инструкцию)
options.c_oflag &~OPOST;
//Установка аппаратного контроля передачи данных
options.c_cflag |=CRTSCTS;
options.c_iflag &=~(IXON|IXOFF|IXANY);
options.c_cc[VMIN] = 0; // Минимальное количество символов для чтения
options.c_cc[VTIME] = timeout; //Время ожидания
/* set the options */
tcsetattr(handle, TCSANOW, &options);
ioctl(handle,TCFLSH,2); // Сбарываем очереди ввода вывода
return 0;
}