Используйте два последовательных порта на одном COM-порту - WPF C # - PullRequest
0 голосов
/ 16 июля 2011

У меня есть приложение для взвешивания, где я использую последовательный порт для получения весов от взвешивания.

Мне нужно взять весы два раза. Один с пустым грузовиком, а затем с загруженным грузовиком. Мне просто интересно, могу ли я использовать два последовательных порта, один для взвешивания пустого грузовика, а другой для взвешивания загруженного? что-то вроде

 spWeighIn = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
 spWeighOut = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);

и используйте их одновременно

Спасибо

Это мой код:

    SerialPort spWeigh;
    string strResponseWeigh;

    private delegate void SetTextDeleg(string text);

    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        spWeigh = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
        spWeigh.RtsEnable = false;
        spWeigh.DtrEnable = false;
        spWeigh.Handshake = Handshake.None;
        spWeigh.ReadTimeout = 10000;   
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if (!spWeigh.IsOpen)
            spWeigh.Open();
        spWeigh.DataReceived += new SerialDataReceivedEventHandler(spWeigh_DataInReceived);
        spWeigh.Write("W");   
    }

    void spWeigh_DataInReceived(object sender, SerialDataReceivedEventArgs e)
    {
        strResponseWeigh = spWeigh.ReadLine();         
        string wt = strResponseWeigh.Substring(5, 7);
        this.TxtFrstWt.Dispatcher.BeginInvoke(new SetTextDeleg(sin_DataReceived), new object[] { wt });
    }

    private void sin_DataReceived(string data)
    {
        TxtFrstWt.Text = data.Trim();
        TxtDateIn.Text = DateTime.Now.ToString("dd/MM/yyyy");         
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        if (!spWeigh.IsOpen)
            spWeigh.Open();
        spWeigh.DataReceived += new SerialDataReceivedEventHandler(spWeigh_DataOutReceived);
        spWeigh.Write("W");   
    }

    void spWeigh_DataOutReceived(object sender, SerialDataReceivedEventArgs e)
    {
        strResponseWeigh = spWeigh.ReadLine();               
        string wt = strResponseWeigh.Substring(5, 7);               
        this.TxtFrstWt.Dispatcher.BeginInvoke(new SetTextDeleg(sout_DataReceived), new object[] { wt });
    }
    private void sout_DataReceived(string data)
    {
        TxtScndryWt.Text = data.Trim();
        TxtDateOut.Text = DateTime.Now.ToString("dd/MM/yyyy");
    }
}

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Дайте мне посмотреть, правильно ли я понял.

Вы говорите, что у вас есть устройство, подключенное к последовательному порту, и вам нужно дважды прочитать информацию оттуда, верно?

Ваш код немного противоречив при работе с этим. Я бы повторил это немного больше так:

SerialPort spWeigh;
string strResponseWeigh;

private delegate void SetTextDeleg(string text);

public MainWindow()
{
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    spWeigh = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
    spWeigh.RtsEnable = false;
    spWeigh.DtrEnable = false;
    spWeigh.Handshake = Handshake.None;
    spWeigh.ReadTimeout = 10000; 
    spWeigh.DataReceived += spWeigh_DataInReceived;
    spWeigh.Open();
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    spWeigh.Write("W"); 
}

void spWeigh_DataInReceived(object sender, SerialDataReceivedEventArgs e)
{
    strResponseWeigh = spWeigh.ReadLine();
    string wt = strResponseWeigh.Substring(5, 7);
    this.TxtFrstWt.Dispatcher.BeginInvoke(new SetTextDeleg(sin_DataReceived), new object[] { wt });
}

private void sin_DataReceived(string data)
{
    TxtFrstWt.Text = data.Trim();
    TxtDateIn.Text = DateTime.Now.ToString("dd/MM/yyyy");
}

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

spWeigh.DataReceived += spWeigh_DataInReceived;

появляется в обработчике событий MainWindow_Loaded.

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

Если я правильно понимаю процесс, каждый раз, когда устройство получает W через последовательный интерфейс, оно выливает вес в весы через тот же последовательный порт, верно?

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

1 голос
/ 16 июля 2011

Я не думаю, что это сработает. Зачем вам вообще нужно два соединения с последовательным портом?

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

Почему вы хотите использовать два экземпляра SerialPort? Вы не должны сохранять результат внутри этих объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...