system.io.ports используя rtsenabled получает неправильный пакет - PullRequest
0 голосов
/ 27 августа 2010

Я пишу метод, который отправляет определенный пакет и получает ответ от электронного устройства.Я использую system.io.ports с rtsEnabled = true.

Проблема в том, что при входе в приложение полученный пакет изменяется.Я отслеживаю то, что получено с использованием eltima и пакета, полученного eltima, и что приложение имеет два разных байта.

Приложение меняет каждый байт, который является двойным в шестнадцатеричном (например, FF или BB), на 3F.Вот что дает Eltima:

5b 00 00 09 32 13 31 33 35 36 31 39 31 30 30 38 32 35 00 01 ff 64 01 00 bb 0f 5d - Eltima

5B 00 00 09 32 13 31 33 35 30 32 37 31 30 30 38 32 35 00 01 3F 64 01 00 3F 04 5D --MyApplication

Вот мой код:

public string MakeSerialConnection(string COM, int baud, string dest)
    {
        SerialPort port = new SerialPort(COM, baud, Parity.None, 8, StopBits.One);
        try
        {
            if (!(port.IsOpen))
            {
                string destination = dest;
                //BUILD PACKET FOR SENDING
                byte[] fullPacket = BuildPacket(destination);
                port.Open();
                port.RtsEnable = false;

                port.Handshake = Handshake.None;

                //SEND PACKET TO DEVICE
                port.Write(fullPacket,0,9);

                #region RECEIVE DATA FROM SERIAL
                //MAKE PROCESS STOP FOR 5sec
                Thread.Sleep(240);

                port.RtsEnable = true;

                Thread.Sleep(1000);
                string reading = port.ReadExisting();
               // int readingint = port.ReadByte();

                    port.Close();
                    port.Dispose();
                    return reading;
                #endregion
            }
            else
            {
                return "";
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (port != null)
            {
                //port.Close();
                if (port.IsOpen)
                {
                    port.Close();
                }
                port.Dispose();
            }

        }

Пожалуйста, помогите мне выяснить, почему это происходит

Ответы [ 3 ]

1 голос
/ 27 августа 2010

Если вы посмотрите на таблицу кодов ASCII, вы увидите, что 0x3f - это код символа для? Это символ подстановки, который вы получите, когда Encoding.GetString () не может преобразовать значение байта в символ. Имеет смысл, по умолчанию SerialPort.Encoding - ASCII, 0xff - недопустимый код символа в этой кодировке.

Основная проблема в том, что вы читаете строки. Но устройство не отправляет строки, оно отправляет байты. Вы должны использовать SerialPort.Read () вместо ReadExisting ().

1 голос
/ 27 августа 2010

Не помещайте свои прочитанные байты в строку. Как заявляет SwDevMan, вы отправляете не строку через порт, а байтовый массив. В качестве хорошей практики избегайте преобразования ваших данных в типы, которые не принадлежат. Иногда код за рамками изменяет данные без вашего ведома.

Используйте Read () или ReadByte () и поместите ваши байты в массив, байты или список, который вы создадите. Read () - это логичный способ, но ReadByte использует его. Использование ReadByte () будет читать по одному байту за раз. Если вы ожидаете, что первый байт будет специальным флагом, например, флагом начала команды, вы можете сразу же проверить его и выбрать либо отказаться, либо продолжить чтение.

        while (serialport.BytesToRead > 0)
        {
            startingByte= Convert.ToByte(serialport.ReadByte());
            CheckIfStartOfCommand(startingByte)
            ...
        }

В противном случае используйте Read (), чтобы получить определенное количество байтов в предустановленном массиве.

0 голосов
/ 27 августа 2010

Что спецификация устройства говорит о Handshaking ?Возможно, вам придется установить рукопожатие на RequestToSend.Кроме того, если возможно, используйте DataReceived для получения данных, а не для сна.

Я бы также проверил Encoding последовательного порта, чтобы убедиться, что он соответствуетустройство использует.По умолчанию ASCIIEncoding , поэтому, если устройство использует что-то другое (например: Unicode ), вам необходимо изменить его.

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