Написание программы, позволяющей работать с вольтметром через персональный компьютер, страница 4

fRes = FALSE;

else

// Write operation completed successfully.

fRes = TRUE;

}            

}

else

{            // WriteFile completed immediately.

fRes = TRUE;

}

/*CString s1;

s1.Format("%d байт передано!",dwWritten);

if (fRes) MessageBox(s1);

else MessageBox("Херовато будет!");*/

CloseHandle(osWrite.hEvent);   

} // if (h_com!=NULL)

}            

Процедура установления параметров СОМ порта.

void COscillographDlg::OnBnClickedButton2()

{             // TODO: Add your control notification handler code here

DCB dcb;

bool err=FALSE;

FillMemory(&dcb, sizeof(dcb), 0);

dcb.DCBlength = sizeof(dcb);

int n = port_speed.GetCurSel();

switch(n)

{

case 0:   err = BuildCommDCB("19200,n,8,1", &dcb);

break;

case 1:   err = BuildCommDCB("9600,n,8,1", &dcb);

break;

case 2:   err = BuildCommDCB("4800,n,8,1", &dcb);

break;

case 3:   err = BuildCommDCB("2400,n,8,1", &dcb);

break;

case 4:   err = BuildCommDCB("1200,n,8,1", &dcb);

break;

}

if (!err) MessageBox("Ошибка при настройке порта");

else

{

if (!SetCommState(PRTh1.h_com, &dcb))

MessageBox("Не удаётся установить параметры порту");

else

MessageBox("Параметры порта установлены верно");

}

}

Процедура считывания данных с вольтметра.

DWORD WINAPI COscillographDlg::port_reading(LPVOID arg)

{

PPORT_READ_STRUCT p1 = (PPORT_READ_STRUCT) arg;

DWORD dwRead;

DWORD dwRes;

BOOL fWaitingOnRead = FALSE;

OVERLAPPED osReader = {0};

char Buf[2];

CString str_buf("");

bool nonport = TRUE, wait = TRUE;

Buf[1] = '\0';      

while (1)

{                        //for (int i=0; i<25; i++) Buf[i] = '\0';

if (nonport)

{             osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (osReader.hEvent == NULL) p1->w1->MessageBox("Error creating overlapped event!");

else nonport = FALSE;

wait = TRUE;

}

// Если порт не открыт - простаиваем  

while(p1->h_com==NULL) Sleep(300);

// Выполнение основных вычислительных операций

if (!fWaitingOnRead)

{             if (!ReadFile(p1->h_com, Buf, 1, &dwRead, &osReader))

{             if (GetLastError() != ERROR_IO_PENDING)    

{             p1->w1->MessageBox("Error in communications1");

nonport = TRUE;

}

else

{             fWaitingOnRead = TRUE;

//p1->w1->MessageBox("Complite");

}

}            

else

{             // read completed immediately

switch (Buf[0])

{

case '\0':

case 0x0d:

// Сообщение полностью принято

p1->w2->SetWindowText(str_buf);

str_buf = "";

wait = TRUE;

break;

case 0x0a:

break;

default:

// Принят новый байт

str_buf += Buf[0];

wait = FALSE;

}

}

}

if (fWaitingOnRead)

{             dwRes = WaitForSingleObject(osReader.hEvent, p1->read_time_out);

switch(dwRes)

{             // Read completed.

case WAIT_OBJECT_0:

if (!GetOverlappedResult(p1->h_com, &osReader, &dwRead, FALSE))

{             p1->w1->MessageBox("Error in communications2");

nonport = TRUE;

}

else

{

// Read completed successfully.

switch (Buf[0])

{

case '\0':

case 0x0d:

// Сообщение полностью принято

p1->w2->SetWindowText(str_buf);

str_buf = "";

wait = TRUE;

break;

case 0x0a:

break;

default:

// Принят новый байт

str_buf += Buf[0];

wait = FALSE;

}

}

//  Reset flag so that another opertion can be issued.

fWaitingOnRead = FALSE;

break;

case WAIT_TIMEOUT:

// Operation isn't complete yet. fWaitingOnRead flag isn't

// changed since I'll loop back around, and I don't want

// to issue another read until the first one finishes.

//

// This is a good time to do some background work.

break;

default:

// Error in the WaitForSingleObject; abort.

// This indicates a problem with the OVERLAPPED structure's

// event handle.

p1->w1->MessageBox("Error in the WaitForSingleObject");

break;

} // switch(dwRes)

}

//nonport = TRUE;

if (nonport) CloseHandle(osReader.hEvent);

// Функция ожидания/вход в критическую секцию

WaitForSingleObject(p1->hMutex1,INFINITE);

ReleaseMutex(p1->hMutex1);

// Sleep(300);

if (wait) Sleep(50);

}

return 0;

}

Вывод:

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