Консультация № 182931
24.04.2011, 20:53
53.50 руб.
0 5 1
Здравствуйте, Уважаемые Эксперты! Прошу Вас помочь с решением следующей задачи: есть код программы, написаной на языке C++ (в приложении). Необходимо составить блок-схему работы этой программы.


Приложение:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#pragma argsused
//---------------------------------------------------------------------------
//макс время ожидания при записи данных в порт
#define MAX_WRITE_WAIT_TIMEOUT 10000
//макс время ожидания при чтении данных из порта
#define MAX_READ_WAIT_TIMEOUT 10000

OVERLAPPED ov;
DCB dcb;
HANDLE hComm;
DWORD dwError;
BOOL fSuccess;

inline int min(int a, int b){return a<b?a:b;}

//вернёт 0, если всё отлично, не нуль при ошибке
//s - настройки порта для BuildCommBCD: 9600,n,8,1
DWORD init_serial(const char* name, const char* s=0, bool overlapped=0);
//отправить в порт send_cou байт данных из send_buf
//ждём либо пока придёт recv_cou байт ответа, либо выйдет время
//ждём максимум wait_tm мс
DWORD send_recv(HANDLE port
, const char* send_buf, int send_cou
, char* recv_buf, int recv_sz, int *recv_cou
, DWORD wait_tm
);



int main(int argc, char* argv[]){
if (init_serial("COM1")!=0){
printf("Cannot init serial port\n");
return 1;
}

/*
char buf[] = "ati\n";
DWORD wasWrittenOrRead = 0;
BOOL res = WriteFile(hComm, buf, 4, &wasWrittenOrRead, 0);
printf("WriteFile result: %d\nwritten: %d\n", (int)res, wasWrittenOrRead);

char ans[4];
res = ReadFile(hComm, ans, 1, &wasWrittenOrRead, 0);
printf("ReadFile result: %d\nread: %d\nbyte[0]=%d", (int)res, wasWrittenOrRead
, ans[0]);
*/

int n1, n2;
char buf[100];
char oper;
printf("Enter number 1: ");scanf("%d", &n1);
printf("Enter number 2: ");scanf("%d", &n2);
printf("Action: ");scanf("%s", &buf);
{
const char *ptr = buf;
while(*ptr && (*ptr==' '||*ptr=='\t')) ptr++;
oper = *ptr;
}
//printf("%d and %d, oper:%c\n", n1, n2, oper);

switch(oper){
case '+': oper=1; break;
case '-': oper=2; break;
case '*': oper=3; break;
case '/': oper=4; break;
default:
printf("Unknown action '%c', bye-bye\n", oper);
return 1;
}


DWORD wasWrittenOrRead = 0;

buf[0] = (char)n1;
buf[1] = (char)n2;
buf[2] = oper;
BOOL res = WriteFile(hComm, buf, 3, &wasWrittenOrRead, 0);
if (!res || wasWrittenOrRead!=3) {
printf("Write error while writing to serial port\n");
return 1;
}

Sleep(2000); //wait for 2 seconds to let controller to do its calculations

wasWrittenOrRead = 0;
res = ReadFile(hComm, buf, 1, &wasWrittenOrRead, 0);
if (!res || wasWrittenOrRead!=1) {
printf("No answer from controller for 2 seconds\n");
return 1;
}

printf("Answer from controller: %d\n", buf[0]);

getch();
return 0;
}

DWORD init_serial(const char* name, const char* s, bool overlapped){
hComm = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING,0, overlapped?&ov:NULL);
if (hComm == INVALID_HANDLE_VALUE) return GetLastError();
// обработка ошибки в дескрипторе
// получаем текущие установки
fSuccess = GetCommState (hComm, &dcb);
if (!fSuccess){
// обработка ошибки
}
if (!s || !BuildCommDCB(s, &dcb)){
// изменяем установки
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
}
// устанавливаем новое состояние порта
fSuccess = SetCommState (hComm, &dcb);
if (!fSuccess){
// обработка ошибки
}

