Проблема связи с ENC28J60

Я хочу отправлять/получать строки в/из ENC28J60 через приложение C#. Для этого я использовал свой собственный «протокол». Например, я отправляю «» в Arduino, и он отвечает строкой, содержащей значения температуры. Этот метод отлично работает в режиме последовательной связи, но зависает в сетевом режиме. Что мне здесь не хватает? Есть ли лучший способ сделать это? Я новичок в программировании сокетов. Я использую UIPEthernet.h от ntruchsess.

Мой серверный код (Arduino):

void checkAndReceiveFromTCPClients(){
  size_t size;
  if (EClient = EServer.available()){
    char* strIn;
    if(size = EClient.available() > 0){
      strIn = (char*)malloc(size + 1);
      memset(strIn, 0, size + 1);
      EClient.read(strIn, size);
    }
    strIn[size] = 0;
    String strInput = String(strIn);
    strInput.trim();
    //Это отвечает клиенту (отправляет строку) строкой (EClient.write(ответ)):
    InterpretInputString(strInput); 
    //EClient.stop();
    EClient.flush();
  }
}

Код C#:

string SendAndReceiveOverNet(string Command) {
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(Command);
    NetworkStream stream = TClient.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[256];
    String responseData = String.Empty;
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    return responseData;
}

, 👍1


1 ответ


1

Здесь нужно что-то подобное. Если вы используетеstream.Read без TClient.Available, программа зависнет или выйдет из строя.

Код C#:

string SendAndReceiveOverNet(string Command) {
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(Command);
    NetworkStream stream = TClient.GetStream();
    stream.Write(data, 0, data.Length);
    String responseData = String.Empty;
    Int32 size = TClient.Available;
    if (size > 0)
    {
        data = new Byte[size];
        Int32 bytes = stream.Read(data, 0, data.Length);
        responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    }
    return responseData;
}
,