Ошибка исключения ввода-вывода при использовании serialport.open ()

ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ

Все время это была наша прошивка. До некоторой степени смущает, но я рад, что мы можем двигаться вперед, и я могу отложить изучение Java на другой день. Мой ответ ниже.

ОБНОВЛЕНИЕ

Так что я более или менее отказался от этого. Я думаю, что это ошибка API, но у меня нет ни времени, ни ресурсов, ни навыков, чтобы разобраться в ней. Я думаю, что существует какое-то оборудование, которому Windows просто показывает средний палец. Я загрузил Eclipse, переключился на Java и попробую проверить, работает ли это. Если нет, ты снова увидишь меня здесь. Тем не менее, я бы очень хотел решить эту проблему, и поэтому, если у кого-то есть время или желание углубиться в это, я хотел бы увидеть, что вы придумали. Очевидно, я буду возвращаться сюда время от времени. Пожалуйста, убедитесь, что вы отметили меня @ в своих комментариях, чтобы я был предупрежден.


ОРИГИНАЛЬНАЯ ЗАПИСЬ

Я знаю, что этой проблемой занимаются еще несколько человек, но я надеялся, что кто-нибудь сможет мне помочь. Я пытаюсь подключиться к COM-порту, но получаю сообщение / O исключение, когда я пытаюсь использовать команду serialport.Open():

System.IO.IOException: The parameter is incorrect.

   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.InitializeDCB(Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Boolean discardNull)
   at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
   at System.IO.Ports.SerialPort.Open()
   at *programtitlehere.cs*:line 90

Я использую Stellaris LM4F232 для имитации COM-порта. Я могу открывать, получать доступ и получать хорошие результаты с помощью Termite (терминальной программы), но всякий раз, когда я пытаюсь использовать Visual Studio, она даже не подключается, и я получаю эту ошибку. Сейчас я даже толком не знаю, что означает эта ошибка, и, несмотря на попытки прочитать где-нибудь еще, я все еще чувствую себя потерянным.

Может ли кто-нибудь объяснить мне, что здесь происходит, и, может быть, я смогу попытаться понять это? Я могу включить больше кода, но, честно говоря, там немного; все свойства устройства последовательного порта в норме, и это происходит только с этим устройством (я могу использовать MSP430 без проблем с теми же деталями).

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

try
{
    serialPort1.PortName = "COM5";
    serialPort1.Open();
    if (serialPort1.IsOpen == true)
    {
        textBox1.Text = "CONNECTED";
    }
    else
    {
        textBox1.Text = "NOT CONNECTED";
    }
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex.ToString(), "ERROR");
}

а другие настройки выполняются с помощью диспетчера свойств (единственная разница в том, что скорость передачи установлена ​​на 230400; все остальные настройки по умолчанию). Я могу открыть COM4 с помощью этого (MSP430), который во всех смыслах и целях является идентичным устройством. Я могу открыть COM5 с помощью Termite, поэтому знаю, что соединение хорошее). И нет, я не пытаюсь открывать их одновременно. Если вам нужна дополнительная информация, дайте мне знать, и я могу опубликовать больше.

РЕДАКТИРОВАТЬ: Я нахожусь на третьем дне, пытаясь понять это, и все еще не повезло. Я действительно не понимаю, почему я могу получить доступ к этому COM-порту через терминальную программу, а не через свою собственную, когда, насколько я могу судить, нет абсолютно никакой разницы. Есть ли программа, которая может «исследовать» COM-порт, чтобы увидеть его свойства (кроме менеджера Windows, я имею в виду)? Я очень расстраиваюсь и как бы замираю в своем проекте, пока не разберусь в этом ...

РЕДАКТИРОВАТЬ2: Я нашел очевидное обходное решение, но мне еще предстоит заставить его работать здесь. Теперь я получаю несколько разных ошибок ввода-вывода, но, по крайней мере, это движение (не уверен, что это прогресс). Я также узнал, что это ошибка .NET, которая существует с 2.0. Я все равно буду рад любой помощи, но если я это выясню, я сообщу. Код Зака ​​(обходной путь, ссылка на который приведен выше) показан ниже:

