ответ от ком порта на неопределенный срок - PullRequest
0 голосов
/ 19 мая 2011

Я работаю с com-портом, столкнулся с проблемой, отправляю запрос на com-порт и жду ответа.ответ бесконечен ...

static void Main(string[] args)
        {
             byte[] cahs;
             byte[] cash_with_bbc;
            SerialPort mySerialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            mySerialPort.Open();
            cahs = new byte[] { 0x04, 0x30, 0x02, 0x44, 0x03 };
            cash_with_bbc = new byte[] { 0x04, 0x30, 0x02, 0x44, 0x03, GetBCC(cahs) };
            mySerialPort.Write(cash_with_bbc, 0, cash_with_bbc.Length);

            Thread.Sleep(50);

            Console.WriteLine(mySerialPort.ReadLine());

            while (mySerialPort.BytesToRead > 0)
            {
                Console.WriteLine(mySerialPort.ReadLine());
            }

            mySerialPort.Write(new byte[] {0x06}, 0, 1);

            mySerialPort.Close();
        }
        private static byte GetBCC(byte[] inputStream)
        {
            byte bcc = 0;

            if (inputStream != null && inputStream.Length > 0)
            {
                // Exclude SOH during BCC calculation
                for (int i = 0; i < inputStream.Length; i++)
                {
                    bcc ^= inputStream[i];
                }
            }

            return bcc;
        }

документация

Банкомат управляется командой от устройства верхнего уровня (хоста) и отправляет ответ на это.Когда банкомат получает команду, ответ должен быть отправлен до получения следующей команды.Если команда отправляет во время обработки ответ, банкомат не будет реагировать и отвечать на команду вообще.Также банкомат не дает никакого ответа до получения команды.

Когда отправлено сообщение (команда или ответ), отправляется ответ, указывающий, было ли сообщение успешно получено.

ACK (0x06): для указания того, что сообщение принято.NAK (0x15): для указания того, что сообщение было отклонено и что сообщение должно быть повторно отправлено.

Повторная отправка одного сообщения будет повторяться до 3 раз, и в случае сбоя всех испытанийсообщение будет отменено и новый режим передачи будет готов.Все тексты, кроме ACK, будут рассматриваться как NAK.(Исключительно. EOT (0x04) - это недавно отправленный набор символов с верхнего уровня, и он распознается как EOT, который позволяет быть готовым к новому режиму передачи связи.)

Каждое сообщение имеет символ проверки блока (BCC),который показывает, является ли сообщение нормальным или ненормальным.Следовательно, в случае правильного BCC сообщение известно как нормальное состояние (отправка ACK).В противном случае NAK отправляется и замечает сбой передачи сообщения.Набор символов EOT используется в заголовке и конце сообщения.Если он не находится на проверке BCC, весь порядок передачи игнорируется и устанавливается новый режим связи.

1 Ответ

0 голосов
/ 19 мая 2011

Устройство может ответить с помощью NewLine, которая не соответствует ожидаемой Serial.RaedLine().Из документации по умолчанию LF, попробуйте CR или даже CRLF:

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