Дайте мне посмотреть, правильно ли я понял.
Вы говорите, что у вас есть устройство, подключенное к последовательному порту, и вам нужно дважды прочитать информацию оттуда, верно?
Ваш код немного противоречив при работе с этим. Я бы повторил это немного больше так:
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, когда вы нажмете кнопку, и результаты должны появиться в обработчике событий, полученных с данными.