Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: Alex2006 от Январь 17, 2007, 23:25



Название: Работа с qextserialport
Отправлено: Alex2006 от Январь 17, 2007, 23:25
Народ помогите. Начал делать прогу для работы с rs232? нашёл библиотеку qextserialport, но не понимаю как сделать независимо и одновременно чтение и запись. Если кто работал, скинте пример на alex200206@list.ru. Буду премного благодарен.


Название: Работа с qextserialport
Отправлено: nova от Январь 17, 2007, 23:43
Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) .
Если надо могу поделится ;)


Название: Работа с qextserialport
Отправлено: Racheengel от Январь 18, 2007, 01:56
www.ii-system.com, там прога InSense, которая юзает qextserialport, в исходниках. качай, смотри


Название: Работа с qextserialport
Отправлено: Alex03 от Январь 18, 2007, 10:42
Под линухом с использованием QSocketNotifier можно забубенить, чтоб только сигналы приходили типа - "доступны новые данные", "записанные данные переданы".


Название: Работа с qextserialport
Отправлено: sector от Январь 18, 2007, 11:56
Народ зачем так извращатся!!! :( Можно сделать просто виртуальные функции и разбить на win и linux... там все просто только надо условия препроцессора норимально прописать!!! и собственно 2 функции перегрузить!!!


Название: Работа с qextserialport
Отправлено: Alex03 от Январь 18, 2007, 12:18
Разница в блокирующем и неблокирующем вводе/выводе, а в случае неблокирующего в работе по опросу или по "сигналам" от ядра (драйверов).


Название: Работа с qextserialport
Отправлено: Alex2006 от Январь 18, 2007, 21:00
Спасибо за ответы, если не сложно кинь на мыло посмотреть.


Название: Работа с qextserialport
Отправлено: Alex03 от Январь 19, 2007, 08:14
Цитата: "Alex2006"
Спасибо за ответы, если не сложно кинь на мыло посмотреть.

Если это мне, то кто сказал что оно у меня есть? :)
QSocketNotifier пользовал под линуксом для ловли событий от файлового дискриптора драйвера некоего девайса.


Название: Работа с qextserialport
Отправлено: nova от Январь 19, 2007, 11:12
А если ко мне, то отправил на почту :)
Использовал именно QSocketNotifier для readyRead. для записи не делал за ненадобностью. там правда делать нечего ;)
Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) )


Название: Работа с qextserialport
Отправлено: Alex03 от Январь 19, 2007, 12:27
Цитата: "nova"

Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) )


А вот отсюда поподробней.

На мой текущий взгляд QSocketNotifier под виндой только для сокетов, и больше ни в чём не поможет. :(
Буду очень рад если ошибаюсь! Просвятите плиз. :)

Т.е. если в линуксе всё взаимодействие между юзерспейсом и файлами/сокетами/драйверами идёт через файловые дискрипторы (собственно всё отражается как файлы), то и механизм получения/ожидания событий от ядроспейса возможен через сисвызовы select()/poll(). Плюс соответствующий драйвер должен поддерживать poll.
Поэтому в линуксе QSocketNotifier просто засовывает свой файловый дискриптор в массив (в котором ещё и прочие стдин-ы/стдауты,  иксовые какиенить пайпы или теже сокеты и т.д.), а в глубине евентлупа qt передаёт этот массив в select()/poll().

В винде же источников событий выраженных в виде системных объектов туева хуча, которую всё же можно свесли воедино в какойнить MsgWaitForMultipleObjectХХХ вот только массив там из HANDLE.
В общем, по крайней мере в qt3.3.6, fd от QSocketNotifier передаётся в WSAAsyncSelect(), т.е. обрабатывается именно как
Цитировать
SOCKET s [in] A descriptor that identifies the socket for which event notification is required

и передать туда fd COM порта не есть гуд. :(


Название: Работа с qextserialport
Отправлено: mcgeenerman от Январь 19, 2007, 15:24
Я юзал данный набор классов. У меня получилось под линуксом, под винду не могу утверждать что работает, но теоретически должно. Пользовался qt3(mandriva linux). Инициализация нармально. Запись в ком writeBlock(...) прошла сразу. C чтением пришлось повозиться. Решение примерно такое:
ожидаеш байты Posix_QextSerialPort::bytesWaiting(1000), читаеш один байт
readBlock(...), повторение до тех пор пока(условие).
Скинул бы код но он на работе.


Название: Работа с qextserialport
Отправлено: nova от Январь 19, 2007, 16:01
Цитата: "Alex03"
Цитата: "nova"

Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) )


А вот отсюда поподробней.

На мой текущий взгляд QSocketNotifier под виндой только для сокетов, и больше ни в чём не поможет. :(
Буду очень рад если ошибаюсь! Просвятите плиз. :)

Т.е. если в линуксе всё взаимодействие между юзерспейсом и файлами/сокетами/драйверами идёт через файловые дискрипторы (собственно всё отражается как файлы), то и механизм получения/ожидания событий от ядроспейса возможен через сисвызовы select()/poll(). Плюс соответствующий драйвер должен поддерживать poll.
Поэтому в линуксе QSocketNotifier просто засовывает свой файловый дискриптор в массив (в котором ещё и прочие стдин-ы/стдауты,  иксовые какиенить пайпы или теже сокеты и т.д.), а в глубине евентлупа qt передаёт этот массив в select()/poll().