using System;
using System.IO;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32.SafeHandles;

namespace SerialPortTester
{
    public class SerialPortFixer : IDisposable
    {
        public static void Execute(string portName)
        {
            using (new SerialPortFixer(portName))
            {
            }
        }

        #region IDisposable Members

        public void Dispose()
        {
            if (m_Handle != null)
            {
                m_Handle.Close();
                m_Handle = null;
            }
        }

        #endregion

        #region Implementation

        private const int DcbFlagAbortOnError = 14;
        private const int CommStateRetries = 10;
        private SafeFileHandle m_Handle;

        private SerialPortFixer(string portName)
        {
            const int dwFlagsAndAttributes = 0x40000000;
            const int dwAccess = unchecked((int) 0xC0000000);

            if ((portName == null) || !portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
            {
                throw new ArgumentException("Invalid Serial Port", "portName");
            }
            SafeFileHandle hFile = CreateFile(@"\\.\" + portName, dwAccess, 0, IntPtr.Zero, 3, dwFlagsAndAttributes,
                                              IntPtr.Zero);
            if (hFile.IsInvalid)
            {
                WinIoError();
            }
            try
            {
                int fileType = GetFileType(hFile);
                if ((fileType != 2) && (fileType != 0))
                {
                     throw new ArgumentException("Invalid Serial Port", "portName");
                }
                m_Handle = hFile;
                InitializeDcb();
            }
            catch
            {
                hFile.Close();
                m_Handle = null;
                throw;
            }
        }

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int FormatMessage(int dwFlags, HandleRef lpSource, int dwMessageId, int dwLanguageId,
                                                StringBuilder lpBuffer, int nSize, IntPtr arguments);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool GetCommState(SafeFileHandle hFile, ref Dcb lpDcb);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool SetCommState(SafeFileHandle hFile, ref Dcb lpDcb);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool ClearCommError(SafeFileHandle hFile, ref int lpErrors, ref Comstat lpStat);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode,
                                                        IntPtr securityAttrs, int dwCreationDisposition,
                                                        int dwFlagsAndAttributes, IntPtr hTemplateFile);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetFileType(SafeFileHandle hFile);

        private void InitializeDcb()
        {
            Dcb dcb = new Dcb();
            GetCommStateNative(ref dcb);
            dcb.Flags &= ~(1u << DcbFlagAbortOnError);
            SetCommStateNative(ref dcb);
        }

        private static string GetMessage(int errorCode)
        {
            StringBuilder lpBuffer = new StringBuilder(0x200);
            if (
                FormatMessage(0x3200, new HandleRef(null, IntPtr.Zero), errorCode, 0, lpBuffer, lpBuffer.Capacity,
                              IntPtr.Zero) != 0)
            {
                return lpBuffer.ToString();
            }
            return "Unknown Error";
        }

        private static int MakeHrFromErrorCode(int errorCode)
        {
            return (int) (0x80070000 | (uint) errorCode);
        }

        private static void WinIoError()
        {
            int errorCode = Marshal.GetLastWin32Error();
            throw new IOException(GetMessage(errorCode), MakeHrFromErrorCode(errorCode));
        }

        private void GetCommStateNative(ref Dcb lpDcb)
        {
            int commErrors = 0;
            Comstat comStat = new Comstat();

            for (int i = 0; i < CommStateRetries; i++)
            {
                if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
                {
                     WinIoError();
                }
                if (GetCommState(m_Handle, ref lpDcb))
                {
                     break;
                }
                if (i == CommStateRetries - 1)
                {
                     WinIoError();
                }
            }
        }

