2011-07-16 168 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