В винде же источников событий выраженных в виде системных объектов туева хуча, которую всё же можно свесли воедино в какойнить MsgWaitForMultipleObjectХХХ вот только массив там из HANDLE.
В общем, по крайней мере в qt3.3.6, fd от QSocketNotifier передаётся в WSAAsyncSelect(), т.е. обрабатывается именно как
Цитировать
SOCKET s [in] A descriptor that identifies the socket for which event notification is required

и передать туда fd COM порта не есть гуд. :(

Вы абсолютно прваы нащет HANDLE.
Мало того  он понадобится и для управления линиями порта, и для установок порта ( скорость, четность ... ).
Однако есть системный вызов HANDLE hFile  = (HANDLE) _get_osfhandle(fd); которым можно получить HANDLE и пользовотся ао всех перечисленных случаях.

Все чтоя сказал, чисто теоретические умозаключения. На данный момент проверять негде, да и некогда ;)

И вобще, все это в вениках серез такую задницу делается :)


Название: Работа с qextserialport
Отправлено: izoomer от Январь 19, 2007, 19:52
Цитата: "nova"
Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) .
Если надо могу поделится ;)

а можно и мне, мне как раз под линух нужно


Название: Работа с qextserialport
Отправлено: nova от Январь 19, 2007, 23:13
Цитата: "izoomer"
Цитата: "nova"
Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) .
Если надо могу поделится ;)

а можно и мне, мне как раз под линух нужно

Можно, но куда?
К стати а может в форум выложить?
Токо я не нашел как :)


Название: Работа с qextserialport
Отправлено: mcgeenerman от Январь 24, 2007, 19:57
а вот работающий код в линуксе

Код:
int ComPort::init(unsigned int comport,int boud_rate)
{
this->num = comport;

fstream of_file;
//cout<<"create stringstream"<<endl;
stringstream ss;
ss<<"/dev/ttyS"<<(num-1);
string s = ss.str();
cout<< "open com for write and read: " <<s<<endl;
BaudRateType s_BaudRateType;

switch(boud_rate)
{
case 9600:
s_BaudRateType=BAUD9600;
break;
case 115200:
s_BaudRateType=BAUD115200;
break;
default:
s_BaudRateType=BAUD9600;
break;
}

m_QextSerialPort.setName(s.data());
m_QextSerialPort.setBaudRate(s_BaudRateType);
m_QextSerialPort.setDataBits(DATA_8);
m_QextSerialPort.setStopBits(STOP_1);
m_QextSerialPort.setTimeout(2,500);

m_QextSerialPort.open();
return 0;
}
int ComPort::write(string packet, int wait_milisecs)
{
if(num==-1) return 1;
if(!m_QextSerialPort.isOpen())  
{
cout<< "port not open"<<endl;
return 2;
}

cout<< "write[ ";
for(int i=0;i<packet.size();i++)
cout<<setw(2)<<hex<<setfill('0')<<(int)packet[i]<<" ";
cout<< "]"<<endl;

int c_write = m_QextSerialPort.writeBlock(packet.data(),packet.size());

cout<<dec<<"writen in com queue: "<< c_write<<" bytes"<<endl;

return 0;
}

int ComPort::read(
string &packet,
int size,
unsigned char stared_char,
unsigned char stoped_char)
{

if(num==-1) return 1;
if(!m_QextSerialPort.isOpen())  
{
cout<< "port not open"<<endl;
return 2;
}
cout<< "clear packet string"<<endl;
packet.clear();

cout<<"waiting chars in port queue..."<<endl;
int i_ret = m_QextSerialPort.bytesWaiting();
if(i_ret==-1)
{
cout<<"waiting error."<<endl;
return 3;
}

unsigned char buf;
while(1)
{
int c_readed = m_QextSerialPort.readBlock((char*)&buf,1);
if(c_readed==0)
{
cout<< "readed from com stream: VOID"<<endl;
break;
}
if(c_readed>0)
{
cout<<"(r)>>"<<hex<<(unsigned int)buf<<endl;
packet.push_back(buf);
}
else{
cout<< "read failed"<<endl;
return 2;
}

if(buf==stoped_char)
{
cout<<"stoped byte was readed. break."<<endl;
break;
}
cout<<"waiting chars in port queue..."<<endl;
int i_ret = m_QextSerialPort.bytesWaiting();
if(i_ret==-1)
{
cout<<"waiting break."<<endl;
break;
}

}

cout<<dec<<"readed from com queue: "<< packet.size()<<" bytes"<<endl;

cout<< "readed[";
for(int i=0;i<packet.size();i++)
cout<<setw(2)<<hex<<setfill('0')<<(int)(unsigned char)packet[i]<<" ";
cout<< "]"<<endl;

return 0;
}


Название: Работа с qextserialport
Отправлено: nova от Январь 24, 2007, 20:25
А я и не сомневаюсь что он рабочий.
Но возникает вопрос как енто все прикрутить к гуйной морде?
С передачей все ясно. Но вот с приемом ???
Особенно если про задачу известно что устройство висящее на порту асинхронное. и данные с него могут появлятся в моменты времени зависящее от положения планет солнечной системы и от положения молекул воды находящихся в 5 кубах расоложеных на дне озера лохнес :) :)


Название: Работа с qextserialport
Отправлено: Racheengel от Январь 24, 2007, 23:55
Мы делали так - висит thread, в котором каждые 100мс проверяется на наличие новых данных в порту. Если это так, все читается и передается евентами в гуевый thread. Работало нормально.


Название: Работа с qextserialport
Отправлено: nova от Январь 25, 2007, 18:02
А меню было проще написать свой класс подглядывая в qextserialport чтобы в нем нормально отрабатывл readyRead() сигнал. Под линухом все прекрасно паботает.