Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.11.98] |
|
Страницы: (8) 1 [2] 3 4 ... 7 8 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
кто-то не читает, что ему пишут, например, в посте #6
http://stackoverflow.com/questions/1159094...r-of-serialport |
Сообщ.
#17
,
|
|
|
Спасибо. Понял. Пробую так http://stackoverflow.com/questions/1077536...m-a-thread-othe Только у меня очевидно проблемы с синтаксисом в VisualStudio2008
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()); } Такой код выдает ошибки 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 |
Сообщ.
#18
,
|
|
|
ну ты и чайник
|
Сообщ.
#19
,
|
|
|
Сделал небольшой тест на C#
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 это просто //проверяем, успешно ли завершилась перекрываемая операция 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); } } } |
Сообщ.
#20
,
|
|
|
да какой С# здесь раздел Visual С++ MFC
я твой пример тупо копипаст + MFC и все |
Сообщ.
#21
,
|
|
|
Копипаст это как? Что такое копипаст?
Поясните пожалуйста. Это типа ворованный код? Код проги на Builder мой Прикреплённый файлTest.rar (11,68 Кбайт, скачиваний: 72) . Прога работает без проблем, кроме одной - тяжело работать с графикой OpenGl. Поэтому пытаюсь перевести все в VisualStudio. C# или C++ без разницы. Если у Вас имеется пример как в Visual Studio работать с VinApi и COM портом могли-бы поделиться... |
Сообщ.
#22
,
|
|
|
Цитата Acvarif @ Еще загвоздка. Как по собитию прихода очередного байта получить количество уже пришедших на порт байт? WinApi это просто //проверяем, успешно ли завершилась перекрываемая операция 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)" сразу передаёт число полученных байт, готовых для чтения. Дальше: if(Bytes) { // ... /// добываем данные - в указанном операцией ReadFile (выполненной ранее) буфере /// есть количество "Bytes" байт, полученных с порта } |
Сообщ.
#23
,
|
|
|
Спасибо. Понятно. Можно и так попробовать. В любом случае код Builder6 + WinApi работает без проблем. Перенос кода на VisualStudio нужен для дальнейшей работы с GLUT. На Builder6 с этим делом неважно. Поэтому и прощупываю варианты. Вариант с serialPort на первый взгляд работает. Но опять уткнулся в проблему подсчета и отображения принятых байт в HEX виде в окне textBox. Хотя строку принимает и отображает как надо. По ходу еще проблема как очищать окно textBox перед очередным приемом пакета байт. (период прихода пакетов 1 сек.)
И все же главный вопрос. Можно-ли в VisualStudio использовать непосредственно функции WaitCommEvent(COMport, &mask, &overlapped) GetOverlappedResult(COMport, &overlapped, &Bytes, true); и им подобные? Если да то несколько слов о том как. Какой вид проекта для этого закладывать WindowsForm C++, MFC, win32... ? |
Сообщ.
#24
,
|
|
|
Цитата Acvarif @ И все же главный вопрос. Можно-ли в VisualStudio использовать непосредственно функции WaitCommEvent(COMport, &mask, &overlapped) GetOverlappedResult(COMport, &overlapped, &Bytes, true); и им подобные? Если да то несколько слов о том как. Какой вид проекта для этого закладывать WindowsForm C++, MFC, win32... ? Естествено это же Win32 API! MFC в зубы и вперед с песней! WinForms это для .NET и C# |
Сообщ.
#25
,
|
|
|
В зубы это да. Какую библиотеку подключить? Куда подключить? Можно несколько слов, коротко, по шагам.
|
Сообщ.
#26
,
|
|
|
Цитата 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-порт для конкретных нужд конкретного приложения. |
Сообщ.
#27
,
|
|
|
Все примерно то же самое я уже делал в проге на Builder6. Правда потоков несколько. Может и лишнее. Все работает.
Я не врубаюсь как код с WINAPI прописать в Wisual Studio. Какой вид проекта для этого открыть MFC, WindovsForm, или...? Собственно мой вопрос не по сути, а по технологии. С хендлами, событиями и т. п справлюсь. Если начинать проект MFC то куда и чего прописывать Напнример в Builder все прописывается в одном едиственном модуле c расширением .cpp #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 с кодом типа // 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; } Куда в какое место в нем прописываются хендлы, глобальные переменные, функции, да собственно и потоки? Пробую так // 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); } } Ошибки типа Error 1 error C2601: 'wait' : local function definitions are illegal |
Сообщ.
#28
,
|
|
|
Цитата Acvarif @ Ошибки типа Так тебе компилятор прямым текстом сообщает об ошибке Добавлено Кстати сама функция -- это фигня какая-то. Я уж молчу про то, что без volatile компилятор вправе вообще твой while потереть. |
Сообщ.
#29
,
|
|
|
Цитата Acvarif @ Я не врубаюсь как код с WINAPI прописать в Wisual Studio. Какой вид проекта для этого открыть MFC, WindovsForm, или...? Есть три вида Win32-проект, MFC-проект и WinForms-проект. Последний лучше писать на С#. Создаешь MFC-проект, самое простое, по типу С++Builder, это диалоговое приложение. Потом кидаешь контролы на форму, и всязываешь с обработчиками почти как С++Builder там VCL, тут MFC. Цитата Acvarif @ Если начинать проект MFC то куда и чего прописывать Напнример в Builder все прописывается в одном едиственном модуле c расширением .cpp в случае создания диалогового приложения, изначально можно все запихать в файл срр, где находиться определение главного окна приложения. Как создать обработчик в студии, да все просто выбираешь конрол и дабл клик на нем студия сама создаст Добавлено если еще не понял то открывай учебник по MFC и Visual Studio и читай там все описано. |
Сообщ.
#30
,
|
|
|
Спасибо. Полегчало. Visual Studio слишком насыщен разными подходами. С наскоку растерялся. MFC подойдет.
|