Я предполагаю, что у вас есть какой-то графический интерфейс, который вы хотите обновить при считывании карты. Я предполагаю, что у вас есть форма с одним текстовым полем с именем «textBox1» и кнопкой с надписью «Пуск» (button1).
using System;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
namespace SerialPortExample {
public partial class Form1 : Form {
SerialPort myport;
public Form1() {
InitializeComponent();
myport = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
myport.DataReceived += new SerialDataReceivedEventHandler(myport_DataReceived);
myport.ErrorReceived += new SerialErrorReceivedEventHandler(myport_ErrorReceived);
}
delegate void SerialDataReceivedDelegate(object sender, SerialDataReceivedEventArgs e);
delegate void SerialErrorReceivedDelegate(object sender, SerialErrorReceivedEventArgs e);
void myport_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) {
if (this.InvokeRequired) {
this.Invoke(new SerialErrorReceivedDelegate(myport_ErrorReceived_Client), sender, e);
} else {
myport_ErrorReceived_Client(sender, e);
}
}
void myport_ErrorReceived_Client(object sender, SerialErrorReceivedEventArgs e) {
MessageBox.Show("Error recieved: " + e.EventType);
}
void myport_DataReceived(object sender, SerialDataReceivedEventArgs e) {
if (this.InvokeRequired) {
this.Invoke(new SerialDataReceivedDelegate(myport_DataRecieved_Client), sender, e);
} else {
myport_DataRecieved_Client(sender, e);
}
}
void myport_DataRecieved_Client(object sender, SerialDataReceivedEventArgs e) {
textBox1.Text = myport.ReadExisting();
}
private void button1_Click(object sender, EventArgs e) {
try {
if (myport.IsOpen) {
myport.Close();
button1.Text = "Start";
} else {
myport.Open();
button1.Text = "Stop";
}
} catch (IOException ex) {
MessageBox.Show(ex.Message);
}
}
}
}
У меня нет последовательного устройства для тестирования этого кода, но оно должно быть правильным.
Разбивая его, важной частью является метод myport_DataRecieved
. Этот метод вызывается всякий раз, когда данные поступают на последовательный порт, т. Е. При считывании карты.
Другими областями интересов являются конструктор Form1
, где мы инициализируем SerialPort (но не открываем его пока), и метод button1_Click
, где мы открываем / закрываем порт (и изменяем текст кнопки, чтобы отразить это Мы также обрабатываем исключения, если по какой-то причине не можем открыть порт.
Редактировать: я обновил ответ, благодаря комментарию Ганса. Вы не можете напрямую получить доступ к элементам управления пользовательского интерфейса из событий данных, так как они выполняются в другом потоке. Я разделил методы событий пополам, чтобы я мог вызвать Invoke
для них и запустить их в соответствующем контексте.