Проблемы со связью через COM-порт, Text To ASCII - PullRequest
0 голосов
/ 10 сентября 2018

Я делаю простую программу для отправки информации с ПК на 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();
    }

1 Ответ

0 голосов
/ 11 сентября 2018

Проблема в том, что вы читаете каждый раз, когда нажимаете кнопку, и, возможно, не получили все. Вы должны использовать событие SerialPort class '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);
    });
}
...