[英]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.