.NET에서 직렬 포트의 상태를 지속적으로 확인하는 방법은 무엇입니까?

드미트리 보이 코

현재 SerialPort클래스를 사용하고 있지만 카드 판독기가 물리적으로 연결 해제되었는지 확인하기 위해 내 WPF 앱 내에서 포트 (존재 / 없음) 상태를 확인하고 싶습니다.

.NET에서 할 수있는 방법이 있습니까?

내가 사용하는 코드는 다음과 같습니다.

public class Proxi
    {
        public string proxicard = "";
        public DateTime readingtime = DateTime.MinValue;
        public bool Ready = false;
        public bool Correct = false;
        public bool COMreader = false;
        public bool COMAccess = false;
        public bool COMDataCorrect = false;
        public MemoryStream COMdata = new MemoryStream();
        public SerialPort port;

        // Public Event to allow other classes to subscribe to.
        public event EventHandler CardDetected = delegate { };

        public Proxi(string portname, bool isCOM)
        {
            try
            {
                port = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One)
                {
                    DtrEnable = true,
                    RtsEnable = true
                };
                port.Open();
                port.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived);
                Ready = true;
                COMreader = isCOM;
            }
            catch
            {
                proxicard = "There is no port " + portname;
            }
        }

        private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort serialPort = (SerialPort)sender;
            byte[] buffer = new byte[serialPort.BytesToRead];
            serialPort.Read(buffer, 0, buffer.Length);
            proxicard = "";

            if ((int)buffer[0] == 58 && !COMreader)
            {
                for (int index = 1; index < buffer.Length; ++index)
                    proxicard = proxicard + ((char)buffer[index]).ToString();

                if (proxicard.Length >= 12)
                {
                    byte[] numArray = ConvertHexToByte(proxicard, 6);
                    byte num = 0;
                    for (int index = 0; index < numArray.Length - 1; ++index)
                        num += numArray[index];
                    Correct = (int)(byte)((uint)~num + 1U) == (int)numArray[numArray.Length - 1];
                    readingtime = DateTime.Now;
                }
                else
                    Correct = false;
            }
            if ((int)buffer[0] == 1 && COMreader)
            {
                COMdata = new MemoryStream();
                COMAccess = true;
                if (buffer.Length > 1)
                    COMdata.Write(buffer, 1, buffer.Length - 1);
            }

            if (!COMAccess || !COMreader || COMdata.Length < 7L)
            {

                // Raise Event, which triggers all method subscribed to it!
                CardDetected(this, new EventArgs());

                return;
            }

            MemoryStream memoryStream = new MemoryStream();
            memoryStream.Write(new byte[1] { (byte)1 }, 0, 1);
            for (int offset = (int)COMdata.Length - 2; offset >= 0; --offset)
                memoryStream.Write(COMdata.ToArray(), offset, 1);
            Correct = (int)CRC.CRC8(memoryStream.ToArray(), (int)memoryStream.Length) == (int)COMdata.ToArray()[COMdata.Length - 1L];
            proxicard = Proxi.GetRecordHEXBytes(COMdata.ToArray(), 1, 5);
            COMdata = new MemoryStream();
            COMAccess = false;

            // Raise Event, which triggers all method subscribed to it!
            CardDetected(this, new EventArgs());
        }

        public static string GetRecordHEXBytes(byte[] data, int position, int length)
        {
            if (position + length > data.Length)
                return "";
            string str = "";
            for (int index = 0; index < length; ++index)
            {
                byte num = data[position + index];
                str += num.ToString("X2");
            }
            return str;
        }

        public byte[] ConvertHexToByte(string HexValue, int length)
        {
            byte[] numArray = new byte[length];
            for (int index = 0; index < length; ++index)
                numArray[index] = (byte)Convert.ToChar(Convert.ToUInt32(HexValue.Substring(index * 2, 2), 16));
            return numArray;
        }

        public void Close()
        {
            port.Close();
        }
    }
바스크

