C # SerialPort - странное поведение - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь использовать последовательный порт для взаимодействия с камерой.Теперь у камеры есть собственный проприетарный протокол, который довольно прост и использует 6-байтовые команды и подтверждает.

Теперь я использую C # для написания программы, которая взаимодействует с камерой, так как это позволяет мнеиспользовать WPF, и я все равно чувствую себя комфортно с C #.

Моя проблема возникает, когда я пытаюсь настроить камеру на получение изображения.Объект Serial Port работает совершенно нормально, когда я прохожу программу.Однако, как только я запускаю его на полной скорости, по какой-то причине я получаю сообщения в порту, которые очень плохо читаются и даже пропускаются.Я добираюсь до конца процесса установки, непосредственно перед тем, как я начну извлекать фактические данные, и все еще есть команды и вещи, которые все еще находятся в буфере порта.просто очень хакерская попытка изучить протокол и заставить его работать в данный момент, и я полностью намереваюсь улучшить его позже, но я просто не могу понять, почему он это делает.Камера не должна отправлять следующий пакет, пока я не подтвердил последний, так что я могу только предположить, что объект последовательного порта проблематичен, а не камера или моя обработка протокола.

Может ли этобыть, потому что я (лениво, да) получил эту функцию в потоке пользовательского интерфейса?

Вот код:

private void retreivePhoto()
    {
        progressBar1.Visibility = Visibility.Visible;
        photo = new FileStream(Environment.CurrentDirectory + @"/photos/" + (photoNum++) + ".jpg", FileMode.OpenOrCreate);
        port.Open();
        progressBar1.Value = 0.5;
        setup.theMessage = setup.JPEG();
        port.Write(setup.theMessage, 0, setup.theMessage.Length);
        while (port.BytesToRead < 0) ;
        port.Read(received.theMessage, 0, received.theMessage.Length);
        setup.theMessage = setup.Package();
        port.Write(setup.theMessage, 0, setup.theMessage.Length);
        while (port.BytesToRead < 0) ;
        port.Read(received.theMessage, 0, received.theMessage.Length);
        setup.theMessage = (byte[])Message.SNAPSHOT.Clone();
        port.Write(setup.theMessage, 0, setup.theMessage.Length);
        while (port.BytesToRead < 0) ;
        port.Read(received.theMessage, 0, received.theMessage.Length);
        setup.theMessage = (byte[])Message.BLANK.Clone();
        setup.theMessage[1] = (byte)Message.MessageTypes.GETPICTURE;
        setup.theMessage[2] = (byte)Message.PictureType.SNAPSHOT;
        port.Write(setup.theMessage, 0, setup.theMessage.Length);
        while (port.BytesToRead < 0) ;
        port.Read(received.theMessage, 0, received.theMessage.Length);
        while (port.BytesToRead < 0) ;
        port.Read(received.theMessage, 0, received.theMessage.Length);
        int length = (received.theMessage[5] << 16) + (received.theMessage[4] << 8) + received.theMessage[3];
        length /= data.theMessage.Length-6;
        byte[] temp = {0xaa, 0x0e, 0x00, 0x00, 0x00, 0x00};
        port.DiscardInBuffer();
        port.Write(temp, 0, temp.Length);

        int next = 0;
        int bytes;

        for (int i = 0; i < length; i++)
        {
            if ((bytes = port.BytesToRead) > 0)
            {
                port.Read(data.theMessage, 0, data.theMessage.Length);
                if (bytes < data.theMessage.Length)
                {
                    photo.Write(data.theMessage, 4, bytes - 6);
                }
                else
                {
                    photo.Write(data.theMessage, 4, data.theMessage.Length - 6);
                }
                photo.Flush();
            }


            next = ((data.theMessage[1] << 8) + data.theMessage[0]) + 1;

            byte[] nextBytes = System.BitConverter.GetBytes(next);

            if (length - i == 1)
            {
                temp[4] = temp[5] = 0xf0;
            }
            else
            {
                temp[4] = nextBytes[0];
                temp[5] = nextBytes[1];
            }

            port.Write(temp, 0, temp.Length);
        }

        progressBar1.Value = 1.0;
        photo.Flush();
        photo.Close();
        port.Close();
        progressBar1.Visibility = Visibility.Hidden;

    }

Вот таблица данных камеры, которая описывает протокол.http://www.4dsystems.com.au/downloads/micro-CAM/Docs/uCAM-DS-rev7.pdf

1 Ответ

1 голос
/ 03 февраля 2012
while (port.BytesToRead < 0) ;
port.Read(received.theMessage, 0, received.theMessage.Length);

Не означает, что вы будете читать received.theMessage.Length байтов.это может быть что угодно между 1 & received.theMessage.Length.Вам следует проверить возвращаемое значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...