LINUX.ORG.RU

Не получается читать с порта


0

1

Не получается прочитать дание из порта

//Чтения из порта


int ComPort::ReadPort(void* lp, int Size, bool ShowRead)
{
    int readbytes = 0;
        qDebug("%s","Start Read");
        do {
            //прочитать байты из порта в буфер программы
            readbytes = read(p_Port, lp, Size);
            if(readbytes > 0)
                if(ShowRead)
                    ShowReadData((char*)lp, (int)readbytes);
            qDebug()<<"Read:"<<readbytes;
           }
        while(readbytes > 0);

    qDebug()<<"Read good";
    return readbytes;
}

int ComPort::WritePort(char *buff, int Size)
{
    qDebug()<<"Write Thread Start!!!";
    int writebytes = write(p_Port, buff, Size);
    qDebug()<<"DATA were writed... (total "<<writebytes<<" bytes)";

   return 0;
}

int ComPort::OpenPort()
{
 p_Port = open(PortName.toAscii().data(), O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (p_Port < 0)
        return -1;   

 // Настраиваем порт на асинхронную передачу
    // allow the process to receive SIGIO
    fcntl(p_Port, F_SETOWN, getpid());
    // Make the file descriptor asynchronous (the manual page says only
    // O_APPEND and O_NONBLOCK, will work with F_SETFL...)
    fcntl(p_Port, F_SETFL, FASYNC);

   if(!SetupConnection())
      return -3;
}

bool ComPort::SetupConnection()
{
        // заповняэмо структуру
        // linux.die.net/man/3/termios
        struct termios newtio;
//	newtio.c_cflag     = B19200 | CRTSCTS | CS8 |  CLOCAL | CREAD;
        newtio.c_cflag     = B19200 | CS8 |  CLOCAL | CREAD;
        newtio.c_iflag     = IGNPAR;  // input modes
        newtio.c_oflag     = 0;       // output modes
        newtio.c_lflag     = 0;       // local modes   --ICANON;
        newtio.c_cc[VMIN]  = 1;       // VMIN - minimum number of characters for noncanonical read(MIN)
        newtio.c_cc[VTIME] = TimeOut; // VTIME - inter-character timer unused

    // задаэмо нову структуру для порта
    if(tcsetattr(p_Port,TCSANOW,&newtio)<0)
        return false;

    //очищаэмо входну структуру в якый э данi, якы були отриманы,але не прочитанi
    tcflush(p_Port, TCIFLUSH);

    return true;
}


Запись проись происходит нормально пишет что записало 3 байта а считивать не получается (-1). Может кто увидет мою ошибку. Или подскажет исходник для примеру чужой. спасибо.


А почему не в старой теме?

Сходу нашел у тебя ошибку:

while(readbytes > 0);

Сразу же завершится.

Пиши

while(readbytes > -1)
коль уж `select` не хочешь использовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от NOCaut

Ты петлю делал?

Если разъемов нет, просто два проводочка прифигачь: RX одного порта соедини с TX другого и наоборот. Для элементарной проверки хватит. А потом запускай `com /dev/ttyS0` в одном терминале и `com /dev/ttyS1` в другом. Ну и набирай что-нибудь, как я тебе уже говорил!

Потом один проводок отцепишь, так узнаешь точно, где у тебя ttyS0, а где — ttyS1 (если они не подписаны).

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

RX одного порта соедини с TX другого и наоборот. Для элементарной проверки хватит

для элементарной проверки хватит закоротить RX-TX одного порта :) всё что пишешь, в нем-же и читаешь. Желательно ещё сигнальные цепи правильно скоммутить, чтоб аппаратный поток получался. Соединяешь цепи, открываешь minicom - должно получаться эхо на любой скорости.

ТС`у - выработай у себя какой-нить стиль кода. А то переменные, методы, параметры и проч. именуются «кто в лес, кто по дрова» - разбирать такой код тяжело.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

для элементарной проверки хватит закоротить RX-TX одного порта :) всё что пишешь, в нем-же и читаешь.

Можно и так. Как-то не подумал о таком простейшем варианте ☺

чтоб аппаратный поток получался

Необязательно, если не требовать полноценного RS-232.


И ТСу еще пожелание: пиши комментарии на английском, сам же себе потом спасибо скажешь!

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от NOCaut

визивал админов сказали что компорт работает.. а прочитать так и не получилося у меня ничего.. Все пропало. вариантов нет. проверил чужие коди з интернета тоже не работает( Всем спасибо за потдержку особенно MKuznetsov )

NOCaut
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.