리더가 연결된 것으로 간주하기 위해 충족해야 할 두 가지 조건이 있습니다.

  1. COM 포트가 성공적으로 열렸습니다.
  2. 일부 테스트 통신이 수행됩니다. 이것은 양방향 통신 (예 : 버전과 같은 독자에게 요청) 일 수 있으며 독자가 정기적으로 통신하고 몇 초마다 테스트 데이터를 보내는 경우 기다릴 수 있습니다.

조건 1 만 충족되는 경우 판독기 존재 감지에 전혀 의미가 없음을 명심하십시오. 사용자가 통신 포트를 항상 존재하는 포트 번호로 설정하면 (예 : USB가 아닌 장치) 연결된 포트가 없어도 해당 포트를 열 수 있습니다.

그리고 통신 프로토콜에 따라 리더가 연결되어 있어도 데이터가 전혀 수신되지 않을 수 있으므로 Receive 이벤트 만 처리하는 것으로는 충분하지 않을 수 있습니다.

연속 감지를 위해 정기적으로 직렬 포트를 열고 리더와의 테스트 통신을 수행하는 스레드를 만들고 싶을 것입니다. 이 모든 것이 성공하면 IsConnected리더가 연결되었음을 나타내는 모델 클래스의 일부 bool 변수 (예 :)를 변경하면 됩니다. 보기 쪽에서는 일부 컨트롤 콘텐츠를 IsConnected플래그에 바인딩해야합니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C #에서 소켓의 상태를 효율적으로 확인하는 방법은 무엇입니까?

분류에서Dev

MS Word에서 텍스트 상자를 직선으로 정렬하는 방법은 무엇입니까?

분류에서Dev

robovm으로 libgdx에서 네트워크 연결 상태를 확인하는 방법은 무엇입니까?

분류에서Dev

핀 상태를 읽고 비트 마스크에 넣고 직렬로 인쇄하는 방법은 무엇입니까?

분류에서Dev

Behat에서 여러 페이지의 헤더 상태 코드를 확인하는 방법은 무엇입니까?

분류에서Dev

React에서 아이콘과 텍스트를 수직으로 정렬하는 방법은 무엇입니까?

분류에서Dev

.net에서 직렬 포트를 읽는 가장 빠른 방법은 무엇입니까?

분류에서Dev

WinCE 5.0의 디버그 직렬 포트에서 데이터를 읽는 방법은 무엇입니까?

분류에서Dev

QT의 직렬 포트에서 데이터를 읽는 방법은 무엇입니까?

분류에서Dev

bash 스크립트에서 SQL 스크립트를 직렬로 실행하는 방법은 무엇입니까?

분류에서Dev

GPS 상태를 지속적으로 확인하는 백그라운드 서비스를 만드는 방법은 무엇입니까?

분류에서Dev

C #은 직렬 포트에서 지속적으로 데이터를 요청하고 처리합니다.

분류에서Dev

의미없는 동적 키 이름으로 루트 개체를 역 직렬화하는 방법은 무엇입니까? Json.NET

분류에서Dev

JavaScript가 지속적으로 업데이트를 확인하도록하는 방법은 무엇입니까?

분류에서Dev

Java에서 직렬화 및 직렬화 해제 후 참조를 유지하는 방법은 무엇입니까?

분류에서Dev

대화 상태 속성에 데이터를 저장하는 것과 대화의 컨텍스트 직렬화의 차이점은 무엇입니까?

분류에서Dev

NSTextInputClient에서 입력 방법의 상태를 확인하는 방법은 무엇입니까?

분류에서Dev

javascript에서 관계를 지속적으로 업데이트하는 방법은 무엇입니까?

분류에서Dev

Android 모바일에서 직렬 포트를 처리하는 방법은 무엇입니까?

분류에서Dev

Linux에서 직렬 포트를 구성하는 가장 쉬운 방법은 무엇입니까?

분류에서Dev

React-상태를 먼저 정의하지 않고 동적 속성으로 상태를 업데이트하는 방법은 무엇입니까?

분류에서Dev

cpp에서 msg-pack으로 중첩 된 메시지를 직렬화하는 방법은 무엇입니까?

분류에서Dev

