Как поставить в очередь вызовы для функции - PullRequest
0 голосов
/ 13 мая 2019

Я обмениваюсь данными с платой реле ввода / вывода по последовательной шине.Плата контролируется и запрашивается с помощью байтовых команд.Моя цель состоит в том, чтобы backgroundworker периодически оценивать состояния реле и входов и обновлять графический интерфейс во время выполнения «сценария», который выполняет ряд действий на плате.

У меня есть две функции, которыепередавать и получать команды на доску.Моя проблема заключается в том, что если я запускаю свой «сценарий», используя backgroundworker для обновления графического интерфейса, я начинаю получать ошибки чтения и записи - я полагаю, потому что оба процесса получают доступ к одной и той же функции в течение короткого промежутка времени.

static SerialPort USB_PORT;
byte[] SerBuf = new byte[64];
byte usb_found = 0;
byte states = 0;

private void transmit(byte write_bytes)
        {
            try
            {
                if (usb_found == 1) USB_PORT.Write(SerBuf, 0, write_bytes);      // writes specified amount of SerBuf out on COM port
            }
            catch (Exception)
            {
                usb_found = 0;
                MessageBox.Show("write fail");
                return;
            }
        }

private void receive(byte read_bytes)
        {
            byte x;
            for (x = 0; x < read_bytes; x++)       // this will call the read function for the passed number times, 
            {                                      // this way it ensures each byte has been correctly recieved while
                try                                // still using timeouts
                {
                    if (usb_found == 1) USB_PORT.Read(SerBuf, x, 1);     // retrieves 1 byte at a time and places in SerBuf at position x
                }
                catch (Exception)                                       // timeout or other error occured, set lost comms indicator
                {
                    usb_found = 0;
                    MessageBox.Show("read fail");
                    return;
                }
            }
        }

Есть ли способ «поставить в очередь» любые и все вызовы этих двух функций, чтобы вся функция завершилась до начала следующей?

1 Ответ

1 голос
/ 13 мая 2019

как предложено @Idle_Mind, я создал объект, а затем использовал оператор блокировки, чтобы предотвратить доступ из двух разных потоков. Кажется, сработало!

static readonly object _Lock = new object();
private void transmit(byte write_bytes)
        {
            lock (_Lock)
            {
                try
                {
                    if (usb_found == 1) USB_PORT.Write(SerBuf, 0, write_bytes);      // writes specified amount of SerBuf out on COM port
                }
                catch (Exception)
                {
                    usb_found = 0;
                    MessageBox.Show("write fail");
                    return;
                }
            }
        }

private void receive(byte read_bytes)
        {
            lock (_Lock)
            {
                byte x;
                for (x = 0; x < read_bytes; x++)       // this will call the read function for the passed number times, 
                {                                      // this way it ensures each byte has been correctly recieved while
                    try                                // still using timeouts
                    {
                        if (usb_found == 1) USB_PORT.Read(SerBuf, x, 1);     // retrieves 1 byte at a time and places in SerBuf at position x
                    }
                    catch (Exception)                                       // timeout or other error occured, set lost comms indicator
                    {
                        usb_found = 0;
                        MessageBox.Show("read fail");
                        return;
                    }
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...