簡體   English   中英

在同一個 COM 端口上使用兩個串口 - WPF C#

[英]Use two serial ports on same COM port - WPF C#

我有一個地磅應用程序,我使用串行端口從地磅獲取重量。

我需要舉重兩次。 一輛是空卡車,然后是滿載卡車。 我只是想知道我是否可以使用兩個串口,一個用於稱重空卡車,另一個用於稱重裝載一個? 就像是

 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");
    }
}

我認為這行不通。 為什么你甚至需要兩個到串口的連接呢?

以任何方式從端口讀取重量並保存結果。 然后用加載的重復該步驟。 計算差異,你就完成了。

為什么要使用SerialPort的兩個實例? 您不必將結果保存在這些對象中。

讓我看看我是否做對了。

你是說你有一個連接到串口的設備,你需要從那里讀取兩次信息,對吧?

處理該問題時,您的代碼有些混亂。 我會像這樣重做它:

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”,結果應該出現在數據接收事件處理程序上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM