2011-07-16 167 views
0

我有一個地磅應用程序,在這裏我使用串行端口來獲取地磅的重量。在同一個COM端口上使用兩個串行端口 - 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"); 
    } 
} 
+0

這是兩個獨立的設備連接到COM端口?爲什麼不打開一次端口並從它讀取兩次呢? –

+0

你只是將這兩個秤連接到相同的COM端口?這是行不通的。 –

回答

1

讓我看看我是否明白這一點。

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

你的代碼在處理時有點費神。我想重做它多一點這樣的:

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',並且結果應該出現在數據接收的事件處理程序中。

+0

你是對的,我們只需要附加一次事件處理程序。它的工作正常,現在沒有任何錯誤...非常感謝 – sony

1

我不認爲去上班。爲什麼你甚至需要兩個連接到串行端口呢?

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

爲什麼要使用SerialPort的兩個實例?這不像你必須將結果保存在這些對象中。

+0

嗨馬里奧,我從串口更新結果到一個文本框(不同的線程擁有它),但我有一個錯誤,但我使用dispatcher.begininvoke方法排序。但現在的問題是,當我採取第二個重量,它沒有顯示重量,當我第二次點擊時,它顯示重量和進一步點擊它更新第一個重量。 – sony

+0

最有可能在您的代碼中的一些錯誤。展示下? – Mario

+0

嗨馬里奧,我已經更新了代碼。請查看 – sony