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;
}
Вывод:
В ходе лабораторной работы были получены навыки работы с цифровым вольтметром и написана программа, позволяющая работать с вольтметром через персональный компьютер. В ходе чего была получена возможность использования вольтметра в качестве осциллографа.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.