|
Спасибо за все ответы. Если вы не против, то задам вам еще несколько вопросов.
Вот простая функция открытия порта, записи и чтения из порта.
Почему после того как я записал в порт значение, в порте продолжает висеть что-то непонятное?!
На ответной стороне порта я повесил контроллер, и он отвечает байтом или последовательностью в ответ на 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