Mi Ka Shin Ответов: 3

Получил случайный идентификатор тега в последовательном порту связи в ASP.NET MVC


Я пытаюсь извлечь правильный идентификатор RFID-метки в asp.net но вместо этого я получил случайный идентификатор тега.

Я ждал этот тег идентификатор данных, которые должны быть возвращены в мой AJAX-запроса
Ожидание:
Tag UID: 0B A5 56 D3


но вместо этого у меня есть случайный идентификационный тег
Случайный идентификационный тег:
D3 Tag UID: 0B A5 56 D
3 Tag UID: 0B A5 56


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

Here is my code

<pre>using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc;

public delegate void displayToView(String tagID);

namespace read_rfid_example.Controllers
{
    public class HomeController : Controller
    {
        SerialPort mySerialPort = new SerialPort("COM3");
        // GET: Home
        public ActionResult Index()
        {


            return View();
        }

        List<string> mlist = new List<string>();
        private void DataReceivedHandler(
                         object sender,
                         SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();

            displayToView display = new displayToView(pageReload);
            display.Invoke(indata);

        }
        string result = "";

        [HttpGet]
        public JsonResult start()
        {

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            try
            {
                mySerialPort.Open();
            }
            catch
            {

            }

            while(mySerialPort.IsOpen)
            {
                Thread.Sleep(100);
            }


            return Json(result, JsonRequestBehavior.AllowGet);
        }
        string[] str = new string[10];
        int count = 0;
        public void pageReload(String text)
        {

                mlist.Add(text);
                count++;
                str[mlist.Count] = mlist[mlist.Count - 1];

                if (count == 5)
                {
                result = string.Join("", str);
                    mySerialPort.Close();
                }




        }
    }
}


Как вернуть правильный идентификатор тега? Пожалуйста помочь

Dave Kreskowiak

Вы же понимаете, что ваш код будет работать только в том случае, если RFID-считыватель подключен непосредственно к серверу, не так ли?

Если вы развернете его в производство, этот код вообще не будет работать, если вы подключите RFID-считыватель к рабочей станции.

ASP.NET код выполняется полностью на стороне сервера, а не на стороне клиента.

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Ожидание:
Tag UID: 0B A5 56 D3

но вместо этого у меня есть случайный идентификационный тег
Случайный идентификационный тег:
D3 Tag UID: 0B A5 56 D
3 Tag UID: 0B A5 56

Это не случайно !
Вы начинаете читать с того, что остается в буфере от предыдущего чтения. Случайное чтение в начале строки - это конец предыдущего тега.
Вы должны понять, что а последовательный порт работает медленно, и вам может понадобиться путь для передачи данных на компьютер.
Вам нужно добавить понимание полученных данных в свой код, чтобы определить начало или конец тега.


Рейтинг:
2

Gerry Schmitz

Последовательный порт имеет свойство "BytesToRead", которое необходимо сравнить с байтами, фактически считанными в любой момент времени. Если Вы читаете меньше, вам нужно читать снова.

Вот почему "асинхронная" последовательная обработка сбивает с толку. Поскольку вам нужны данные, проще использовать синхронную обработку: запись; ожидание; чтение в то время как BytesToRead > 0.

Re: ReadExisting()

Цитата:
Этот метод возвращает содержимое потока и внутреннего буфера объекта SerialPort в виде строки. Этот метод не использует тайм-аут. Обратите внимание, что этот метод может оставлять конечные лидирующие байты во внутреннем буфере, что делает значение BytesToRead больше нуля.


Рейтинг:
1

Dave Kreskowiak

Как правило, что-то подобное означает, что вы не получили правильные параметры связи при настройке последовательного порта.