memset(&ov, 0, sizeof(ov));
ov.hEvent = CreateEvent(0, true, false, 0);
return 0;
}

DWORD send_recv(HANDLE port
, const char* send_buf, int send_cou
, char* recv_buf, int recv_sz, int *recv_cou
, DWORD wait_tm)
{

ResetEvent(ov.hEvent);

if (send_buf){
DWORD dwWritten;
if (!WriteFile(port, send_buf, send_cou, &dwWritten, &ov)){
if (GetLastError() == ERROR_IO_PENDING){
DWORD dwRes = WaitForSingleObject(ov.hEvent, MAX_WRITE_WAIT_TIMEOUT);
switch(dwRes){
case WAIT_TIMEOUT:
//не смогли за отведённое время записать данные в порт
return 1;
case WAIT_OBJECT_0:
SetLastError(ERROR_SUCCESS);
if (!GetOverlappedResult(port, &ov, &dwWritten, false)){
return 2;
/*
if (GetLastError() == ERROR_OPERATION_ABORTED)
;//UpdateStatus("Write aborted\r\n");
else
;//ErrorInComm("GetOverlappedResult(in Writer)");
*/
}
if (dwWritten != (DWORD)send_cou){
return 3;
//if (GetLastError() == ERROR_SUCCESS)
// ;//UpdateStatus("Write timed out. (overlapped)\r\n");
//else
// ;//ErrorReporter("Error writing data to port (overlapped)");
}
break;
}// switch(dwRes)
}else{//if (GetLastError() == ERROR_IO_PENDING)
return 4;
//не смогли записать байтики
}
}else{//if (!WriteFile(port, send_buf, send_cou, &WrittenOrRead, &ov))
//все данные успешно записаны в порт
}
} //if (send_buf)

ResetEvent(ov.hEvent);

int read_cou = 0;
if (recv_buf){
DWORD wasRead = 0;
if (!ReadFile(port, recv_buf, recv_sz, &wasRead, &ov)){
//либо ошибка, либо чтение отложено
if (GetLastError()!=ERROR_IO_PENDING) return 100;
DWORD res = WaitForSingleObject(ov.hEvent, min(wait_tm, MAX_READ_WAIT_TIMEOUT));
switch (res){
case WAIT_TIMEOUT:
return 101;
case WAIT_OBJECT_0:
if (!GetOverlappedResult(port, &ov, &wasRead, false)) return 102;
read_cou += wasRead;
recv_buf += wasRead;
recv_sz += wasRead;
break;
} //switch (res)
}else{//if (!ReadFile(port, recv_buf, recv_sz, &wasRead, &ov))
read_cou = wasRead;
}//if (!ReadFile(port, recv_buf, recv_sz, &wasRead, &ov))
}// if (recv_buf)
if (recv_cou) *recv_cou = read_cou;
return 0;
}

Обсуждение

давно
Посетитель
7438
7205
25.04.2011, 02:07
общий
Здравствуйте.
Какая знакомая тема
Наш с Вами калькулятор...
Неужели так сложно сделать блок-схему?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.04.2011, 11:15
общий
Адресаты:
Здравствуйте, Игорь Витальевич! Блок-схему НЕ сложно сделать тому, кто умеет это делать и кто желает это делать! Я же к таким НЕ отношусь. Меня интересуют другие области, НЕ связанные с программированием!
Неизвестный
25.04.2011, 12:37
общий
Поэтому буду чрезвычайно благодарен, если мне в этом помогут (желательно, до завтрашнего вечера)
давно
Посетитель
7438
7205
26.04.2011, 11:32
общий
это ответ
Здравствуйте, Dmitry!

Блок-схема: 182931-block-shema.doc (45.0 кб)
Неиспользуемые фрагменты я в блок-схему не включил
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.04.2011, 11:37
общий
Адресаты:
Спасибо большое!
Форма ответа