Проблема с SerialPort в приложении C # - PullRequest
2 голосов
/ 24 февраля 2010

Я сделал приложение на C #, которое отправляет 11 байтов данных на последовательный порт, используя:

            port = new SerialPort("COM1");
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.ReadTimeout = 1000;
            port.WriteTimeout = 1000;
            port.Open();

            byte[] buffer = new byte[11];
            buffer[0] = 0;
            buffer[1] = 0;
            buffer[2] = 0;
            buffer[3] = 3;
            buffer[4] = 2;
            buffer[5] = 4;
            buffer[6] = 1;
            buffer[7] = 20;
            buffer[8] = 50;
            buffer[9] = 0;
            buffer[10] = 120;
            port.Write(buffer, 0, 11);

Затем я написал другое приложение, чтобы проверить предыдущее. Я хотел бы проверить, были ли правильно отправлены 11 байтов. В этом приложении я использую:

        using (SerialPort port = new SerialPort("COM1"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            for (; ; )
            {
                byte[] b = new byte[11];
                port.Read(b, 0, 11);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 11; ++i)
                {
                    sb.Append(b[i]);
                    sb.Append(" ");
                }
                Console.WriteLine(sb.ToString());
            }
        }

для получения байтов. Проблема в том, что после отправки что-то вроде этого:

0 0 0 3 2 4 1 20 50 0 120

Я получаю:

0 0 0 0 0 0 0 0 0 0 0
0 0 3 2 1 4 20 50 0 120 0

Почему это происходит? Что за ошибка в моем коде? Спасибо

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Вы не проверяете результат от port.Read(). Он возвращает количество байтов прочитанных , а не количество байтов запрошенных . Выходной контур должен использовать этот результат в качестве верхнего предела.

Несмотря на то, что вы установили тайм-ауты на стороне отправки, они также понадобятся и на ридере.

1 голос
/ 25 февраля 2010

Чтобы проверить, что происходит с последовательным соединением на моем компьютере, я использую два инструмента:

  • com0com : эмулятор, который создает два последовательных порта на компьютере, которые могут взаимодействовать друг с другом. Единственный недостаток, с которым я столкнулся, это то, что вы должны установить оба COM-порта ниже 10.

  • Free Serial Port Monitor : он отслеживает ком-порт и может отображать каждый байт, проходящий по линии. Единственный недостаток, с которым я столкнулся, это то, что иногда возникают проблемы с отключением, и он запускается снова только после перезагрузки всего компьютера. Поэтому, если вы начинаете сеанс с ним, убедитесь, что вы не отключили или случайно не закрыли приложение перед тем, как закрывать соединение в своем тестовом приложении.

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