Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> com порт, чтение и запись строки 
V
    Опции темы
barin_Student
Дата 31.10.2008, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Я прочитал все темы по поиску , их целых 3 страницы , но нужного результата я не нашел,
Открываю , читаю и пишу в Com порт стандартными средствами CreateFile ReadFile WriteFile, читал хелп встроенный в СиБилдер , но в си я еще не соображаю , пришел в си из явы. 
Проблемы такова , мне нужно  записать строку в порт(это выходит) и получить респонс(ответ) от модема , тоже в виде строки.
Вид строки :
"at" 
(byte)0x0d// инициализация нажатия клавиши ENTER
ответ должен быть вида
"OK"// смотрел в сторону stringstream , но пока не вышло 
Но не выходит, можете пожалуйста помочь , просто примерчик , а дальше с остальными аспектами работы с модемом я сам разберусь..
заранее спасибо за помощью smile 
 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Dem_max
Дата 31.10.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
barin_Student
Дата 3.11.2008, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Посмотрел я ссылки , но мне бы хотелось увидить простой примитив отправки строки в порт и получения строки от порта, с использованием ReadFile WriteFile ,
ПС поиском пользовался , но там примеры узких задач , строками никто не оперировал. smile 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
barin_Student
Дата 3.11.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Понял в чем у меня сложность , счас точный вопрос сформулирую:
Какая фунция реализует вот такие вещи(пример на java написан):
Код

InputStream in = port.getInputStream();
byte[] buff = new byte[in.aviable];//помойму так пишется

Вопщем я не знаю какое количество байт ко мне прийдет , какая фунция говорит , что чтение закончилось, или ожидайте к примеру 20 байт , чтоб в ReadFile , в поле по количеству чтения выставить точной количество байт ответа с ком порта smile , помойму вот так вопрос звучит?!


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
ama_kid
Дата 4.11.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(barin_Student @  3.11.2008,  13:50 Найти цитируемый пост)
Вопщем я не знаю какое количество байт ко мне прийдет , какая фунция говорит , что чтение закончилось, или ожидайте к примеру 20 байт , чтоб в ReadFile , в поле по количеству чтения выставить точной количество байт ответа с ком порта
функция ClearCommError выдаст тебе требуемое число несчитанных байт...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
barin_Student
Дата 6.11.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Делаю так , но не работает..
Код

TComStat statusBytes ;
 long AviableBytes =statusBytes.cbInQue;
                 ShowMessage("BytesAviable:"+(AnsiString)AviableBytes);

Все что связанно с ссылками не получилось. smile 
Какой еще вариант есть? 

Это сообщение отредактировал(а) barin_Student - 6.11.2008, 07:53


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
smoke_man
Дата 6.11.2008, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 5
Всего: 17



Вот пример настройки, посылки данных и приема из порта
Код


      //Посылаемые данные в порт
       unsigned char *buff = "at";
       //Буфер под данные из порта 
        char *Inbuff = new char[255];
       //Количесвто записанных байт в порт и прочитанных из порта
       int WritingByte = 0, ReadByte = 0;
       //Таймаут на прием
        int notanswer = 10000;
        //Струкутра состояния порта
       _COMSTAT st;
       //Структура настройки порта
        DCB dcb;
       //Таймаут порта
        COMMTIMEOUTS timeouts = {MAXDWORD,MAXDWORD,600,0,0};
        //Открываем com-порт 1
        HANDLE ComHandle=CreateFileA("\\\\.\\COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 
        if (ComHandle == INVALID_HANDLE_VALUE)
        {
                
                MessageBoxA(NULL,"Порт не создан","!",MB_OK);
                delete Inbuff;

                return;
        }
        //После открытия настраиваем его
        SetupComm(ComHandle,1024,1024);
        SetCommTimeouts(ComHandle,&timeouts);
        GetCommState(ComHandle,&dcb);
        dcb.DCBlength = sizeof(dcb);
        dcb.BaudRate= 57600;
        dcb.fParity = FALSE;
        dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;

        dcb.fBinary = TRUE;
        dcb.fOutxCtsFlow = FALSE;
        dcb.fOutxDsrFlow = FALSE;
        dcb.fDtrControl = DTR_CONTROL_ENABLE;
        dcb.fDsrSensitivity = FALSE;
        dcb.fOutX = FALSE;
        dcb.fInX = FALSE;
        dcb.fNull = FALSE;
        dcb.fRtsControl = RTS_CONTROL_DISABLE;
        dcb.fAbortOnError = TRUE;

        dcb.StopBits = ONESTOPBIT;
       //Устанавливаем настройки
        SetCommState(ComHandle,&dcb);

        EscapeCommFunction(ComHandle, SETRTS);
        EscapeCommFunction(ComHandle, SETDTR);
       //Сбрасываем ошибки
        ClearCommError(ComHandle,&portErr,NULL);
        PurgeComm(ComHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
    
        
       //ПИшем в порт 2  байта
        WriteFile(ComHandle,buff,2,&WritingByte,NULL);
       if(WritingByte == 0)
       {
               MessageBoxA(NULL,"Ошибка записи","!",MB_OK);
               delete Inbuff;

               return;
      }
     //Принимаем данные из порта
      while(count<=0)
       {
        ClearCommError(ComHandle,&portErr,&st);
        //Считываем количесво принятых байт
        count = st.cbInQue;
        //Проверяем наш таймаут
        if(notanswer == 0)
        {
               
                MessageBoxA(NULL,"Нет ответа","!",MB_OK);
                delete Inbuff;
                return;
        }
        if(count<=0)
        {
                notanswer--;
                continue;
         }
        //Если данные есть в порте читаем их и выходи из цикла приема
         ReadFile(ComHandle,Inbuff,count,&ReadByte,NULL);
        break;
       }


Это сообщение отредактировал(а) smoke_man - 6.11.2008, 08:51


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
barin_Student
Дата 6.11.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Я дико извиняюсь , но в примере есть две переменные которые не объявлены это:
portErr - поидее тип должен быть DWORD , но ведь такого нет в Си (в описаниях не нашел)
count - думаю int'ом объявить?


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
smoke_man
Дата 6.11.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 5
Всего: 17



Извиняюсь...не заметил
Код

      //Это вместо DWORD
      unsigned long int portErr      = 0;
      int count = 0;


Добавлено через 4 минуты и 57 секунд
Если нужно могу дать готовый модуль на С++ для работы с портом.

Это сообщение отредактировал(а) smoke_man - 6.11.2008, 09:16


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
barin_Student
Дата 6.11.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



От модуля не откажусь smile ,
Спасибо Вам за помощь, +1 к репутации. smile 
Тема закрыта , код с достойным описание очень сильно помог. smile 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
smoke_man
Дата 6.11.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 5
Всего: 17



Вот модуль для рабты с ком-портом. Описание прилагается.

Присоединённый файл ( Кол-во скачиваний: 38 )
Присоединённый файл  ComPort.zip 16,84 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.