программа wiimote закрывается, когда я нажимаю кнопку

#c# #wiimote

#c# #wiimote

Вопрос:

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

 Wiimote wm = new Wiimote();

public Wiimote1()
{
    InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
    wm.WiimoteChanged  = wm_WiimoteChanged;
    wm.WiimoteExtensionChanged  = wm_WiimoteExtensionChanged;
    wm.Connect();
    wm.SetReportType(InputReport.IRAccel, true);
    wm.SetLEDs(true, false, false, false);
}

private void wm_WiimoteExtensionChanged(object sender, WiimoteExtensionChangedEventArgs args)
{

    if (args.Inserted)
        wm.SetReportType(InputReport.IRExtensionAccel, true);
    else
        wm.SetReportType(InputReport.IRAccel, true);
}


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    wm.Disconnect();
}

private void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args)
{

    WiimoteState wmi = args.WiimoteState;

    buttonA = wmi.ButtonState.A;
    buttonB = wmi.ButtonState.B;
    buttonHome = wmi.ButtonState.Home;
    buttonOne = wmi.ButtonState.One;
    buttonTwo = wmi.ButtonState.Two;
    buttonPlus = wmi.ButtonState.Plus;
    buttonMinus = wmi.ButtonState.Minus;
    buttonUp = wmi.ButtonState.Up;
    buttonDown = wmi.ButtonState.Down;
    buttonLeft = wmi.ButtonState.Left;
    buttonRight = wmi.ButtonState.Right;
    AccelX = wmi.AccelState.Values.X.ToString();
    AccelY = wmi.AccelState.Values.Y.ToString();
    AccelZ = wmi.AccelState.Values.Z.ToString();

    switch (wmi.ExtensionType)
    {
        case ExtensionType.Nunchuk:
            nunC = wmi.NunchukState.C;
            nunZ = wmi.NunchukState.Z;
            nunAccelX = wmi.NunchukState.AccelState.Values.X.ToString();
            nunAccelY = wmi.NunchukState.AccelState.Values.Y.ToString();
            JoyStickX = wmi.NunchukState.Joystick.X.ToString();
            JoyStickY = wmi.NunchukState.Joystick.Y.ToString();
            break;

        case ExtensionType.ClassicController:
            clsA = wmi.ClassicControllerState.ButtonState.A;
            clsB = wmi.ClassicControllerState.ButtonState.B;
            clsX = wmi.ClassicControllerState.ButtonState.X;
            clsY = wmi.ClassicControllerState.ButtonState.Y;
            clsPlus = wmi.ClassicControllerState.ButtonState.Plus;
            clsMinus = wmi.ClassicControllerState.ButtonState.Minus;
            clsHome = wmi.ClassicControllerState.ButtonState.Home;
            clsUp = wmi.ClassicControllerState.ButtonState.Up;
            clsDown = wmi.ClassicControllerState.ButtonState.Down;
            clsLeft = wmi.ClassicControllerState.ButtonState.Left;
            clsRight = wmi.ClassicControllerState.ButtonState.Right;
            clsTriggerL = wmi.ClassicControllerState.ButtonState.TriggerL;
            clsTriggerR = wmi.ClassicControllerState.ButtonState.TriggerR;
            clsZL = wmi.ClassicControllerState.ButtonState.ZL;
            clsZR = wmi.ClassicControllerState.ButtonState.ZR;
            break;
    }

    checkList();

}


private void checkList()
{
    checkedListBox1.SetItemChecked(0, buttonA);
    checkedListBox1.SetItemChecked(1, buttonB);
    checkedListBox1.SetItemChecked(2, buttonMinus);
    checkedListBox1.SetItemChecked(3, buttonPlus);
    checkedListBox1.SetItemChecked(4, buttonHome);
    checkedListBox1.SetItemChecked(5, buttonOne);
    checkedListBox1.SetItemChecked(6, buttonTwo);
    checkedListBox1.SetItemChecked(7, buttonUp);
    checkedListBox1.SetItemChecked(8, buttonDown);
    checkedListBox1.SetItemChecked(9, buttonRight);
    checkedListBox1.SetItemChecked(10, buttonLeft);
}
  

Комментарии:

1. Вы пробовали пробовать свою программу через отладчик, чтобы посмотреть, не генерируются ли какие-либо исключения?

Ответ №1:

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

Если пойманное исключение не имеет для вас смысла, вы можете задать вопросы об этом здесь.

Комментарии:

1. Ок, прочитаю это, я новичок в c #, который пытается поймать. Еще одна вещь, я попытался запустить тот же код на своем ноутбуке, но он не распознает wiimote в приложении Windows form, т. Е. Когда wiimote не подключен, он все еще запускается, но чего не должно произойти, потому что я не подключил wiimote, программа должна вернуть ошибку, сообщающую мне, что она не может найти устройство wiimote.

2. Спасибо, я нашел ошибку, используя обработку исключений try and catch. Это была ошибка перекрестного переноса разных платформ из wiimote в visual studios. поэтому я использовал ключевое слово delegate.

Ответ №2:

Если вы используете 64-разрядную версию Windows, исключения, которые генерируются в событии Form_Load, автоматически проглатываются. Возможно, было бы неплохо переместить ваш код подальше от события Form_Load. Это значительно упрощает дальнейшую отладку.

 public Wiimote1()
{
    InitializeComponent();
    InitWiimote();
}


private void InitWiimote()
{
    wm.WiimoteChanged  = wm_WiimoteChanged;
    wm.WiimoteExtensionChanged  = wm_WiimoteExtensionChanged;
    wm.Connect();
    wm.SetReportType(InputReport.IRAccel, true);
    wm.SetLEDs(true, false, false, false);
}