부팅시 직렬 포트 속도를 설정하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

AngularJS에서 부서별로 직원의 급여를 인상하는 방법은 무엇입니까?

분류에서Dev

직렬화 할 상속 된 속성을 동적으로 선택하는 방법은 무엇입니까?

분류에서Dev

이미지가 포함 된 div에서 링크를 수직으로 정렬하는 방법은 무엇입니까?

분류에서Dev

RenderedImage를 텍스트 문자열로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

인터럽트 직렬로 직렬을 읽는 방법은 무엇입니까?

분류에서Dev

한 statefulwidget의 상태를 flutter에서 다른 상태로 변경하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    C #에서 소켓의 상태를 효율적으로 확인하는 방법은 무엇입니까?

  2. 2

    MS Word에서 텍스트 상자를 직선으로 정렬하는 방법은 무엇입니까?

  3. 3

    robovm으로 libgdx에서 네트워크 연결 상태를 확인하는 방법은 무엇입니까?

  4. 4

    핀 상태를 읽고 비트 마스크에 넣고 직렬로 인쇄하는 방법은 무엇입니까?

  5. 5

    Behat에서 여러 페이지의 헤더 상태 코드를 확인하는 방법은 무엇입니까?

  6. 6

    React에서 아이콘과 텍스트를 수직으로 정렬하는 방법은 무엇입니까?

  7. 7

    .net에서 직렬 포트를 읽는 가장 빠른 방법은 무엇입니까?

  8. 8

    WinCE 5.0의 디버그 직렬 포트에서 데이터를 읽는 방법은 무엇입니까?

  9. 9

    QT의 직렬 포트에서 데이터를 읽는 방법은 무엇입니까?

  10. 10

    bash 스크립트에서 SQL 스크립트를 직렬로 실행하는 방법은 무엇입니까?

  11. 11

    GPS 상태를 지속적으로 확인하는 백그라운드 서비스를 만드는 방법은 무엇입니까?

  12. 12

    C #은 직렬 포트에서 지속적으로 데이터를 요청하고 처리합니다.

  13. 13

    의미없는 동적 키 이름으로 루트 개체를 역 직렬화하는 방법은 무엇입니까? Json.NET

  14. 14

    JavaScript가 지속적으로 업데이트를 확인하도록하는 방법은 무엇입니까?

  15. 15

    Java에서 직렬화 및 직렬화 해제 후 참조를 유지하는 방법은 무엇입니까?

  16. 16

    대화 상태 속성에 데이터를 저장하는 것과 대화의 컨텍스트 직렬화의 차이점은 무엇입니까?

  17. 17

    NSTextInputClient에서 입력 방법의 상태를 확인하는 방법은 무엇입니까?

  18. 18

    javascript에서 관계를 지속적으로 업데이트하는 방법은 무엇입니까?

  19. 19

    Android 모바일에서 직렬 포트를 처리하는 방법은 무엇입니까?

  20. 20

    Linux에서 직렬 포트를 구성하는 가장 쉬운 방법은 무엇입니까?

  21. 21

    React-상태를 먼저 정의하지 않고 동적 속성으로 상태를 업데이트하는 방법은 무엇입니까?

  22. 22

    cpp에서 msg-pack으로 중첩 된 메시지를 직렬화하는 방법은 무엇입니까?

  23. 23

    부팅시 직렬 포트 속도를 설정하는 가장 좋은 방법은 무엇입니까?

  24. 24

    AngularJS에서 부서별로 직원의 급여를 인상하는 방법은 무엇입니까?

  25. 25

    직렬화 할 상속 된 속성을 동적으로 선택하는 방법은 무엇입니까?

  26. 26

    이미지가 포함 된 div에서 링크를 수직으로 정렬하는 방법은 무엇입니까?

  27. 27

    RenderedImage를 텍스트 문자열로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  28. 28

    인터럽트 직렬로 직렬을 읽는 방법은 무엇입니까?

  29. 29

    한 statefulwidget의 상태를 flutter에서 다른 상태로 변경하는 방법은 무엇입니까?

뜨겁다태그

보관