Проблема при попытке получить данные из последовательного порта - PullRequest
0 голосов
/ 22 мая 2018

Привет, у меня есть порт, подключенный к моему компьютеру, который постоянно отправляет данные, и моя цель - получить данные с него и распечатать их.Проблема в том, что я не знаю, какой тип данных он отправляет и как мне его читать ...

private void Button_Receive_Data_Click(object sender, EventArgs e)
    {
        GroupBox_Serial_Transmit.Enabled = false;
        #region
        string Port_Name = ComboBox_Available_SerialPorts.SelectedItem.ToString();
        int Baud_Rate = Convert.ToInt32(ComboBox_Standard_Baundrates.SelectedItem);


        COMport = new SerialPort(Port_Name, Baud_Rate);
        #endregion
        COMport.ReadTimeout = 3500; //3.5 sekundes



        try
        {
            COMport.Open();
            if (COMport.IsOpen == true)
            {
                TextBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                ReceivedData = COMport.ReadExisting();
                this.Invoke(new EventHandler(ShowData));

                GroupBox_Serial_Transmit.Enabled = true;

            }
            else
            {
                MessageBox.Show("Unable to Write to COM port ");
                GroupBox_Serial_Transmit.Enabled = true;
                COMport.Close();
            }
        }
        catch (TimeoutException SerialTimeOutException)
        {
            MessageBox.Show(SerialTimeOutException.ToString());
            COMport.Close();

            GroupBox_Serial_Transmit.Enabled = true;
        }
    }

    private void ShowData(object sender, EventArgs e)
    {
        TextBox_System_Log.Text = ReceivedData;
    }

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

1 Ответ

0 голосов
/ 22 мая 2018

Все, на что вы можете надеяться, это то, что сериал передает читаемый текстВ этом случае ваша основная цель - определить скорость передачи данных.Поскольку вы новичок, просто установите Docklight (или, возможно, Picocom или любой другой рабочий инструмент, который у вас есть).Попробуйте каждую скорость в бодах, начиная с самой высокой (115200) [ отметьте примечания ниже ] и 8 данных, спускаясь вниз, и для каждой скорости в бодах, которую вы проверяете таким образом, возитесь со стоп-битами и четностью.

В качестве альтернативы (спасибо Тревору за вдохновение) вы можете запустить инструмент для проверки повторения 1 и 0.Например, если ваш поток 110011001100000011110011, хорошим кандидатом является 115200/2.С 111000111000111000000111000111111111 хорошим кандидатом является 115200/3 и т. Д.

Ради полноты описанный выше метод может быть неубедительным, поскольку данные «могут» на самом деле быть 1100110011001100. Это не имеет особого смысла, поскольку это неэффективнокодирование, но в соответствии с исходной проблемой, «мы не знаем», что посылает сериал.

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

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

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


Примечания:

Несмотря на то, что вы можете получить некоторую информацию об устройстве (например, скорость передачи 9600), описанные выше шаги по-прежнему рекомендуются.Infact OP наткнулся на неверную информацию, тогда как 9600 не сработало, 115200 сработало.

115200 считается максимальным для UART.Но с правильным интерфейсом вы можете достичь 230400 и 460800 ... и, возможно, больше.Чтобы этот ответ был ориентирован на будущее, проверьте , какой максимальный интерфейс поддерживается вашим аппаратным и последовательным драйверами.

...