        private void SetCommStateNative(ref Dcb lpDcb)
        {
            int commErrors = 0;
            Comstat comStat = new Comstat();

            for (int i = 0; i < CommStateRetries; i++)
            {
                 if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
                 {
                     WinIoError();
                 }
                 if (SetCommState(m_Handle, ref lpDcb))
                 {
                     break;
                 }
                 if (i == CommStateRetries - 1)
                 {
                     WinIoError();
                 }
            }
        }

        #region Nested type: COMSTAT

        [StructLayout(LayoutKind.Sequential)]
        private struct Comstat
        {
            public readonly uint Flags;
            public readonly uint cbInQue;
            public readonly uint cbOutQue;
        }

        #endregion

        #region Nested type: DCB

        [StructLayout(LayoutKind.Sequential)]
        private struct Dcb
        {
            public readonly uint DCBlength;
            public readonly uint BaudRate;
            public uint Flags;
            public readonly ushort wReserved;
            public readonly ushort XonLim;
            public readonly ushort XoffLim;
            public readonly byte ByteSize;
            public readonly byte Parity;
            public readonly byte StopBits;
            public readonly byte XonChar;
            public readonly byte XoffChar;
            public readonly byte ErrorChar;
            public readonly byte EofChar;
            public readonly byte EvtChar;
            public readonly ushort wReserved1;
        }

        #endregion

        #endregion
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            SerialPortFixer.Execute("COM1");
            using (SerialPort port = new SerialPort("COM1"))
            {
                port.Write("test");
            }
        }
    }
}

РЕДАКТИРОВАТЬ 3: День 6: Я все еще занимаюсь этим. У меня мало воды, но я все еще борюсь. Я чувствую, что помощь обязательно должна быть на горизонте. Кто бы ни нашел этот журнал, верните мои останки в Канаду и найдите Николь. Скажи ей, что я люблю ее.

А если серьезно, я понятия не имею, что вызывает эту проблему. Мне интересно, чисто ли это на встроенной стороне; возможно, потому что это USB On-The-Go (OTG), или потому что устройство также может быть хостом. Кто-нибудь сталкивался с этой проблемой? Это не объясняет, почему я могу использовать Termite (программу-терминал для тех, кто просто присоединяется к нам). Я пытался найти программу терминала с открытым исходным кодом, которая а) работает и б) см. А). Как обычно, я сообщу, если обнаружу здесь проблему, поскольку теперь я нашел бесчисленное количество форумов, где, похоже, у людей была эта проблема, относящаяся к 2006 году.

EDIT4: согласно данному совету я загрузил программное обеспечение для мониторинга портов (у меня есть Eltima Serial Port Monitor), и это действительно похоже на проблему с бодами:

Снимок экрана с Eltima

Но, как ни странно, какую бы скорость я ни установил, он все равно не работает. А также может кто-нибудь объяснить, что означает «вверх / вниз»? Я пробовал погуглить, но ключевые слова слишком общие. Как обычно, я буду сообщать обо всех изменениях.

Кроме того, для записи, я могу подключиться с помощью Eltima на скорости 115200 бод (такой же, как Termite). К сожалению, в Visual Studio это не работает.

EDIT5: наш сюжет неожиданно изменился. Я отслеживал, что происходит, когда Termite подключается к рассматриваемому COM-порту и BLAM! Termite выдает ту же ошибку, что и моя программа, но игнорирует ее. Гений, правда? Коряво, но работает. Теперь мне нужно научиться игнорировать исключения IOExceptions. Я сообщу, когда выясню.

EDIT6: Как оказалось, это проблема скорости передачи данных, но она идет глубже. Я использовал программное обеспечение Eltima Serial Port Monitoring, оно очень интуитивно понятное и простое в использовании. Я бы рекомендовал это. После некоторых исследований я узнал, что нельзя игнорировать это исключение и по-прежнему подключается к последовательному порту с помощью библиотеки .NET.

Поэтому мне нужно глубже изучить Win32 API и написать свой собственный. Я нашел несколько страниц, которые касаются этого, но, честно говоря, я никогда раньше не делал ничего подобного, так что может пройти некоторое время, прежде чем я отчитаюсь, но я обязательно разберусь с этим и свяжусь со всеми. Слишком много людей страдают от этой проблемы.

