|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.05.2010, 12:43 | #1 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
работа с портом
вообще то у меня несколько вопросом;
1 вопрос я инициализирую порт //объявим структуру для конфигурации СОМ порта DCB dcb; //дескриптор порта HANDLE hCom_1 = NULL; //открываем порт СОМ 1 hCom_1 = CreateFile ("COM1", GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hCom_1 == INVALID_HANDLE_VALUE)//если порт не удалось открыть { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //настраиваем параметры порта dcb.BaudRate = CBR_19200;//скорость передачи dcb.ByteSize = 8;//размер передачи dcb.StopBits = ONESTOPBIT;//один стоповый бит А как указать на проверку четности и как от нее отказаться 2 вопрос как все это проделать для ЛПТ порта
всему свое время как зиме и весне
и каждому солнцу свой неба кусок |
02.05.2010, 19:33 | #2 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
посматрите код почему он возвращает мне ошибку:
подключаемый файл с функциями; #include <windows.h> //--------------------------------------------------------------------------- //объявим структуру для конфигурации СОМ порта DCB dcb; //дескриптор порта HANDLE hCom_1 = NULL; //для выделения сигнала DWORD dwSignal; //объявим структуру для асинхронной работы порта OVERLAPPED over; //--------------------------------------------------------------------------- //пишим функцию инициализации порта СОМ1 bool InnitPort () { //открываем порт СОМ 1 hCom_1 = CreateFile ("COM1", GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hCom_1 == INVALID_HANDLE_VALUE)//если порт не удалось открыть { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //настраиваем параметры порта dcb.BaudRate = CBR_19200;//скорость передачи dcb.ByteSize = 8;//размер передачи dcb.StopBits = ONESTOPBIT;//один стоповый бит dcb.Parity = NULL; //проверяем на правильность настройки if ( !SetCommState ( hCom_1, &dcb)) //тоже не работает.... { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //если все выполнилось то возвращаем положительный результат return true; } //--------------------------------------------------------------------------- //функция чтения одного байта данных bool WriteByteCOM (char bufer) { if (InnitPort () == true) { DWORD dwByteWrite = 0; if (!WriteFile(hCom_1, &bufer, sizeof(char), &dwByteWrite, NULL)) {return 0;} return true;//возвращаем сведение о выполнении } else { return false;} } //--------------------------------------------------------------------------- //функция для записи одного байта char ReadByte_COM () { if (InnitPort () == true) { char bufer = 0x00; DWORD dwByteWrite = 0; do {//читаем байт из порта if (!ReadFile (hCom_1, &bufer, sizeof (char), &dwByteWrite, NULL)) {return 0;} } while (!dwSignal); return bufer; } else { return 0xFF; } } //--------------------------------------------------------------------------- void CloseCOM () { if (over.hEvent) { CloseHandle (over.hEvent);//закрываем объект событие } if (hCom_1) { CloseHandle (hCom_1); hCom_1 = NULL; } } ============================ рабочий файл: void __fastcall TForm1::Button1Click(TObject *Sender) { if ( InnitPort ()) { Label1 ->Caption = "работает"; } else { Label1 ->Caption = "ашипка"; } if ( WriteByteCOM (0xFF)) { Label1 ->Caption = "работает"; } else { Label1 ->Caption = "ашипка";//возрашает именно эту строку с ошибкой } CloseCOM (); }
всему свое время как зиме и весне
и каждому солнцу свой неба кусок Последний раз редактировалось Assemblerru; 02.05.2010 в 19:35. |
02.05.2010, 20:31 | #3 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
1- ответ:
Код:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
03.05.2010, 21:59 | #4 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
а теперь как этим кодом воспользовться если через функции
bool WriteByteCOM (char bufer) { DWORD dwByteWrite = 0; if (!WriteFile(hCom_1, &bufer, sizeof(char), &dwByteWrite, NULL)) {return 0;} return true;//возвращаем сведение о выполнении }
всему свое время как зиме и весне
и каждому солнцу свой неба кусок |
03.05.2010, 22:21 | #5 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
Код:
Код:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
04.05.2010, 13:26 | #6 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
Ну а на С++ как это перевести
всему свое время как зиме и весне
и каждому солнцу свой неба кусок |
04.05.2010, 13:51 | #7 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...а чего тут переводить, у вас же выше все написано, API он и в африке API вам нужно было всего-лишь правильно заполнить структуру DCB/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
04.05.2010, 21:12 | #8 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
А всетаки посмотрите мой код который я написал:
//объявляем переменные и новый класс: #include <vcl.h> #pragma hdrstop #include <windows.h> //объявим структуру для конфигурации СОМ порта DCB dcb; //дескриптор порта HANDLE hCom_1 = NULL; //для выделения сигнала DWORD dwSignal; //объявим структуру для асинхронной работы порта OVERLAPPED over; //---------------------------------------------------------------- class MuClDataOutPort { private: //пишим функцию инициализации порта СОМ1 bool InnitPort (char* DataPort) { //открываем порт СОМ 1 hCom_1 = CreateFile (DataPort, GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hCom_1 == INVALID_HANDLE_VALUE)//если порт не удалось открыть { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //настраиваем параметры порта dcb.BaudRate = CBR_19200;//скорость передачи dcb.ByteSize = 8;//размер передачи dcb.StopBits = ONESTOPBIT;//один стоповый бит dcb.Parity = NULL; //проверяем на правильность настройки if ( !SetCommState ( hCom_1, &dcb)) //тоже не работает.... { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //если все выполнилось то возвращаем положительный результат return true; } public: //функция чтения одного байта данных bool WriteByte (unsigned char bufer, char* Data) { if (InnitPort (Data)) { DWORD dwByteWrite = 0; if (!WriteFile(hCom_1, &bufer, sizeof(char), &dwByteWrite, NULL)) {return false;} return true;//возвращаем сведение о выполнении } else { return false;} } }; #pragma package(smart_init) =================================== в другом приложении используем методы класса: =================================== #include "С\..."//типа путь к файлу где описан класс MuClDataOutPort myClass; //а теперь по событию нажатия кнопки расположенной на форме пишим следующий код: void __fastcall TForm1::Button1Click(TObject *Sender) { if (myClass.WriteByte (0x12, "COM1")) { Label1 ->Caption = "ура работает"; return; } Label1 ->Caption = "ашипка"; myClass.ClosePort(); } //---------------------------------------------------------------- Мой вопрос почему почему в метку выводится Label1 ->Caption = "ашипка";вроде все правильно описал //----------------------------------------------------------------
всему свое время как зиме и весне
и каждому солнцу свой неба кусок |
04.05.2010, 21:39 | #9 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...начнем с того, чтобы не заморачиваться с заполнением структуры DCB, это можно поручить самой системе через GetCommState()
Код:
Код:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation Последний раз редактировалось raxp; 04.05.2010 в 21:48. |
05.05.2010, 17:35 | #10 |
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
|
А посмотрите еше вот что он работает и не выдает ошибок... Мне кажится что удалось собрать сведения о работе порта.
#include <windows.h> char Data; //================================== //глобальные переменные //------------------------------------------ //объявим структуру для конфигурации СОМ порта DCB dcb; /* ZeroMemory (&dcb, sizeof (DCB));// не знает что ето такое //дескриптор порта */ HANDLE hCom_1 = NULL; //------------------------------------------ //объявим структуру для асинхронной работы порта OVERLAPPED over; //------------------------------------------ //для выделения сигнала DWORD dwSignal; //пишим функцию инициализации порта СОМ1 bool Innit_COM1 () { //открываем порт СОМ 1 hCom_1 = CreateFile ("COM1", GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hCom_1 == INVALID_HANDLE_VALUE)//если порт не удалось открыть { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //настраиваем параметры порта dcb.BaudRate = CBR_19200;//скорость передачи dcb.ByteSize = 8;//размер передачи dcb.StopBits = ONESTOPBIT;//один стоповый бит dcb.Parity = NULL; //проверяем на правильность настройки if ( !SetCommState ( hCom_1, &dcb)) //тоже не работает.... { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //если все выполнилось то возвращаем положительный результат return true; } /*Теперь когда порт открыт и настроен, нужно настроить обработку сигналов DSR и CTS. */ //пишим функцию настройки событий bool SetEventCOM () { //настраиваем мониторинг порта if (!SetCommMask (hCom_1, EV_DSR|EV_CTS)) //если не удалось настроить порт { CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //создаем объект событие over.hEvent = CreateEvent ( NULL, FALSE, FALSE, NULL); if (over.hEvent) { //при неудачи выходим из функции с ошибкой CloseHandle (hCom_1); return false;//выходим из функции с ошибкой } //если все выполнилось то возвращаем положительный результат return true; } //функция чтения одного байта данных BYTE ReadByteCOM () { BYTE read = 0; DWORD dwByteRead = 0; do {//читаем байт из порта if (!ReadFile (hCom_1, &read, sizeof (BYTE), &dwByteRead, NULL)) {return 0;} } while (!dwByteRead); return read;//возвращаем данные } //=================================== ========== //функция чтения массива данных //=================================== ========== //функция чтения одного байта данных bool WriteByteCOM (char bufer) { DWORD dwByteWrite = 0; if (!WriteFile(hCom_1, &bufer, sizeof(char), &dwByteWrite, NULL)) {return 0;} return true;//возвращаем сведение о выполнении } //функция для записи одного байта char ReadByte_COM () { char bufer = 0x00; DWORD dwByteWrite = 0; do {//читаем байт из порта if (!ReadFile (hCom_1, &bufer, sizeof (char), &dwByteWrite, NULL)) {return 0;} } while (!dwSignal); return bufer; } //общая функция для работы с портом void GeneralCOMRead () { //проверяем сигнал в линии if (dwSignal & EV_DSR)//данные готовы для чтения { //читаем байт из порта Data = ReadByte_COM (); //сохраняем байт куда-либо } } void GeneralCOMWrite () { //проверяем сигнал в линии if (dwSignal & EV_CTS)//данные готовы для записи { //пердаем байт из вне и записываем его в порт WriteByteCOM (Data); } } void CloseCOM () { if (over.hEvent) { CloseHandle (over.hEvent);//закрываем объект событие } if (hCom_1) { CloseHandle (hCom_1); hCom_1 = NULL; } }
всему свое время как зиме и весне
и каждому солнцу свой неба кусок |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с com портом | Валера777 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 05.12.2009 00:06 |
Работа с com портом | albles | Общие вопросы C/C++ | 2 | 16.11.2009 15:15 |
Работа c COM-портом | doniyor | Общие вопросы Delphi | 12 | 27.07.2009 11:16 |
Работа с COM-портом | jovanny | Помощь студентам | 2 | 03.05.2009 18:06 |
работа с COM портом | ShAzat | Общие вопросы Delphi | 8 | 28.05.2008 20:08 |