Russian Qt Forum
Май 08, 2024, 01:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работа с qextserialport  (Прочитано 14572 раз)
Alex2006
Гость
« : Январь 17, 2007, 23:25 »

Народ помогите. Начал делать прогу для работы с rs232? нашёл библиотеку qextserialport, но не понимаю как сделать независимо и одновременно чтение и запись. Если кто работал, скинте пример на alex200206@list.ru. Буду премного благодарен.
Записан
nova
Гость
« Ответ #1 : Январь 17, 2007, 23:43 »

Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет Улыбающийся .
Если надо могу поделится Подмигивающий
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Январь 18, 2007, 01:56 »

www.ii-system.com, там прога InSense, которая юзает qextserialport, в исходниках. качай, смотри
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Alex03
Гость
« Ответ #3 : Январь 18, 2007, 10:42 »

Под линухом с использованием QSocketNotifier можно забубенить, чтоб только сигналы приходили типа - "доступны новые данные", "записанные данные переданы".
Записан
sector
Гость
« Ответ #4 : Январь 18, 2007, 11:56 »

Народ зачем так извращатся!!! Грустный Можно сделать просто виртуальные функции и разбить на win и linux... там все просто только надо условия препроцессора норимально прописать!!! и собственно 2 функции перегрузить!!!
Записан
Alex03
Гость
« Ответ #5 : Январь 18, 2007, 12:18 »

Разница в блокирующем и неблокирующем вводе/выводе, а в случае неблокирующего в работе по опросу или по "сигналам" от ядра (драйверов).
Записан
Alex2006
Гость
« Ответ #6 : Январь 18, 2007, 21:00 »

Спасибо за ответы, если не сложно кинь на мыло посмотреть.
Записан
Alex03
Гость
« Ответ #7 : Январь 19, 2007, 08:14 »

Цитата: "Alex2006"
Спасибо за ответы, если не сложно кинь на мыло посмотреть.

Если это мне, то кто сказал что оно у меня есть? Улыбающийся
QSocketNotifier пользовал под линуксом для ловли событий от файлового дискриптора драйвера некоего девайса.
Записан
nova
Гость
« Ответ #8 : Январь 19, 2007, 11:12 »

А если ко мне, то отправил на почту Улыбающийся
Использовал именно QSocketNotifier для readyRead. для записи не делал за ненадобностью. там правда делать нечего Подмигивающий
Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде Улыбающийся )
Записан
Alex03
Гость
« Ответ #9 : Январь 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 порта не есть гуд. Грустный
Записан
mcgeenerman
Гость
« Ответ #10 : Январь 19, 2007, 15:24 »

Я юзал данный набор классов. У меня получилось под линуксом, под винду не могу утверждать что работает, но теоретически должно. Пользовался qt3(mandriva linux). Инициализация нармально. Запись в ком writeBlock(...) прошла сразу. C чтением пришлось повозиться. Решение примерно такое:
ожидаеш байты Posix_QextSerialPort::bytesWaiting(1000), читаеш один байт
readBlock(...), повторение до тех пор пока(условие).
Скинул бы код но он на работе.
Записан
nova
Гость
« Ответ #11 : Январь 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 и пользовотся ао всех перечисленных случаях.

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

И вобще, все это в вениках серез такую задницу делается Улыбающийся
Записан
izoomer
Гость
« Ответ #12 : Январь 19, 2007, 19:52 »

Цитата: "nova"
Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет Улыбающийся .
Если надо могу поделится Подмигивающий

а можно и мне, мне как раз под линух нужно
Записан
nova
Гость
« Ответ #13 : Январь 19, 2007, 23:13 »

Цитата: "izoomer"
Цитата: "nova"
Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас.
Функционал как у QFile тока для кома.
Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет Улыбающийся .
Если надо могу поделится Подмигивающий

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

Можно, но куда?
К стати а может в форум выложить?
Токо я не нашел как Улыбающийся
Записан
mcgeenerman
Гость
« Ответ #14 : Январь 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;
}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.