Я нашел довольно много форумов и веб-сайтов, на которых я вижу те же самые симптомы, но на самом деле никто ничего не сделал, кроме как сказать: «Да, .NET - отстой». Я планирую написать полный класс статической библиотеки, а затем опубликовать его на своем веб-сайте, здесь и везде, где я могу. Надеюсь, .NET заметит (эта ошибка существует с 2.0).


person tmwoods    schedule 14.02.2013    source источник
comment
Какие настройки вы используете для подключения? Можем ли мы увидеть код?   -  person Paul Ruane    schedule 15.02.2013
comment
Я просто добавил свой код в исходный пост. Я не знаю, как добавить код в комментарии ...   -  person tmwoods    schedule 15.02.2013
comment
Я только предполагаю, что ваши свойства как-то не так. Возможно, попробуйте снизить скорость до 9600 бод.   -  person Paul Ruane    schedule 15.02.2013
comment
Нет кубиков :( То же сообщение об ошибке.   -  person tmwoods    schedule 15.02.2013
comment
Указывает ли сообщение об ошибке на что-нибудь конкретное? У меня нет опыта в этом, и я не совсем уверен, на что я смотрю.   -  person tmwoods    schedule 15.02.2013
comment
Если вы перейдете в Панель управленияИнструменты администрированияУправление компьютеромДиспетчер устройствПорты , найдите виртуальный порт и откройте его свойства. Вы должны увидеть его настройки на вкладке Настройки порта. Я бы попробовал подобрать эти настройки.   -  person Paul Ruane    schedule 15.02.2013
comment
Так я начал, и все идентично.   -  person tmwoods    schedule 15.02.2013
comment
Гм. Вы пробовали выключить и снова включить?   -  person Paul Ruane    schedule 15.02.2013
comment
Я перепробовал все «очевидные» методы; Я думаю, что это идет глубже, и я надеялся, что проблема каким-то образом была показана в коде ввода-вывода. Я собираюсь быть в движении несколько часов и, возможно, не вернусь сразу. Спасибо за попытку :)   -  person tmwoods    schedule 15.02.2013
comment
Привет, tmwoods! Не могли бы вы отправить код Зака ​​в свой вопрос? Спасибо, в вопросы / ответы StackOverflow (и суперпользователя) принято включать краткое изложение содержимого ссылки или основные моменты, которые конкретно отвечают на вопрос. Цель сайтов SE - стать источником знаний и ответов на долгие годы. Имея ссылку на ответ только по ссылке, люди должны покопаться на другом ресурсе, чтобы найти ответ, в котором он / она не может быть уверен. Самое главное, что если ваша ссылка когда-либо сломается, ваш ответ будет бесполезен для всех, кто посетит эту страницу в будущем. Удачи!   -  person Jeremy Thompson    schedule 19.02.2013
comment
Конечно я буду. Спасибо за совет :)   -  person tmwoods    schedule 19.02.2013
comment
Просто интересно ... Вы пробовали запускать VS в повышенном режиме (например, в качестве администратора)?   -  person atlaste    schedule 19.02.2013
comment
Я нет; но я обязательно попробую это в следующий раз, когда у меня будет шанс :) РЕДАКТИРОВАТЬ: Я побежал в лабораторию, чтобы попробовать. Не повезло :(   -  person tmwoods    schedule 19.02.2013
comment
3 вещи, которые я бы попробовал: 1. дать права администратора исполняемому файлу, который вы запускаете, а не только визуальной студии 2. назначить другой номер порта, попробовать использовать COM1-COM4, ​​некоторые устройства разработаны (не очень хорошо) только для работы с "низкими" ком-портами. 3. попробуйте использовать это небольшое приложение с открытым исходным кодом для подключения к msmvps.com/ блоги / coad / archive / 2005/03/23 / SerialPort- 2800_RS_2D00_232-Serial-COM-Port_2900 -in-C_2300 _-. NET.aspx   -  person Adiel Yaacov    schedule 21.02.2013
comment
Я определенно буду; Я пробовал второй (изменение номеров портов), но я очень рад попробовать ваше приложение с открытым исходным кодом. Как только я сегодня доберусь до лаборатории (надеюсь), я доложу.   -  person tmwoods    schedule 21.02.2013
comment
Увы, не повезло. Выдает ту же ошибку. Пока Termite - единственная программа, которая его откроет (попробовала Realterm и PuTTy, а также три сторонних приложения, это с открытым исходным кодом и мое собственное). Облом.   -  person tmwoods    schedule 21.02.2013
comment
Я видел аналогичные проблемы с многочисленным последовательным портом USB, когда любой код .NET не смог бы открыть его, если бы он ранее использовался какой-либо собственной программой Win32. Единственное решение, которое у меня было, - это снова подключить USB-порт.   -  person Deanna    schedule 28.02.2013
comment
Вы имеете в виду физически повторно подключить его? Потому что у меня это не сработало. Или это какой-то жаргон, который я слишком новичок, чтобы понимать? (Надеюсь на последнее) ...   -  person tmwoods    schedule 28.02.2013
comment
@tmwoods Да, как в плагине снова.   -  person Deanna    schedule 11.03.2013
comment
@Deanna: В таком случае, да, я пробовала это. Я также пробовал запустить это в безопасном режиме через среду Linux и несколько других, чтобы убедиться, что он не используется во вторичной программе. Все равно не повезло :(   -  person tmwoods    schedule 11.03.2013
comment
@tmwoods привет! я столкнулся с той же проблемой, что и вы !!! Я использую STM32F2xx для эмуляции его как VCP, и у меня такая же проблема, как и у вас, не могу открыть в .NET, но открывается в терминале. Могу ли я узнать, как вы решили часть прошивки?   -  person Tim    schedule 20.10.2014
comment
@ Тим Привет Тим! Дело в том, что мы использовали старую библиотеку для чипа TI (я вижу, вы используете ST). Мы просто заменили ее на более новую библиотеку, и она заработала. Я знаю, что это не те новости, которые вам нужны, чтобы решить вашу проблему. Я попытаюсь взглянуть на две библиотеки, чтобы увидеть какие-либо различия, но, честно говоря, прошло много времени с тех пор, как я смотрел этот код, и это немного нечетко относительно того, что на самом деле изменилось. Извините, я больше ничем не помог!   -  person tmwoods    schedule 20.10.2014
comment
@tmwoods привет! Мне удалось отследить проблему в моей прошивке, когда ПК открывает связь через последовательный порт, он запрашивает информацию о прошивке VCP для скорости передачи, четности и длины битов данных, в моей прошивке обратный вызов для связи VCP не содержит информации об этих вещи, и когда ПК пытается открыть, это вызывает проблему, потому что микропрограммный VCP не предоставляет никакой из той информации, которая вызывает ошибку! Я думаю, что это проблема, так как я исправил это до сих пор, у меня нет проблемы! Не могли бы вы проверить прошивку ur, если такое же поведение существует между вашей старой и новой прошивкой? подтвердить?   -  person Tim    schedule 31.10.2014
comment
@Tim Я все это прямо в прошивке заявил (т.е. статично, а не динамично). Я установил эти значения постоянно и проделал то же самое в своем коде Visual Studio (я делал Windows Forms). Я сделал это с обеими (старой и новой) версиями моей прошивки.   -  person tmwoods    schedule 31.10.2014
comment
@tmwoods, тогда я не уверен! ха-ха, потому что в моей прошивке (с использованием STM32F2xx) есть обратный вызов для USB VCP (CDC_Control_FS - ›cmd == CDC_GET_LINE_CODING), здесь я не объявляю свою скорость передачи, четность и бит данных! когда ПК откроет последовательный порт, прошивка выполнит обратный вызов этой функции, чтобы проверить параметры! Думаю, моя проблема и ваша другая?   -  person Tim    schedule 04.11.2014
comment
Привет @tmwoods, Вы пробовали запустить GC.Collect() до получения информации с порта?   -  person jmvtrinidad    schedule 08.03.2017


Ответы (5)


Это исходит от драйвера последовательного порта; он недоволен одной из настроек. Поскольку скорость передачи является хорошим кандидатом, драйверы, как правило, разрешают только до 115200. Хотя это не должно быть ограничением, если это продукт с выделенной шиной CAN.

Лучший способ решить эту проблему - использовать утилиту Portmon от Sysinternals; вы можете видеть, что отправляется водителю. Соблюдайте это для завершения в первую очередь; это ваш базовый уровень заведомо работоспособного. Затем возитесь со свойствами SerialPort, пока команды инициализации, как вы видите их в PortMon, отправленные вашей программой, не совпадут с командами Termite. Только ценности, а не порядок. Если и это не сработает, отнесите его на стоянку, несколько раз вернитесь на машине и купите другой бренд.


Обновление: это определенно похоже на проблему с бодами. Это проблема .NET; он не будет игнорировать код возврата ошибки драйвера, как это делают ваши программы-эмуляторы терминала. Фактическое значение не имеет значения, поскольку вы разговариваете с эмулированным последовательным портом. Однако возможна проблема со скоростью шины CAN; ставки варьируются, и мне непонятно, как они согласовываются. Раньше это обычно делалось с помощью DIP-переключателей, и вполне может быть, что драйвер хочет, чтобы вы указали скорость через настройку скорости передачи. Об этом должно быть что-то написано на коробке или в инструкции. Типичные скорости - 40, 250 или 500 кбит / с. Производитель наверняка знал бы; позвоните им.

person Hans Passant    schedule 15.02.2013
comment
Вечером меня не будет в офисе, но, когда я приду завтра, я попробую :) - person tmwoods; 15.02.2013
comment
Можете ли вы порекомендовать более современный пакет программного обеспечения для мониторинга портов? Единственная версия, которую я могу найти, несовместима с Windows 7 (похоже, последний раз они обновляли это программное обеспечение для Win98). В нем говорится, что на него распространяется авторское право 2012 года, но я не могу заставить его подключиться, и все файлы справки отсутствуют или объяснены для среды Win98. - person tmwoods; 22.02.2013
comment
Я попробовал Eltima Serial Port Monitor, см. Основную часть вопроса выше. - person tmwoods; 22.02.2013
comment
Эээээ, мы говорим об утилите PortMon от SysInternals? Он наверняка работает в Windows 7. Обратите внимание, что вы должны запустить его с повышенными правами, щелкните правой кнопкой мыши + Запуск от имени администратора. - person Hans Passant; 22.02.2013
comment
Я уже удалил его, но уверен, что это устранило бы проблему. Eltima отлично работает, и я вижу, где возникает недопустимый параметр, как с Termite, так и с моей программой. Теперь я пытаюсь понять, как безопасно игнорировать исключение и открыть порт. Я не хочу отмечать вопрос как решенный, пока не сделаю это. Спасибо, мы приветствуем любой вклад :) - person tmwoods; 22.02.2013
comment
Поэтому я написал программу для запуска тестового соединения со скоростью от 1200 до 500 000 бит / с (с подходящей паузой между ними). Потребовалось время, чтобы запустить все это, но не повезло (я несколько раз останавливал его, чтобы проверить соединение с Termite на всякий случай). Эта ветка объясняет, в чем, на самом деле, я думаю, проблема. Итак, что я собираюсь сделать, это попытаться написать несколько пользовательских функций с использованием Win32 API, а затем выпустить их, потому что слишком многие люди страдают от этого. Я сообщу, вероятно, в течение недели, когда я либо проиграю, либо выполню это. - person tmwoods; 23.02.2013
comment
BaudRate для comports почти всегда должен быть установлен на 9600, попробуйте это, пожалуйста - person Max; 25.02.2013

