Название: прием/отправка по rs232 в реалтайм Отправлено: lenovo2014 от Декабрь 15, 2014, 08:08 всем привет. появилась задача приема/отправки сообщений по последовательному порту. Интрефейс rs232 является асинхронным, следовательно нужно посадить порт на прослушку. Данные приходят почти что непрерывно. В данный момент реализовал это вот так:
конектим сигнал Код: serialportthread_2::serialportthread_2(QObject *parent) : Код: void serialportthread_2::run(){ Код: bool serialportthread_2::receive(){ вроде все работает, но мне кажется, что это криворукий способ. может кто подскажет как пограмотнее решить задачу? зы: также пробовал такой вариант: Код: void serialportthread_2::run(){ Название: Re: прием/отправка по rs232 в реалтайм Отправлено: Fregloin от Декабрь 15, 2014, 10:59 ну во первых зачем использовать одновременно waitFor... и сигнал readyRead()?
Первые функции следует использовать при блокирующих вызовах, а сигнал при асинхронной работе. Во вторых вы не проверяете bytesAvailable(). Ну и не помешало бы вам глянуть простые примеры при работе с сокетами. Хотя с ком портом не работал в Qt, так что конкретно сказать не могу. Если вы работаете в linux, то наверное проще будет работать через стандартные файловые функции. Название: Re: прием/отправка по rs232 в реалтайм Отправлено: kuzulis от Декабрь 15, 2014, 11:19 1. В корне неверная работа с тредами (если они действительно нужны). Поэтому все и виснет. Погугли. ;)
2. Достаточно и желательно только использовать связку readyRead() && receive() без всяких waitForXX() и msleep(100).. 3. Треды не нужны. Использовать нужно только если слишком долго осуществляется парсинг данных. В итоге - колбаса :) Название: Re: прием/отправка по rs232 в реалтайм Отправлено: lenovo2014 от Декабрь 15, 2014, 11:45 1. В корне неверная работа с тредами (если они действительно нужны). Поэтому все и виснет. Погугли. ;) сделал используя связку readyRead() && receive() ; все работает, но через некоторе время, когда число port.bytesAvailable() превышает некий порог, и ,я так понимаю, из-за переполнения буфера , программа виснет. Существует ли способ сбросить буфер ? 2. Достаточно и желательно только использовать связку readyRead() && receive() без всяких waitForXX() и msleep(100).. 3. Треды не нужны. Использовать нужно только если слишком долго осуществляется парсинг данных. В итоге - колбаса :) Название: Re: прием/отправка по rs232 в реалтайм Отправлено: kuzulis от Декабрь 15, 2014, 11:58 По умолчанию нет никакого ограничения на размер буфера (по умолчанию он бесконечный :) ).
Если нужно ограничение, то нужно установить setReadBufferSize(size > 0). Скорее всего что-то делаешь не так. Приведи код. Название: Re: прием/отправка по rs232 в реалтайм Отправлено: lenovo2014 от Декабрь 15, 2014, 12:21 По умолчанию нет никакого ограничения на размер буфера (по умолчанию он бесконечный :) ). Если нужно ограничение, то нужно установить setReadBufferSize(size > 0). Скорее всего что-то делаешь не так. Приведи код. Код: #include "serialportthread_2.h" Название: Re: прием/отправка по rs232 в реалтайм Отправлено: Mikhail от Декабрь 15, 2014, 14:53 Не увидел где определена data и ее размер. Может быть переполнение.
Где проверка количества пришедших байт? Название: Re: прием/отправка по rs232 в реалтайм Отправлено: kuzulis от Декабрь 15, 2014, 19:05 lenovo2014,
Да елки зеленые, почитай про работу с QThread уже. Или не используй QThread если не умеешь. Название: Re: прием/отправка по rs232 в реалтайм Отправлено: lenovo2014 от Декабрь 15, 2014, 19:16 Не увидел где определена data и ее размер. Может быть переполнение. char data[100]; // это объявление массиваГде проверка количества пришедших байт? port.read(&data[0],30); // считываю 30 байт, проверял в дебаг режиме Название: Re: прием/отправка по rs232 в реалтайм Отправлено: lenovo2014 от Декабрь 15, 2014, 19:17 lenovo2014, ты конкретно скажи что не так, все же по документации я сделалДа елки зеленые, почитай про работу с QThread уже. Или не используй QThread если не умеешь. Название: Re: прием/отправка по rs232 в реалтайм Отправлено: kuzulis от Декабрь 15, 2014, 19:36 Цитировать ты конкретно скажи что не так, все же по документации я сделал Не хочу. Я уже посоветовал все что нужно. Название: Re: прием/отправка по rs232 в реалтайм Отправлено: Fregloin от Декабрь 16, 2014, 11:52 во первых каждый раз при вызове слота чтения данных с сокета/порта следует проверить сколько данных в буфере. достаточно ли их для чтения или стоит еще подождать.
очевидно что у тебя зависает на функции read, потому что в буфере скорее всего недостаточно данных (нет 30 байт). поэтому если известен за ранее объем ожидаемых данных, стоит дождаться его. например так Код:
Это не полный код, но суть такая. Если у вас данные всегда одного размера все намного проще. Если размер данных палвающий, то каким то образом следует сначала передать размер пакета, а потом сами данные. Как это сделать решать вам, я для этого в начале данных всегда передаю фиксированную структуру данных типа Код: struct Header { Код: [Header][Data .....][Header][Data ...]... |