LINUX.ORG.RU

Чтение из COM порта, При чтении из порта зависает read()


0

1

Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею: Откривать,закривать, писать. а читать не получается. програма зависает при read(). Я читал з /dev/tteS0 и /dev/tteS1. я ожидал что read() вернет 0 или чтото в етом роде но не зависнет.


Ответ на: комментарий от Eddy_Em

у меня select() возвращает 0. и дале код уже не работает.

//Чтения из порта
int ComPort::ReadPort(void* lp, int Size, bool ShowRead)
{
    int readbytes = 0;

    fd_set rfds;                   // набор файлоих дискрипторов
    struct timeval tv;             // Время ожидания
    int retval;                    // return select

    // задаэмо макрос
    FD_ZERO(&rfds);                // очищаем набор
    FD_SET(p_Port, &rfds);         // задаем свойства порта
    tv.tv_sec = 0; tv.tv_usec = 500000; //  0.5
    //перевiряэмо готовнiсть порта
    retval = select(p_Port + 1, &rfds, NULL, NULL, &tv);
    if (retval == -1)
    {
        qDebug()<<"Контроллер не готов";
        return -7;
    }
    if (FD_ISSET(p_Port,&rfds))
    {
        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);
    }
    else
    {
        qDebug()<<"Готов но не COM-порт";
        return -8;
    }

    qDebug()<<"Read good";
    return readbytes;
}
NOCaut
() автор топика
Ответ на: комментарий от Eddy_Em

пишу:

 [10:36:01] Dukuy Roman: //Запись в порт
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;
}

 WritePort(buff,Sizeof(Size)+bswap(l_Size));

как ето не пишет если команда write(p_Port,buff,Size) мне вернула что записала 3 байта. после write() я визиваю ReadPort(l_Buffer,3)

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

Такое ощущения что я не подклучен к порту.. з и без терминала работает только ttyS0 и ttyS1 порти. как програмно или не програмно опредилить что я подключил етот кончений терминал? Спасибо.

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

Вот что вернуло dmesg

$ sudo dmesg | grep [s,S]erial
[    0.522460] Serial: 8250 ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.522809] serial8250: ttyS0 at I/O 0x3f8 (irq = 3) is a 16550A

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

Запись с того же компьютера велась? Так буферы-то разные! В буфере записи 3 байта появилось, а в буфере чтения как было пусто, так и осталось, если никто не подключен к порту.

Или запись производилась с другого компьютера/устройства, подключенного к порту?

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

Терминал сам по себе что-нибудь в порт посылает, или его "пнуть" надо сначала?

Если посылает, достаточно запустить `com` из пакета `tinyserial` (или стандартный `minicom`, но с ним возни дюже дофига).

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

Комп тот же. Пишу 3 байта и на чтения а считивается -1;

пробивал через консоль чтото послать в порт..

stty -F /det/ttyS2 115200
cat /dev/ttyS2 > test.txt &
echo -e "AT\r\n" > /det/ttyS2
тишина((((

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

<<Терминал подключен? поключен.

<<И почему ttyS2? ето я с форума скинул тебе. у меня работает S0 і S1.

я пробивал по разному открить порт minicom и minicon i всем что находил в нете.. Ком порт не откривается!!! пробую чтото послать в него з консоли и пустота. У меня уже нету идей(

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

minicom -p /dev/ttyS0 - конектится к порту но не отвечает дале.

NOCaut
() автор топика
Ответ на: комментарий от NOCaut
  • Сделай петлю COM1 <-> COM2 (только не забуть TX и RX перекрестить).
  • Запусти в двух консольках `com`: один на ttyS0, второй — на ttyS1.
  • Попиши что-нибудь в одной консольке — в другой должен появиться этот текст.

Если не выйдет — какой-то косяк с портами.

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

пробував. не помогло( попробую ще gtkterm - ето уже последняя надежда

NOCaut
() автор топика
Ответ на: комментарий от Eddy_Em
    try{
   int reta = connect(&theComPortNotifier, SIGNAL(signalNotify()), this, SLOT(slot()),Qt::DirectConnection);
        qDebug()<<"ComPortLin: Connect signal="<<reta;
    }
    catch(...)
    {
        fConnected = false;
        return -4;
    }

получаю - Object::connect: No such slot ComPort::slot(); - может тут собака зарыта?

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