Я столкнулся с такой же ситуацией. Я пытаюсь подключить последовательный порт к моему USB-ключу 3G (Huawei E303F) в / dev / ttyUSB0. Я использую Mono в Raspbian (Raspberry Pi 2). На моем компьютере разработки и macOS моя программа работает нормально. Но когда я развернул его в Raspbian, я получил ошибку IOException Broken Pipe в Serial.Open ().

На отладку у меня ушло три дня, и я перепробовал все возможные решения. Наконец я обнаружил, что мне нужно установить ...

serialPort.DtrEnable = true;
serialPort.RtsEnable = true;

Перед вызовом .Open ().

person tanutapi    schedule 08.01.2017

Я столкнулся с аналогичной проблемой, описанной в этой ветке, но мне удалось ее решить!

Я использую STM32F2xx для VCP!

И действительно это была проблема с моей прошивкой. Я забыл включить настройки последовательного порта в свой обратный вызов USB!

Процесс подключения последовательного порта от ПК и прошивки:

  1. Когда ПК открывает связь через последовательный порт, ПК отправляет некоторую команду в «конечную точку конфигурации».
  2. В прошивке у него будет обратный вызов, и прошивка предоставит всю информацию о USB (они называют это дескриптором USB)
  3. Информация USB - это конфигурация каждой конечной точки (например, задержка, размер передаваемых данных и тип USB - высокая или низкая скорость).
  4. Как только прошивка завершит отправку всей информации, ПК подтвердит, и USB-соединение будет успешно установлено.
  5. Затем ПК отправит команду для получения настроек последовательного порта из прошивки.
  6. Настройки последовательного порта - это скорость передачи данных, четность данных и длина в битах.
  7. В прошивке он должен отправить настройки последовательного порта обратно на ПК (здесь происходит моя ошибка; я не отправлял никакие настройки последовательного порта обратно на ПК)
  8. В случае успеха ПК начнет связь через последовательный порт!
  9. В случае неудачи ПК выдаст ошибку открытого последовательного порта (но обратите внимание, что эту ошибку иногда обходят)

