Проблемы со связью через com-порт, текст в ascii

Я делаю простую программу для отправки информации с ПК на COM-порт. До сих пор я установил соединение между ПК и COM-портом, и я могу отправлять информацию и видеть, что порт получил, но у меня есть две проблемы, первая заключается в том, что когда я отправляю информацию на фактический COM-порт (COM-порт к USB-кабелю сделано эхо сигнала) первый раз я вся информация получена. Затем он становится случайным, иногда снова, все, что я написал, иногда только первый символ. А иногда и ничего. Я предполагаю, что это происходит потому, что я не выставлял тайм-аутов или чего-то еще. Было бы неплохо помочь с этим.

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

Вот код:

   public Form1()
    {
        InitializeComponent();
    }
    //BTN new serial port creation - port taken from comport text box
    private void button1_Click(object sender, EventArgs e)
    {
        System.IO.Ports.SerialPort sport = new System.IO.Ports.SerialPort(comport.Text, 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);

        //opening the com port and sending the information from textbox1
        try
        {
                sport.Open();
            sport.Write(textBox1.Text);

        }
        //if there is an error - show error message 
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        //Adding timestamp to received info
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();
        //reading the information form the com port
        textBox2.AppendText("[" + dtn + "] " + "Recieved: " + sport.ReadExisting() + "\n");
        //closing the port
        sport.Close();
    }
0
0
121
1

Ответы 1

Проблема в том, что вы читаете каждый раз, когда нажимаете кнопку, и, возможно, не все получили. Для получения данных следует использовать событие SerialPort класса DataReceived. Событие срабатывает каждый раз, когда данные поступают через ваш COM-порт, поэтому вы можете нажать кнопку, чтобы записать в порт, тогда, когда данные поступят, вы должны увидеть, что событие срабатывает с вашими данными.

У Microsoft есть хорошее определение и пример здесь.

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

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string Data = serialPort1.ReadExisting();

    this.Invoke((MethodInvoker)delegate
    {
        textBox2.AppendText(Data);
    });
}

Чтобы расширить это, причина, по которой он, вероятно, работает «иногда», заключается в том, что из-за того, как процесс запланирован, может быть значительная задержка между символами, поступающими на последовательный порт, по сравнению с тем, когда процесс получает процессорное время. Последовательный порт, работающий на скорости 9600 бод, требует немного больше 1 миллисекунды для передачи байта.

rm5248 12.09.2018 15:24

Я попробовал предложенный код и получил тот же результат, что заставило меня усомниться в том, какой USB-кабель я использую. Отражает ли он сигнал слишком быстро и не сохраняет его достаточно долго, чтобы программа его прочитала. Я собираюсь в ближайшие дни попробовать ПЛК и увидеть реальные результаты. Если нет, возможно, мне следует найти способ отложить процесс чтения после нажатия кнопки. Добавление таймера или счетчика или чего-то еще, чтобы отложить процесс чтения на определенное время. Спасибо всем, кто ответил, буду держать вас в курсе.

Alexander 12.09.2018 17:35

Другие вопросы по теме