Еще вопрос???
(«Телесистемы»: Конференция 'Микроконтроллеры и их применение')

миниатюрный аудио-видеорекордер mAVR

Отправлено ARM 30 сентября 2003 г. 19:24
В ответ на: Просто в самом первом Вашем посте был отражен тот факт, что скорость Вы меряли осцилографом. отправлено viiv 30 сентября 2003 г. 14:40

Спасибо за все ответы. Если вы не против, то задам вам еще несколько вопросов.

Вот простая функция открытия порта, записи и чтения из порта.
Почему после того как я записал в порт значение, в порте продолжает висеть что-то непонятное?!
На ответной стороне порта я повесил контроллер, и он отвечает байтом или последовательностью в ответ на 0x55, 0x80 и т.п., в его работоспособности я не сомневаюсь не на секунду. Но эта функция зависает при вызове read, хотя я устанавливаю флаг O_NDELAY(O_NONBLOCK)?! Можно ли запрограммировать COM-порт в Linux'е, так чтобы функция read работала с тайм-аутом?!

Заранее спасибо. Очень надеюсь на ваш ответ.

//---------------------------------------------------------------------------
int ComPort(void)
{
int hCom, i;
unsigned long n;
unsigned char *buff;
struct termios ComCfg;

buff = new(unsigned char[20]);

hCom = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);

if (hCom == -1)
{
perror("TCom:Connect / Unable to open /dev/ttyS1 ");
return -1;
}
else fcntl(hCom, F_SETFL, 0);


tcgetattr(hCom, &ComCfg);

cfsetispeed(&ComCfg, B115200); // speed
cfsetospeed(&ComCfg, B115200); // speed
printf("Before SS - %x\n", ComCfg.c_cflag);

ComCfg.c_cflag |= (CLOCAL | CREAD);

// 8N1
printf(" %x ", ComCfg.c_cflag); puts("1");
ComCfg.c_cflag &= ~PARENB;
printf(" %x ", ComCfg.c_cflag); puts("2");
ComCfg.c_cflag &= ~CSTOPB;
printf(" %x ", ComCfg.c_cflag); puts("3");
ComCfg.c_cflag &= ~CSIZE;
printf(" %x ", ComCfg.c_cflag); puts("4");
ComCfg.c_cflag |= CS8;
printf(" %x ", ComCfg.c_cflag); puts("5");

ComCfg.c_cflag &= ~CRTSCTS;
printf(" %x ", ComCfg.c_cflag); puts("6");


printf("Before set - %x\n", ComCfg.c_cflag);
tcsetattr (hCom, TCSANOW, &ComCfg);
printf("After set - %x\n", ComCfg.c_cflag);

buff[0] = 0x55;
buff[1] = '\n';
n = write(hCom, buff, 1);
printf("Write port 0x80: write return - %d", n);
fflush(stdout);
getchar();

n = read(hCom, buff, 1);
if(n == -1) perror("read error ");
else printf("Read port: n = %d, buff = 0x%x\n", n, buff[0]);
fflush(stdout);


if (hCom != 0) close(hCom);

return 0;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru