Использование одного и того же последовательного порта в двух разных формах - PullRequest
0 голосов
/ 11 июня 2011

У меня есть две формы = Form1.CS и SMS.CS в первой форме (Form1) я настроил и готов к работе serialport1. У меня есть кнопка, которая называется отправить сообщение. Эта кнопка открывает новую форму под названием SMS.cs.

private void SMS_Click(object sender, EventArgs e)
    {
        SMS settings = new SMS();
        settings.ShowDialog();
    }

Я хотел бы использовать мой настроенный serialport1 для форм: Form1 и form SMS.cs. Также возможно получить из формы данные SMS и отправить их, используя serialport1 в Form1, например:

 private void SMS_Click(object sender, EventArgs e)
    {
        SMS settings = new SMS();
        settings.ShowDialog();
        SerialPort1.Writeln(Data from form SMS)
    }

но я не знаю, как это сделать. На мой взгляд, лучшая идея - отправлять данные напрямую из формы SMS.

Edit:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class SMSForm : Form
    {
        SerialPort SerialP;

        public SMSForm(Object SerialP)
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) 
        {
            SerialP.WriteLine("ATI");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Чтобы использовать один и тот же SerialPort в двух формах, вам нужно отправить ссылку на SerialPort во вторую форму.

Самый простой способ - добавить в форму SMS новый конструктор, который принимает SerialPort, сохранить его в переменной-члене и использовать его.

Где вы делаете

SMS settings = new SMS();

вам действительно нужно сделать это:

SMS settings = new SMS(SerialPort1);
0 голосов
/ 11 июня 2011

Form1 - это контроллер SerialPort, то есть Form1 настраивает SerialPort. Если у вас есть событие, которое влияет на SerialPort, например, `SerialPort1.Writeln ', вы должны передать ссылку на метод в конструктор диалога. Это будет логически разделять классы, пока разделяет методы.

Вы можете создать собственный объект EventArgs для передачи строки обратно в ваш SerialPort:

public class WriteToSerialPortEventArgs : EventArgs
{
    public WriteToSerialPortEventArgs (string Write)
    { WriteBytes = Encoding.GetBytes(write); }  // simplified - see MSDN for more options 

    public byte[] WriteBytes
    { get; private set; }   
}

Form1 образец делегата события передан в ваш диалог SMS:

void OnWriteToSerialPort(object sender, WriteToSerialPortEventArgs e )
{
    SerialPort1.WriteLine(e.WriteBytes);
}

Напишите ваш конструктор SMS:

// field
Action<object, WriteToSerialPortEventArgs> writeDelegate;

public SMS (Action<object, WriteToSerialPortEventArgs> writeDelegate)
{
    this.writeDelegate = writeDelegate;
    this.button1.Click += new EventHandler(button1_Click);
}

... делегат события SMS:

void button1_Click(object sender, EventArgs e)
{
    writeDelegate.Invoke(sender, new WriteToSerialPortEventArgs (txtBox.Text);
}

Технически, вам не нужна полная сигнатура метода Invoke(...). Я включил его для полноты и можно записать как:

writeDelegate(sender, new WriteToSerialPortEventArgs (txtBox.Text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...