Engr.Shah Ответов: 1

Вызов функции при получении UDP-данных.


Привет там, все еще не созрел в программировании на c#, я написал приложение, в котором он получает данные от arduino с помощью протокола UDP, когда я нажимаю кнопку, данные отправляются и принимаются без препятствий, но я хочу, чтобы мое приложение получало данные автоматически, когда arduino отправляет их. так что я не буду нажимать ни на одну кнопку или мне не придется запускать какие-либо события вручную. вот общий код. PS im использует Visual Studio 2010 Express.


есть ли способ получать данные только тогда, когда arduino отправляет их?
пожалуйста помочь

Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Socket SOCK = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                SOCK.ReceiveTimeout = 2000;
                SOCK.SendTimeout = 2000;
                IPAddress serverAddres = IPAddress.Parse("192.168.1.177");
                IPEndPoint endPoint = new IPEndPoint(serverAddres, 23);
                String text = textBox1.Text;
                byte[] sendBuffer = Encoding.ASCII.GetBytes(text);
                SOCK.SendTo(sendBuffer, endPoint);
                byte[] recievedByte = new byte[1024];
                int bytesrec = SOCK.Receive(recievedByte);
                textBox1.Text = Encoding.UTF8.GetString(recievedByte, 0, bytesrec);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,"Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
            }

        }

1 Ответов

Рейтинг:
7

Afzaal Ahmad Zeeshan

Вам нужно прикрепить асинхронный обратный вызов1, который получает данные для вашего сокета от своего имени, а затем предупреждает вас о том, что данные были получены. Вы не можете присоединить функцию приема, так как она может быть заблокирована. Вы можете возразить, что,

// Your receive call is useless as well, and so would be this, 
SOCK.Receive(buffer, offset, SOCK.Available, SocketFlags.None);
прочитал бы байты, но нет, потому что даже в этом случае доступно будет 0, так как устройство, возможно, еще не отправило сообщение, поэтому оно вернется, действуя как неблокирующий вызов Хороший подход состоит в том, чтобы использовать обратный вызов, и сделать BeginReceive (...), и асинхронно читать из провода,
// Code from Microsoft documentations
// Begin receiving the data from the remote device.  
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,  
     new AsyncCallback(ReceiveCallback), state);  
Пожалуйста, ознакомьтесь с этой документацией, чтобы узнать немного больше по этой теме, Пример Асинхронного Клиентского Сокета | Microsoft Docs[^], и если вы пишете это как серверное приложение, то пройдите через это, Пример Асинхронного Сокета Сервера | Microsoft Docs[^]

1. я выделил это курсивом, потому что смешно рассматривать обратный вызов и асинхронный подход в 21 веке.