В коде прошивки STM32:

static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
    switch (cmd) {
       case CDC_GET_LINE_CODING:
        {
            // I was missing this part
            uint32_t baudrate = 9600;
            pbuf[0] = (uint8_t)(baudrate);
            pbuf[1] = (uint8_t)(baudrate >> 8);
            pbuf[2] = (uint8_t)(baudrate >> 16);
            pbuf[3] = (uint8_t)(baudrate >> 24);
            pbuf[4] = 0;
            pbuf[5] = 0;
            pbuf[6] = 8;
            break;
        }:
....
person Tim    schedule 14.11.2014

Вот и подошла к концу наша захватывающая сказка. Все время это была прошивка (т.е. код на встроенном устройстве). Мы изменили несколько функций и, по сути, порылись, порезали, добавили и полностью очистили код, и вуаля, код работает. Этот рисунок неплохо резюмирует. Прокляните прошивку !!

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

person tmwoods    schedule 19.03.2013
comment
Re изменил несколько функций: Вы можете быть более конкретными? Дальше особо нечего. - person Peter Mortensen; 14.11.2019
comment
(Ссылка кажется неработающей - время ожидания соединения истекло. Сервер weknowmemes.com слишком долго отвечает.) - person Peter Mortensen; 14.11.2019
comment
Это была просто ссылка на мем «Мой код не работает / Я не знаю почему / Мой код работает / Я не знаю почему». - person tmwoods; 14.11.2019
comment
Насколько «изменил несколько функций», честно говоря, я понятия не имею. Это было давно, и я понял, насколько бесполезно я это писал. - person tmwoods; 14.11.2019

У меня была такая же проблема, и я установил скорость передачи 1 исправил!

person ernesto torres    schedule 08.05.2018
comment
Как ни странно, у меня это тоже сработало. Я хотел бы знать, почему. - person danpop; 16.04.2019