На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (8) 1 [2] 3 4 ...  7 8 все  ( Перейти к последнему сообщению )  
> Visual Studio 2008 + COM Port
    кто-то не читает, что ему пишут, например, в посте #6
    http://stackoverflow.com/questions/1159094...r-of-serialport
      Спасибо. Понял. Пробую так http://stackoverflow.com/questions/1077536...m-a-thread-othe Только у меня очевидно проблемы с синтаксисом в VisualStudio2008
      ExpandedWrap disabled
        delegate void SetTextCallback(string text);
         
        private: System::Void  SetText(string text)
        {
          // InvokeRequired required compares the thread ID of the
          // calling thread to the thread ID of the creating thread.
          // If these threads are different, it returns true.
          if (this->textBox2->InvokeRequired)
          {
            SetTextCallback d = new SetTextCallback(SetText);
            this->Invoke(d, new object[] { text });
          }
          else
          {
            this->textBox2->Text = text;
          }
        }
         
        private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e)
                 {
                    txt += serialPort1.ReadExisting().ToString();
                    SetText(txt.ToString());
                 }

      Такой код выдает ошибки
      ExpandedWrap disabled
        Error   1   error C3149: 'AmuleTest::Form1::SetTextCallback' : cannot use this type here without a top-level '^'    d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 984 AmuleTest
        Error   2   error C3867: 'AmuleTest::Form1::SetText': function call missing argument list; use '&AmuleTest::Form1::SetText' to create a pointer to member   d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 984 AmuleTest
        Error   3   error C2750: 'AmuleTest::Form1::SetTextCallback' : cannot use 'new' on the reference type; use 'gcnew' instead  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 984 AmuleTest
        Error   4   error C3350: 'AmuleTest::Form1::SetTextCallback' : a delegate constructor expects 2 argument(s) d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 984 AmuleTest
        Error   5   error C2061: syntax error : identifier 'object' d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 985 AmuleTest
        Error   6   error C2143: syntax error : missing ')' before '{'  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 985 AmuleTest
        Error   7   error C2143: syntax error : missing ';' before '{'  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 985 AmuleTest
        Error   8   error C2143: syntax error : missing ';' before '}'  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 985 AmuleTest
        Error   9   error C2059: syntax error : ')' d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 985 AmuleTest
        Error   10  error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)' : cannot convert parameter 1 from 'std::string' to 'System::String ^'  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 989 AmuleTest
        Error   11  error C2065: 'txt' : undeclared identifier  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 995 AmuleTest
        Error   12  error C2228: left of '.ReadExisting' must have class/struct/union   d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 995 AmuleTest
        Error   13  error C2228: left of '.ToString' must have class/struct/union   d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 995 AmuleTest
        Error   14  error C2065: 'txt' : undeclared identifier  d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 996 AmuleTest
        Error   15  error C2228: left of '.ToString' must have class/struct/union   d:\mydesignsxp\visualstprj\visualc++prj\amuletest\amuletest\Form1.h 996 AmuleTest
        ну ты и чайник :D
          Сделал небольшой тест на C#
          ExpandedWrap disabled
            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.Data;
            using System.Drawing;
            using System.Linq;
            using System.Text;
            using System.Windows.Forms;
            using System.Threading;
             
            namespace CrossThreadDemo
            {
                public partial class Form1 : Form
                {
                    String txt;
                    int counterRP;
             
                    void ComSetings(){
             
                        this.serialPort1.BaudRate = 115200;
                        this.serialPort1.PortName = "COM1";
                        this.serialPort1.ReadBufferSize = 4800;
             
                        try{
                            this.serialPort1.Open();
                            this.label1.BackColor = System.Drawing.Color.Green;
             
                        }
                        catch
                        {
                            this.label1.BackColor = System.Drawing.Color.Red;
                        }
                    }
             
                    void StopCom(){
                        this.serialPort1.Close();
                        this.label1.BackColor = System.Drawing.Color.Red;
                    }
             
                    delegate void SetTextCallback(string text);
             
                    private void SetText(string text)
                    {
                        // InvokeRequired required compares the thread ID of the
                        // calling thread to the thread ID of the creating thread.
                        // If these threads are different, it returns true.
                        if (this.textBox1.InvokeRequired)
                        {
                            SetTextCallback d = new SetTextCallback(SetText);
                            this.Invoke(d, new object[] { text });
                        }
                        else
                        {
                            this.textBox1.Text = text;
                        }
                    }
                    public Form1()
                    {
                        InitializeComponent();
                    }
             
                    private void Form1_Load(object sender, EventArgs e)
                    {
             
                    }
             
                    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
                    {
                        txt = serialPort1.ReadExisting().ToString();
                        SetText(txt);
                    }
             
                    private void button1_Click(object sender, EventArgs e)
                    {
                        ComSetings();
                    }
             
                    private void button2_Click(object sender, EventArgs e)
                    {
                        StopCom();
                    }
                }
            }

          Работает. В окне textBox1 передаваемая строка. Но опять проблема. Как теперь в окне textBox1 показать принимаемые данные в HEX виде, примерно так как в программе на Builder
          Прикреплённая картинка
          Прикреплённая картинка

          Еще загвоздка. Как по собитию прихода очередного байта получить количество уже пришедших на порт байт?
          WinApi это просто
          ExpandedWrap disabled
                   //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
                  if(GetOverlappedResult(COMport, &overlapped, &temp, true))
                  {
                    //если произошло именно событие прихода байта
                    if((mask & EV_RXCHAR)!=0)
                    {
                      // нужно заполнить структуру COMSTAT
                      ClearCommError(COMport, &temp, &comstat);
                      // и получить из неё количество принятых байтов
                      btr = comstat.cbInQue;
                      // если действительно есть байты для чтения
                      if(btr)
                      {
                        // прочитать байты из порта в буфер программы
                        ReadFile(COMport, bufrd, btr, &temp, &overlapped);
                        // увеличиваем счётчик байтов
                        counterRX+=btr;
                        // вызываем функцию для вывода данных на экран
                        ReadPrinting(btr);
                      }
                    }
                  }
          Сообщение отредактировано: Acvarif -
            да какой С# здесь раздел Visual С++ MFC :D
            я твой пример тупо копипаст + MFC и все :D
              Копипаст это как? Что такое копипаст?
              Поясните пожалуйста.
              Это типа ворованный код?
              Код проги на Builder мой Прикреплённый файлПрикреплённый файлTest.rar (11,68 Кбайт, скачиваний: 72) . Прога работает без проблем, кроме одной - тяжело работать с графикой OpenGl. Поэтому пытаюсь перевести все в VisualStudio. C# или C++ без разницы. Если у Вас имеется пример как в Visual Studio работать с VinApi и COM портом могли-бы поделиться...
              Сообщение отредактировано: Acvarif -
                Цитата Acvarif @
                Еще загвоздка. Как по собитию прихода очередного байта получить количество уже пришедших на порт байт?
                WinApi это просто
                ExpandedWrap disabled
                         //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
                        if(GetOverlappedResult(COMport, &overlapped, &temp, true))
                        {
                          //если произошло именно событие прихода байта
                          if((mask & EV_RXCHAR)!=0)
                          {
                            // нужно заполнить структуру COMSTAT
                            ClearCommError(COMport, &temp, &comstat);
                            // и получить из неё количество принятых байтов
                            btr = comstat.cbInQue;
                            // если действительно есть байты для чтения
                            if(btr)
                            {
                              // прочитать байты из порта в буфер программы
                              ReadFile(COMport, bufrd, btr, &temp, &overlapped);
                              // увеличиваем счётчик байтов
                              counterRX+=btr;
                              // вызываем функцию для вывода данных на экран
                              ReadPrinting(btr);
                            }
                          }
                        }

                Нет.
                Содержимое "overlapped" структуры прямо указывает на переданное количество байт.
                "GetOverlappedResult" потрошит эту структуру, хотя это можно было делать и вручную.

                Но поскольку конкретная структура использовалась для операции чтения, значит
                "GetOverlappedResult(COMport, &overlapped, &Bytes, true)"
                сразу передаёт число полученных байт, готовых для чтения.
                Дальше:
                ExpandedWrap disabled
                  if(Bytes)
                  {
                   // ...
                   /// добываем данные - в указанном операцией ReadFile (выполненной ранее) буфере
                   /// есть количество "Bytes" байт, полученных с порта
                   
                  }
                  Спасибо. Понятно. Можно и так попробовать. В любом случае код Builder6 + WinApi работает без проблем. Перенос кода на VisualStudio нужен для дальнейшей работы с GLUT. На Builder6 с этим делом неважно. Поэтому и прощупываю варианты. Вариант с serialPort на первый взгляд работает. Но опять уткнулся в проблему подсчета и отображения принятых байт в HEX виде в окне textBox. Хотя строку принимает и отображает как надо. По ходу еще проблема как очищать окно textBox перед очередным приемом пакета байт. (период прихода пакетов 1 сек.)

                  И все же главный вопрос. Можно-ли в VisualStudio использовать непосредственно функции WaitCommEvent(COMport, &mask, &overlapped) GetOverlappedResult(COMport, &overlapped, &Bytes, true); и им подобные? Если да то несколько слов о том как. Какой вид проекта для этого закладывать WindowsForm C++, MFC, win32... ?
                  Сообщение отредактировано: Acvarif -
                    Цитата Acvarif @
                    И все же главный вопрос. Можно-ли в VisualStudio использовать непосредственно функции WaitCommEvent(COMport, &mask, &overlapped) GetOverlappedResult(COMport, &overlapped, &Bytes, true); и им подобные? Если да то несколько слов о том как. Какой вид проекта для этого закладывать WindowsForm C++, MFC, win32... ?

                    Естествено это же Win32 API! MFC в зубы и вперед с песней! :D
                    WinForms это для .NET и C#
                      В зубы это да. Какую библиотеку подключить? Куда подключить? Можно несколько слов, коротко, по шагам.
                        Цитата Acvarif @
                        И все же главный вопрос. Можно-ли в VisualStudio использовать непосредственно функции WaitCommEvent(COMport, &mask, &overlapped) GetOverlappedResult(COMport, &overlapped, &Bytes, true); и им подобные? Если да то несколько слов о том как. Какой вид проекта для этого закладывать WindowsForm C++, MFC, win32... ?

                        Да, конечно можно.
                        Только "WaitCommEvent" практически не нужна.

                        Для ожидания событий достаточно использовать штатные
                        функции ожидания Виндус.
                        Общая схема такая:
                        1. Открываем порт в режиме "OVERLAPPED"
                        2. Заполняем все какие надо структуры, программируем ими порт.
                        3. Не забываем создать объекты-эвенты.
                        4. Хэндлы этих объектов заносятся в OVERLAPPED-структуру перед
                        выполнением конкретной операции (чтения или записи).
                        5. Дальше эти хэндлы массивом отдаём "WaitForMultipleObjects".
                        6. Когда событие наступит, ожидание закончится. Запустим соотв. обработчик.
                        7. Распотрошим результат из OVERLAPPED-структуры и начнём всё сначала.

                        Как-то так. Одного потока более чем достаточно.
                        Почитай книгу Агурова.
                        Там хотя и на Паскале, но по API-вызовам понятно, что он делает.
                        ---
                        Лично я использую базовый класс COMM-порт, использующий WINAPI. (с++)
                        После изготовления он занесён в библиотеку, после чего о тонкостях его
                        функционирования можно забыть. Именно поэтому мой рассказ о том,
                        "как это работает" носит самый общий характер.
                        На его основе (наследуясь от него) делается класс COMM-порт для конкретных нужд
                        конкретного приложения.
                        Сообщение отредактировано: ЫукпШ -
                          Все примерно то же самое я уже делал в проге на Builder6. Правда потоков несколько. Может и лишнее. Все работает.
                          Я не врубаюсь как код с WINAPI прописать в Wisual Studio. Какой вид проекта для этого открыть MFC, WindovsForm, или...?
                          Собственно мой вопрос не по сути, а по технологии. С хендлами, событиями и т. п справлюсь.
                          Если начинать проект MFC то куда и чего прописывать
                          Напнример в Builder все прописывается в одном едиственном модуле c расширением .cpp
                          ExpandedWrap disabled
                            #include <vcl.h>
                            #pragma hdrstop
                             
                            #include "Unit1.h"
                            //---------------------------------------------------------------------------
                            #pragma package(smart_init)
                            #pragma resource "*.dfm"
                            #include <iostream>
                            #include <windows.h>
                            #include <stdio.h>
                            #include <Math.hpp>
                            #include <math.h>
                             
                            TForm1 *Form1;
                             
                            //---------------------------------------------------------------------------
                            // дефайны
                             
                            //ёмкость буфера приема
                            #define BUFSIZE_RD 5000
                            //ёмкость буфера передачи
                            #define BUFSIZE_WR 128
                             
                            //---------------------------------------------------------------------------
                            // дескрипторы
                             
                            HANDLE COMport;
                            HANDLE writer;
                            HANDLE reader;
                            HANDLE main;
                             
                            ///будем использовать для операций чтения (см. поток ReadThread)
                            OVERLAPPED overlapped;
                            //будем использовать для операций записи (см. поток WriteThread)
                            OVERLAPPED overlappedwr;
                             
                            //---------------------------------------------------------------------------
                            // глобальные переменные
                             
                            // строка определения com порта
                            AnsiString com_port;
                             
                            // флаг приема
                            bool FlComRead;
                            // флаг цикла в потоке приема
                            bool flag;
                             
                            bool FlBeg;
                             
                            //приёмный и передающий буферы
                            unsigned char bufrd[BUFSIZE_RD], bufwr[BUFSIZE_WR];
                            // контрольная сумма пакета передачи
                            unsigned char TxBufCrc;
                            unsigned char PrCanal;
                            unsigned char PrSect;
                             
                            // счетчик приемов
                            unsigned int counterRX;
                            unsigned int counterTX;
                            unsigned int counterRP;
                            unsigned int Dist;
                            unsigned int Distm;
                             
                            // скорость бод
                            unsigned long BaudR;
                             
                            //---------------------------------------------------------------------------
                            __fastcall TForm1::TForm1(TComponent* Owner)
                                    : TForm(Owner)
                            {
                            }
                             
                            //---------------------------------------------------------------------------
                            // функции
                             
                            //---------------------------------------------------------------------------
                             
                            // задержка
                            void wait (int wt)
                            {
                              while (wt--);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Принятые байты в HEX
                             
                            void hexdumpstrRead ( char src[], size_t size)
                            {
                              Form1->Memo2->Clear();
                              static const char hex[] = "0123456789abcdef";
                              char *result = (char *)malloc((size > 0)? size*3: 1),
                                *p = result;
                             
                              if (result) {
                                while (size-- > 0) {
                                  *p++ = hex[(*src >> 4) & 0x0f];
                                  *p++ = hex[*src++ & 0x0f];
                                  *p++ = ' ';
                                }
                                p[(p > result)? -1: 0] = 0;
                              }
                              Form1->Memo2->Lines->Add(result);
                            }
                            //---------------------------------------------------------------------------
                            // Переданные байты в HEX
                             
                            void hexdumpstrWrite ( char src[], size_t size)
                            {
                              Form1->Memo1->Clear();
                              static const char hex[] = "0123456789abcdef";
                              char *result = (char *)malloc((size > 0)? size*3: 1),
                                *p = result;
                             
                              if (result) {
                                while (size-- > 0) {
                                  *p++ = hex[(*src >> 4) & 0x0f];
                                  *p++ = hex[*src++ & 0x0f];
                                  *p++ = ' ';
                                }
                                p[(p > result)? -1: 0] = 0;
                              }
                              Form1->Memo1->Lines->Add(result);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Вывод принятых байтов на экран
                             
                            void ReadPrinting(DWORD btr)
                            {
                              char Buffer[20];
                              unsigned int nb, tm;
                              String stroka, temp_str;
                              counterRP++;
                            //  sprintf(Buffer," %d", counterRP);
                            //  Form1->Label9->Caption = Buffer;
                             
                              // Перенос буфера в строку.
                              for(UINT32 i=0; i<btr ; i++)
                              {
                                stroka = stroka + IntToHex(bufrd[i], 2) + ' ';
                              }
                              // кличество принятых байт
                            //  Form1->Panel3->Caption = "Всего принято байт: " + IntToStr(counterRX);
                              // контрольные символы
                              for (UINT32 i = 0; i < sizeof(bufrd); i++)
                              {
                                if(bufrd[i] == 0xa1 && bufrd[i + 1] == 0xa2 && !FlBeg)
                                {
                                  FlBeg = 1;
                                  nb = ((bufrd[i + 2] << 8) | bufrd[i + 3]);
                                  sprintf(Buffer,"Кол. инфо байт в пакете: %d", nb);
                                  Form1->Panel2->Caption = Buffer;
                                  
                                  Form1->Memo2->Clear();
                            //      wait(30000000); // ЗАПЛАТКА.
                             
                                  if(Form1 -> CheckBox4 -> Checked)
                                    Sleep(100);
                                  else
                                    Sleep(400);
                             
                                  Form1->Panel1->Caption = "";
                             
                            //      if(!FlComRead) FlComRead = 1;
                                }
                                // определение последнего канала
                                else if(bufrd[i] == 0x55 && bufrd[i + 1] == 0xaa && bufrd[i + 3] == 0x75)
                                {
                                  //
                                  tm = bufrd[i + 6];
                            //      Sleep(100);
                            //      wait(300000); // ЗАПЛАТКА.
                                  if(!FlComRead) FlComRead = 1;
                                  break;
                                }
                              }
                              // количество принятых байт
                              Form1->Panel3->Caption = "Всего принято байт: " + IntToStr(counterRX);
                              // Вывод
                              Form1->Memo2->Lines->Add(stroka);
                              // Очистить буфер (чтобы данные не накладывались друг на друга).
                              memset(bufrd, 0, BUFSIZE_RD);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Поток чтения
                             
                            DWORD WINAPI ReadThread( LPVOID lpParam )
                            {
                              // буфер для вывода строк
                              char Buffer[20];
                              // структура текущего состояния порта,
                              // используется для определения количества принятых в порт байт
                              COMSTAT comstat;
                              // переменная temp используется в качестве заглушки
                              DWORD btr, temp, mask, signal;
                              // создать сигнальный объект-событие для асинхронных операций
                              overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
                              // установить маску на срабатывание по событию приёма байта в порт
                              SetCommMask(COMport, EV_RXCHAR);
                              // пока поток не будет прерван, выполняем цикл
                            //  while(1)
                              while(!flag)
                              {
                                //ожидать события приёма байта (это и есть перекрываемая операция)
                                WaitCommEvent(COMport, &mask, &overlapped);
                                //приостановить поток до прихода байта
                                signal = WaitForSingleObject(overlapped.hEvent, INFINITE);
                                //если событие прихода байта произошло
                                if(signal == WAIT_OBJECT_0)
                                {
                                  //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
                                  if(GetOverlappedResult(COMport, &overlapped, &temp, true))
                                  {
                                    //если произошло именно событие прихода байта
                                    if((mask & EV_RXCHAR)!=0)
                                    {
                            //          Sleep(10);
                                      // нужно заполнить структуру COMSTAT
                                      ClearCommError(COMport, &temp, &comstat);
                                      // и получить из неё количество принятых байтов
                                      btr = comstat.cbInQue;
                                      // если действительно есть байты для чтения
                                      if(btr)
                                      {
                            //            Sleep(10);
                                        // прочитать байты из порта в буфер программы
                                        ReadFile(COMport, bufrd, btr, &temp, &overlapped);
                                        // увеличиваем счётчик байтов
                                        counterRX+=btr;
                            //            sprintf(Buffer," %d", counterRX);
                            //            Form1->Label9->Caption = Buffer;
                                        // вызываем функцию для вывода данных на экран
                                        ReadPrinting(btr);
                            //            hexdumpstrRead(bufrd, 846);
                                      }
                                    }
                                  }
                                }
                              Sleep(1);
                              }
                              // таймаут потока
                            //  Sleep(1);
                              CloseHandle(overlapped.hEvent);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Поток записи WriteThread
                             
                            //главная функция потока, выполняет передачу байтов из буфера в COM-порт
                            DWORD WINAPI WriteThread(LPVOID lpParam)
                            {
                              CONST HANDLE hMutex = (CONST HANDLE)lpParam;
                             
                              // temp - переменная-заглушка
                              DWORD temp, signal;
                              // текущий рабочий буфер
                              char Buffer[20];
                             
                              //создать событие
                              overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);
                              while(1)
                              {
                                //очистить передающий буфер порта
                                PurgeComm(COMport, PURGE_TXCLEAR);
                                //записать байты в порт (перекрываемая операция!)
                            //    WriteFile(COMport, bufwr, strlen(bufwr), &temp, &overlappedwr);
                                WriteFile(COMport, bufwr, sizeof(bufwr), &temp, &overlappedwr);
                             
                                //приостановить поток, пока не завершится перекрываемая операция WriteFile
                                signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);
                             
                                //если операция завершилась успешно
                                if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true)))
                                {
                                  //вывести сообщение об этом в строке состояния
                                  sprintf(Buffer,"Передача  %d  прошла успешно", counterTX);
                                  Form1->Panel1->Caption = Buffer;
                                }
                                //иначе вывести в строке состояния сообщение об ошибке
                                else {Form1->Panel1->Caption = "Ошибка передачи";}
                                // Приостановить поток записи
                                SuspendThread(writer);
                              Sleep(1);
                              }
                              // таймаут в потоке
                            //  Sleep(1);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Поток main
                             
                            DWORD WINAPI MainThread(LPVOID lpParam)
                            {
                              // текущий рабочий буфер
                              char Buffer[20];
                             
                              while(1)
                              {
                                // если принят пакет
                                if(FlComRead)
                                {
                                  FlBeg = 0;
                                  FlComRead = 0;
                             
                                  sprintf(Buffer,"Дистанция: %d м", Distm);
                                  Form1->Label16->Caption = Buffer;
                             
                             
                                  // включение режима снятия характеристики
                                  if(Form1->CheckBox1 -> Checked)
                                  {
                                    bufwr[126] |= (1 << 7);
                                    Form1->CSpinEdit3->Enabled = true;
                                    Form1->CSpinEdit4->Enabled = true;
                                  }
                                  else
                                  {
                                    bufwr[126] &= ~(1 << 7);
                                    Form1->CSpinEdit3->Enabled = false;
                                    Form1->CSpinEdit4->Enabled = false;
                                  }
                             
                                  // включение режима снятия характеристики
                                  if(Form1->CheckBox2 -> Checked)
                                  {
                                    bufwr[123] |= (1 << 2);
                                    bufwr[126] = 80;
                                  }
                                  else
                                  {
                                    bufwr[123] &= ~(1 << 2);
                                  }
                             
                                  // контрольная сумма в 0
                                  TxBufCrc = 0;
                                    // подсчет контрольной суммы пакета управл.
                                    for(int i = 1; i < 127; i++)
                                    {
                                      TxBufCrc = TxBufCrc + bufwr[i];
                                      }
                                  // контрольная сумма упр. пакета
                                  bufwr[127] = TxBufCrc;
                                  // вывод управл пакета в Memo 1
                                  hexdumpstrWrite(bufwr,128);
                                  // номер передачи
                                  counterTX++;
                                  // количество принятых байт в 0
                                  counterRX = 0;
                                      //чтобы данные не накладывались друг на друга
                                  //очистить передающий буфер порта
                                  PurgeComm(COMport, PURGE_TXCLEAR);
                             
                                  // включение передачи
                                  if(Form1->CheckBox3 -> Checked)
                                  {
                                    //активировать поток записи данных в порт
                                    ResumeThread(writer);
                                  }
                                }
                              Sleep(1);
                              }
                              // таймаут в потоке
                            //  Sleep(1);
                            }
                             
                            //---------------------------------------------------------------------------
                            // Com установки
                             
                            void Com_Setting()
                            {
                              COMMTIMEOUTS timeouts;
                             
                              com_port += "\\\\.\\";  // com_port.c_str()
                              com_port += Form1->ComboBox1->Text;
                              COMport = CreateFile(Form1->ComboBox1->Text.c_str(),GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
                             
                              if(COMport==INVALID_HANDLE_VALUE)
                              {
                                  if(GetLastError()==ERROR_FILE_NOT_FOUND)
                                  {
                                      MessageBox(NULL,"serial port does not exist.","",MB_OK);
                                  }
                                MessageBox(NULL,"serial port error","", MB_OK);
                              }
                             
                              DCB dcbSerialParams = {0};
                              dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
                              if (!GetCommState(COMport, &dcbSerialParams))
                              {
                                  MessageBox(NULL,"getting state error\n","",MB_OK);
                              }
                              dcbSerialParams.BaudRate=BaudR;
                              dcbSerialParams.ByteSize=8;
                              dcbSerialParams.StopBits=ONESTOPBIT;
                              dcbSerialParams.Parity=NOPARITY;
                              if(!SetCommState(COMport, &dcbSerialParams))
                              {
                                  MessageBox(NULL,"error setting serial port state\n","",MB_OK);
                              }
                             
                              // Установка таймаутов.
                              timeouts.ReadIntervalTimeout = 10;        // таймаут между двумя символами
                              timeouts.ReadTotalTimeoutMultiplier = 0;  // общий таймаут операции чтения
                              timeouts.ReadTotalTimeoutConstant = 0;    // константа для общего таймаута операции чтения
                              timeouts.WriteTotalTimeoutMultiplier = 0; // общий таймаут операции записи
                              timeouts.WriteTotalTimeoutConstant = 0;   // константа для общего таймаута операции записи
                             
                              // Загрузить структуру таймаутов в порт.
                              if(!SetCommTimeouts(COMport, &timeouts))
                              {
                                // Если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния.
                                MessageBox(NULL,"Не удалось установить тайм-ауты\n","",MB_OK);
                                return;
                              }
                             
                              // Установить размеры очередей приёма и передачи
                              SetupComm(COMport,2000,2000);
                              // Очистка буферов порта
                              PurgeComm(COMport,PURGE_RXCLEAR);
                              // очистить строку имени порта
                              com_port = "";
                             
                            }


                          Пытаюсь создать проект MFC Создается модуль .cpp с кодом типа
                          ExpandedWrap disabled
                            // MFCtest.cpp : Defines the class behaviors for the application.
                            //
                             
                            #include "stdafx.h"
                            #include "MFCtest.h"
                            #include "MFCtestDlg.h"
                             
                            #ifdef _DEBUG
                            #define new DEBUG_NEW
                            #endif
                             
                             
                            // CMFCtestApp
                             
                            BEGIN_MESSAGE_MAP(CMFCtestApp, CWinApp)
                                ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
                            END_MESSAGE_MAP()
                             
                             
                            // CMFCtestApp construction
                             
                            CMFCtestApp::CMFCtestApp()
                            {
                                // TODO: add construction code here,
                                // Place all significant initialization in InitInstance
                            }
                             
                             
                            // The one and only CMFCtestApp object
                             
                            CMFCtestApp theApp;
                             
                             
                            // CMFCtestApp initialization
                             
                            BOOL CMFCtestApp::InitInstance()
                            {
                                // InitCommonControlsEx() is required on Windows XP if an application
                                // manifest specifies use of ComCtl32.dll version 6 or later to enable
                                // visual styles.  Otherwise, any window creation will fail.
                                INITCOMMONCONTROLSEX InitCtrls;
                                InitCtrls.dwSize = sizeof(InitCtrls);
                                // Set this to include all the common control classes you want to use
                                // in your application.
                                InitCtrls.dwICC = ICC_WIN95_CLASSES;
                                InitCommonControlsEx(&InitCtrls);
                             
                                CWinApp::InitInstance();
                             
                                AfxEnableControlContainer();
                             
                                // Standard initialization
                                // If you are not using these features and wish to reduce the size
                                // of your final executable, you should remove from the following
                                // the specific initialization routines you do not need
                                // Change the registry key under which our settings are stored
                                // TODO: You should modify this string to be something appropriate
                                // such as the name of your company or organization
                                SetRegistryKey(_T("Local AppWizard-Generated Applications"));
                             
                                CMFCtestDlg dlg;
                                m_pMainWnd = &dlg;
                                INT_PTR nResponse = dlg.DoModal();
                                if (nResponse == IDOK)
                                {
                                    // TODO: Place code here to handle when the dialog is
                                    //  dismissed with OK
                                }
                                else if (nResponse == IDCANCEL)
                                {
                                    // TODO: Place code here to handle when the dialog is
                                    //  dismissed with Cancel
                                }
                             
                                // Since the dialog has been closed, return FALSE so that we exit the
                                //  application, rather than start the application's message pump.
                                return FALSE;
                            }


                          Куда в какое место в нем прописываются хендлы, глобальные переменные, функции, да собственно и потоки?
                          Пробую так
                          ExpandedWrap disabled
                            // MFCtest.cpp : Defines the class behaviors for the application.
                            //
                             
                            #include "stdafx.h"
                            #include "MFCtest.h"
                            #include "MFCtestDlg.h"
                             
                            #ifdef _DEBUG
                            #define new DEBUG_NEW
                            #endif
                             
                             
                            // CMFCtestApp
                             
                            BEGIN_MESSAGE_MAP(CMFCtestApp, CWinApp)
                                ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
                            END_MESSAGE_MAP()
                             
                             
                            // CMFCtestApp construction
                             
                            CMFCtestApp::CMFCtestApp()
                            {
                                // TODO: add construction code here,
                                // Place all significant initialization in InitInstance
                            }
                             
                             
                            // The one and only CMFCtestApp object
                             
                            CMFCtestApp theApp;
                             
                             
                            // CMFCtestApp initialization
                             
                            BOOL CMFCtestApp::InitInstance()
                            {
                                // InitCommonControlsEx() is required on Windows XP if an application
                                // manifest specifies use of ComCtl32.dll version 6 or later to enable
                                // visual styles.  Otherwise, any window creation will fail.
                                INITCOMMONCONTROLSEX InitCtrls;
                                InitCtrls.dwSize = sizeof(InitCtrls);
                                // Set this to include all the common control classes you want to use
                                // in your application.
                                InitCtrls.dwICC = ICC_WIN95_CLASSES;
                                InitCommonControlsEx(&InitCtrls);
                             
                                CWinApp::InitInstance();
                             
                                AfxEnableControlContainer();
                             
                                // Standard initialization
                                // If you are not using these features and wish to reduce the size
                                // of your final executable, you should remove from the following
                                // the specific initialization routines you do not need
                                // Change the registry key under which our settings are stored
                                // TODO: You should modify this string to be something appropriate
                                // such as the name of your company or organization
                                SetRegistryKey(_T("Local AppWizard-Generated Applications"));
                             
                                CMFCtestDlg dlg;
                                m_pMainWnd = &dlg;
                                INT_PTR nResponse = dlg.DoModal();
                                if (nResponse == IDOK)
                                {
                                    // TODO: Place code here to handle when the dialog is
                                    //  dismissed with OK
                                }
                                else if (nResponse == IDCANCEL)
                                {
                                    // TODO: Place code here to handle when the dialog is
                                    //  dismissed with Cancel
                                }
                             
                                // Since the dialog has been closed, return FALSE so that we exit the
                                //  application, rather than start the application's message pump.
                                return FALSE;
                             
                                //---------------------------------------------------------------------------
                                // дефайны
                             
                                //ёмкость буфера приема
                                #define BUFSIZE_RD 5000
                                //ёмкость буфера передачи
                                #define BUFSIZE_WR 128
                             
                                //---------------------------------------------------------------------------
                                // дескрипторы
                             
                                HANDLE COMport;
                                HANDLE writer;
                                HANDLE reader;
                                HANDLE main;
                             
                                ///будем использовать для операций чтения (см. поток ReadThread)
                                OVERLAPPED overlapped;
                                //будем использовать для операций записи (см. поток WriteThread)
                                OVERLAPPED overlappedwr;
                             
                                //---------------------------------------------------------------------------
                                // глобальные переменные
                             
                                // строка определения com порта
                            //  String com_port;
                             
                                // флаг приема
                                bool FlComRead;
                                // флаг цикла в потоке приема
                                bool flag;
                             
                                bool FlBeg;
                             
                                //приёмный и передающий буферы
                                unsigned char bufrd[BUFSIZE_RD], bufwr[BUFSIZE_WR];
                                // контрольная сумма пакета передачи
                                unsigned char TxBufCrc;
                                unsigned char PrCanal;
                                unsigned char PrSect;
                             
                                // счетчик приемов
                                unsigned int counterRX;
                                unsigned int counterTX;
                                unsigned int counterRP;
                                unsigned int Dist;
                                unsigned int Distm;
                             
                                // скорость бод
                                unsigned long BaudR;
                             
                                //---------------------------------------------------------------------------
                                // функции
                             
                                //---------------------------------------------------------------------------
                             
                                // задержка
                                void wait (int wt)
                                {
                                  while (wt--);
                                }
                             
                                //---------------------------------------------------------------------------
                                // Принятые байты в HEX
                             
                                void hexdumpstrRead ( char src[], size_t size)
                                {
                            //    Form1->Memo2->Clear();
                                  static const char hex[] = "0123456789abcdef";
                                  char *result = (char *)malloc((size > 0)? size*3: 1),
                                    *p = result;
                             
                                  if (result) {
                                    while (size-- > 0) {
                                      *p++ = hex[(*src >> 4) & 0x0f];
                                      *p++ = hex[*src++ & 0x0f];
                                      *p++ = ' ';
                                    }
                                    p[(p > result)? -1: 0] = 0;
                                  }
                            //    Form1->Memo2->Lines->Add(result);
                                }
                                //---------------------------------------------------------------------------
                                // Переданные байты в HEX
                             
                                void hexdumpstrWrite ( char src[], size_t size)
                                {
                            //    Form1->Memo1->Clear();
                                  static const char hex[] = "0123456789abcdef";
                                  char *result = (char *)malloc((size > 0)? size*3: 1),
                                    *p = result;
                             
                                  if (result) {
                                    while (size-- > 0) {
                                      *p++ = hex[(*src >> 4) & 0x0f];
                                      *p++ = hex[*src++ & 0x0f];
                                      *p++ = ' ';
                                    }
                                    p[(p > result)? -1: 0] = 0;
                                  }
                            //    Form1->Memo1->Lines->Add(result);
                                }


                          }
                          Ошибки типа
                          ExpandedWrap disabled
                            Error   1   error C2601: 'wait' : local function definitions are illegal
                            Цитата Acvarif @
                            Ошибки типа

                            Так тебе компилятор прямым текстом сообщает об ошибке :-?

                            Добавлено
                            Кстати сама функция -- это фигня какая-то. Я уж молчу про то, что без volatile компилятор вправе вообще твой while потереть.
                              Цитата Acvarif @
                              Я не врубаюсь как код с WINAPI прописать в Wisual Studio. Какой вид проекта для этого открыть MFC, WindovsForm, или...?

                              Есть три вида Win32-проект, MFC-проект и WinForms-проект. Последний лучше писать на С#.
                              Создаешь MFC-проект, самое простое, по типу С++Builder, это диалоговое приложение. Потом кидаешь контролы на форму, и всязываешь с обработчиками :D
                              почти как С++Builder там VCL, тут MFC.

                              Цитата Acvarif @
                              Если начинать проект MFC то куда и чего прописывать
                              Напнример в Builder все прописывается в одном едиственном модуле c расширением .cpp

                              в случае создания диалогового приложения, изначально можно все запихать в файл срр, где находиться определение главного окна приложения.
                              Как создать обработчик в студии, да все просто выбираешь конрол и дабл клик на нем студия сама создаст :D

                              Добавлено
                              если еще не понял то открывай учебник по MFC и Visual Studio и читай там все описано.
                              Сообщение отредактировано: Cfon -
                                Спасибо. Полегчало. Visual Studio слишком насыщен разными подходами. С наскоку растерялся. MFC подойдет.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (8) 1 [2] 3 4 ...  7 8 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1190 ]   [ 20 queries used ]   [ Generated: 26.04.24, 10:57 GMT ]