C ++ / CLI попробуй перехватить обработку - PullRequest
1 голос
/ 23 апреля 2011

Ниже приведен код, который я использую для связи с моим Arduino в Windows XP. Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня есть две команды, пытающиеся получить доступ к порту одновременно, это оператор перехвата UnauthroizedAccessException, он выводит сообщение об ошибке и не выполняет ни одну из команд. Как я могу выполнить кодирование этого оператор catch, чтобы вместо того, чтобы перехватить ошибку или даже сделать ошибку, программа завершит выполнение первой команды, а затем выполнит другую, что-то вроде очереди ....

#include "stdafx.h"
#include <iostream>

using namespace System;
using namespace System::IO::Ports;

int main(int argc, char* argv[])
{
    using namespace std;

    String^ portName;
    int baudRate=9600;

    portName="COM4";
    // arduino settings
    SerialPort^ arduino;

    arduino = gcnew SerialPort(portName, baudRate);
    // open port
    try
    {
        arduino->Open();
        {
            if(strcmp(argv[1],"-send")==0){
                String^ command = gcnew String(reinterpret_cast<const char*>(argv[2]));

                if(String::Compare(command,"int6")==0){
                    arduino->Write("^");
                }else
                    arduino->Write(command);
            }
            if(strcmp(argv[1],"-get")==0){
                String^ command = gcnew String(reinterpret_cast<const char*>(argv[2]));
                arduino->ReadTimeout = 1000;        
                arduino->WriteLine(command);

                String^ result = arduino->ReadLine();

                Console::Write(result);
            }
        }
        // close port to arduino
        arduino->Close();
    }
    catch (IO::IOException^ e){
        Console::Write("errormessagedisconnected");
    }
    catch (TimeoutException^ e){
        Console::Write("errormessage");
    }
    catch (UnauthorizedAccessException^ e){
        Console::Write("errormessage");
    }
    catch (ArgumentException^ e){
        Console::WriteLine(e->GetType()->Name+": incorrect port name syntax, must start with COM/com");
    }
    // end program

    return 0;
}

1 Ответ

2 голосов
/ 23 апреля 2011

Лучшее решение - не использовать исключения здесь, если это возможно.Я бы также посоветовал вам не запускать одновременно две программы, которые обращаются к одному и тому же последовательному порту, чтобы избежать исключения.Однако с исключениями вы можете сделать это так:

void f()
{
    bool bFinished = FALSE;
    while(!bFinished) {
         try {
             ThisFunctionThrows();
             bFinished = TRUE;
         }
         catch(UnauthorizedAccessException^ e) {
             Console::Write("retrying in 1 sec");
             sleep(1);
         }
    }
}

Вы также можете добавить счетчик, если не хотите ждать бесконечно.

...