Уважаемый, действительно не так давно мне лично по этому вапросу помогли но по порту ЛПТ. Приведу листинг для билдера описан как класс с выводом 1 байта,какраз для СОМ порта. Если хочеш измениш да и провериш. Если смогёш то кинь личное сообшение с перекомпилированным кодом, да и что у тебя из этого получилось тоже опиши пожалуста.
Оформиш код как расширение .cpp
#include #pragma hdrstop #include //————————————————————————— /* ZeroMemory (// не знает что ето такое */ //объявим структуру для асинхронной работы порта OVERLAPPED over; //для выделения сигнала DWORD dwSignal; //объявим структуру для конфигурации СОМ порта DCB dcb; //дескриптор порта HANDLE hPortDat = NULL; //переменная для чтения char Data; //================================== //————————————————————————— class MuClDataOutPort < private: //пишим функцию инициализации порта bool InnitPort () < //открываем порт СОМ 1 hPortDat = CreateFile («COM1», GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hPortDat == INVALID_HANDLE_VALUE)//если порт не удалось открыть < CloseHandle (hPortDat); return false;//выходим из функции с ошибкой >//настраиваем параметры порта dcb.BaudRate = CBR_19200;//скорость передачи dcb.ByteSize = 8;//размер передачи dcb.StopBits = ONESTOPBIT;//один стоповый бит dcb.Parity = NULL; //проверяем на правильность настройки if ( !SetCommState ( hPortDat, CloseHandle (hPortDat); return false;//выходим из функции с ошибкой >//если все выполнилось то возвращаем положительный результат return true; > //—————————————————- //функция чтения одного байта данных BYTE ReadByteCOM () < if (InnitPort ()) < BYTE read = 0; DWORD dwByteRead = 0; do while (!dwByteRead); return read;//возвращаем данные > else < return 0xFF; >> //—————————————————— //функция чтения одного байта данных bool WriteByteCOM (char bufer) < if (InnitPort ()) < DWORD dwByteWrite = 0; if (!WriteFile(hPortDat, dwByteWrite, NULL)) return true;//возвращаем сведение о выполнении > else < return false; >> //============================================= //функция чтения массива данных //============================================= //============================================= //============================================= public: //общая функция для работы с портом void GeneralCOMRead () < //проверяем сигнал в линии if (dwSignal //читаем байт из порта Data = ReadByteCOM (); //сохраняем байт куда-либо >> //——————————————————— void GeneralCOMWrite (char InData) < //проверяем сигнал в линии if (dwSignal //пердаем байт из вне и записываем его в порт WriteByteCOM (InData); >> //——————————————————— void CloseCOM () < if (over.hEvent) < CloseHandle (over.hEvent);//закрываем объект событие >if (hPortDat) < CloseHandle (hPortDat); hPortDat = NULL; >> >; #pragma package(smart_init)
всему свое время как зиме и весне
💬 Как передавать и принимать данные из Arduino в компьютер и обратно? Очень просто!
Уроки Arduino #2 — работа с монитором COM порта
и каждому солнцу свой неба кусок
Последний раз редактировалось Assemblerru; 11.08.2010 в 19:35 .
Пользователь
Регистрация: 03.08.2010
Сообщений: 11
С данным кодом считать нормально не получилось. Сделал по-своему:
HANDLE hCom = CreateFile(«Com1»,GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, 0, NULL);
if( hCom == INVALID_HANDLE_VALUE )
ShowMessage(«Com port error»);
CloseHandle(hCom);
> //if ( hCom == INVALID_HANDLE_VALUE )
else
DCB dcb;
GetCommState(hCom,
dcb.BaudRate = CBR_9600;
dcb.fParity = false;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT ;
SetCommState(hCom,
DWORD feedback = 0;
char buf[32];
ReadFile(hCom, buf, sizeof(buf),
CloseHandle(hCom);
>
Считывание происходит в массив char buf[32].
Пользователь
Регистрация: 03.08.2010
Сообщений: 11
В предыдущем сообщении я выложил отрывок своего кода для считывания данных с ком-порта RS232. Все работает правильно, но очень медленно. Отрывок
ReadFile(hCom, buf, sizeof(buf),
CloseHandle(hCom);
выполняется от 0,3 до 1 секунды. Кто-то знает почему так долго? Остальная часть кода(поиск нужной части полученных данных, перевод их в реальное число и построение графика) выполняется за 0,012с, так что тугость машины отбрасываем. Это связано с тем что это ком-порт? Или функция рид файл такая тугая?
Есть ли какая-нибудь альтернатива(похожая функция или надо на ЮСБ перепаивать)?
Источник: www.programmersforum.ru
Федоренко на связи
Работа с COM портом под Linux, используя сигналы Qt
Эта статья описывает один из вариантов работы с COM портом в асинхронном режиме.
Поскольку для QT я не нашёл подходящего мне инструментария, решено было написать свои классы работы с COM портом.
Предположим, что у нас есть некоторое устройство, которое может асинхронно передавать и принимать данные.
class Device
{
protected :
IOPort * m_ioport ; // порт для устройства
public :
virtual void NewData ( unsigned char * data, int len ) ;
virtual bool MakeData ( unsigned char * data, int * len ) ;
} ;
Функция NewData будет вызываться по приходу пакета новых данных из COM порта. MakeData — будет периодически вызываться у класа прибора для опроса новых данных. Если данные для отправки есть — функция возвращает true, и заполняет массив data данными для отправки.
Наследуя своё устройство MyDevice от класса Device, и описав свои функции NewData и MakeData можно сделать нечто подобное:
int main ( int argc, char * argv [ ] )
{
QCoreApplication a ( argc, argv ) ;
MyDevice dev ;
dev. CreatePort ( «/dev/ttyS0» ) ;
Устройство dev будет жить своей жизнью, используя два треда. В одном будут формироваться данные на отправку, а во втором будут приниматься и разбираться входные данные.
Особенностью реализации класса COM-порта в Linux является, организация чтения из порта по приходу сигнала SIGIO. Для этого создан класс-нотификатор, который преобразует сигналы ядра SIGIO в сигналы QT. Каждый COM-порт подключается к данному QT-сигналу и получает оповещения о приходе нового символа из COM порта.
В исходниках выложена непроверенная реализация COM-портов и для Windows.
Источник: feser.ru
COM-порт. Опрос и вывод данных на JAVA. Шаг №46
Всем привет. Итак как Вы помните в предыдущей статье мы разобрали создание простого оконного приложения на Java, а именно окно, кнопку и текстовое поле. В этой статье мы научимся мониторить (слушать) COM-порт (последовательный или RS-232), встроим код в предыдущую программу (прошлой статьи) и выведем данные контроллера сбора данных уже в нашу программу: (как в статье №42, только на терминал) в текстовое поле оконного приложения по нажатию на кнопку.
Для работы с COM-портом существуют такие библиотеки, как javax.com, rxtx, giovynet, jssc. Я использовал последнюю. Итак что же такое JSSC (Java Simple serial Connector) – Java библиотека для простой работы с COM-портом, которая распространяется с 2010 года под лицензией LGPL. Библиотека скачивается архивным файлом расширением.jar и содержит в себе 7- классов, динамическую библиотеку под операционную систему. Для запуска, библиотеку необходимо подключить в Eclipse следующим образом: в меню Eclipse -> выбираем вкладку Project –> Properties –> Java Build Path –> Add External JARs –> jssc.jar. Так при неправильно подключенной библиотеки очень часто происходит похожая ошибка:
Exception in thread «main» java.lang.UnsatisfiedLinkError: jssc.SerialNativeInterface.getSerialPortNames ()
Что говорит о том что не работает метод OpenPort. На рисунке ниже у нас положительный результат подключения библиотеки JSSC, в проводнике проекта, слева, а также результат небольшой программы по получению списка портов программы в виде массива строк методом getPortNames () класса SerialPortList. Данная библиотека не ведет опрос всех подряд портов, а берет данные из реестра
Если программа запускается из консоли, то необходимо перейти в директорию с программой и оттуда непосредственно производить запуск – jar jssc – файл.java. Либо библиотеку положить в директорию bin Java –машины.
Далее приведен код чтения данных из порта на java:
import jssc.SerialPort; /*Импорт классов библиотеки jssc*/
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
На рисунке ниже результат вывода данных с порта на консоль Eclipse (обведенно красным). Теперь дополняем выше приведенный код, созданием окна, кнопки и текстового поля. Т.е. используем программу из предыдущей статьи. На рисунке ниже также вывод данных на консоль и в оконное приложение, а именно в текстовое поле метки. Здесь небольшая не доработка, где видно, что данные выводятся не на полную ширину поля, но самое главное мы добились поставленной цели, а именно чтение данных.
Исходник оконного приложения, с чтением данных из порта по нажатию на кнопку и вывод в текстовое поле.
В следующей статье мы с вами рассмотрим как сохранять информацию в текстовый файл, откуда потом сохраним ее в базу данных.
В качестве примера взаимодействия БД и приложения смотри SQLite JDBC for JavaFX . Скрин ниже.
Критика и дополнения приветствуются. Данная программа не претендует на «эталон качества». Здесь главной целью, как и всего проекта блога, является первые шаги в прикладном программировании в данном случае уже на Java. На этом мы сегодня и остановимся. Всем пока.
Источник: www.ap-impulse.com