чтение данных с последовательного порта через определенный интервал? - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть устройство чтения магнитных карт с интерфейсом последовательного порта.

Я использовал следующий код C # .net для отправки команды на устройство чтения карт.

System.IO.Ports.SerialPort myport = new System.IO.Ports.Serialport("COM1", 9600, Parity.Nonek, 8, StopBits.One);
myport.Open();
// initiates the card reader to read.
myport.write("command to initiate card reader");

// Once the card is swiped it shows the read data.
MessageBox.Show(myport.ReadExisting());
myport.Close();

Приведенный выше код будет работать хорошокогда у меня есть пауза перед окном сообщений.Но я не хочу делать паузу. Скорее, я хочу запускать окно сообщения всякий раз, когда карта удаляется.

Как мы можем это сделать?

Я реализую это в системе входа пользователя.

1 Ответ

3 голосов
/ 27 февраля 2011

Я предполагаю, что у вас есть какой-то графический интерфейс, который вы хотите обновить при считывании карты. Я предполагаю, что у вас есть форма с одним текстовым полем с именем «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 для них и запустить их в соответствующем контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...