본문 바로가기
프로그래밍/C Sharp

[ C# ] 허니웰 스케너 시리얼 통신으로 On/Off 하기

by jeong-f 2021. 11. 8.
반응형

고정형 스캐너 또는 핸드스캐너를 수동으로 On/Off 해야 할 경우가 있습니다.

보통 고정형 스캐너에서 많이 사용하는 기능이며, 핸드스캐너가 여러 대 이거나 거리가 멀 경우 스캐너의 포트를 찾기에 유용한 기능이기에 아래 내용을 정리하여 공유합니다.

사용 가능 인터페이스

스캐너를 RS-232 통신으로 사용하려면 아래 세 가지 인터페이스로 가능합니다.

  1. RS232(표준 직렬)
  2. USB 직렬(USB를 통해 COM 포트를 에뮬레이션함) 및 호스트 시스템에 USB COM 드라이버가 필요함
  3. USB HID-POS

* 기본적으로 스캐너가 트리거 명령을 사용하려면 TRGMOD0에 있어야 합니다 *

명령어 설명

트리거하는 명령

  • [SYN] T [CR](ASCII 문자)
  • 16진수 16, 16진수 54, 16진수 0D(Hexadecimal ASCII 문자 값 0x16, 0x54, 0x0d )
  • 십진수 22, 십진수 84, 십진수 13(십진수 ASC) II) 문자 값)

트리거를 비활성화하기 위한 명령

  • [SYN] U [CR](ASCII 문자)
  • 16진수, 16진수 55, 16진수 0D(Hexadecal ASCII 문자 값 0x16, 0x55, 0x0d))
  • 십진수 22, 십진수 85, 십진수 13(십진수 ASC) II) 문자 값)

공통 사항

주의! 시리얼 명령 전송 시 스캐너의 램프는 ON/OFF가 되나 통신으로는 수신되는 데이터는 없습니다.

소스 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace Test
{
    class Program
    {
        static SerialPort _serialPort; // 시리얼 포트
        static bool _ThreadRun = true; // 스레드 동작 유무

        static void Main(string[] args)
        {
            string[] portNames = SerialPort.GetPortNames(); // 연결된 포트 확인

            _serialPort = new SerialPort(); // 시리얼 포트 생성

            // 통신설정  
            Console.WriteLine("포트를 선택해주세요!");
            for (int i = 0; i < portNames.Length; i++)
            {
                Console.Write("{0}:{1} ", i + 1, portNames[i]);
            }
            Console.WriteLine();

            string sPort = Console.ReadLine();
            int portId = Int32.Parse(sPort);

            // 읽기/쓰기 타임아웃
            _serialPort.ReadTimeout = 500;
            _serialPort.WriteTimeout = 500;

            // 기본 통신 속도
            _serialPort.PortName = portNames[portId - 1];
            _serialPort.BaudRate = 115200;
            _serialPort.DataBits = 8;
            _serialPort.Parity = Parity.None;
            _serialPort.StopBits = StopBits.One;

            // 포트 연결
            _serialPort.Open();
            Console.WriteLine("포트 연결 성공 : {0}", _serialPort.PortName);

            // 데이터수신(수신대기스레드생성)
            Thread readThread = new Thread(Read);
            readThread.Start();

			// 1ms 일시 대기
            Thread.Sleep(1);

            // 데이터송신
            while (_ThreadRun)
            {
                Console.WriteLine();
                Console.WriteLine("명령을 입력해 주세요!");
                Console.WriteLine(" 0ff=0, On=1, 종료=Q");

                string msg = Console.ReadLine();
                msg = msg.ToUpper();

                // 입력에 따른 동작
                switch (msg)
                {
                    case "0": 
                        { 
                            Console.WriteLine(" 트리거 Off"); 
                            _serialPort.Write(new byte[] { 0x16, 0x55, 0x0d }, 0, 3);
                            break; 
                        }
                    case "1": 
                        { 
                            Console.WriteLine("트리거 On");
                            _serialPort.Write(new byte[] { 0x16, 0x54, 0x0d }, 0, 3);
                            break; 
                        }
                    case "Q": 
                        { 
                            _ThreadRun = false; 
                            break;
                        }
                }
            }

            //수신쓰레드종료까지대기
            readThread.Join();
            _serialPort.Close();
        }

        //데이터수신스레드부
        static void Read()
        {
            Console.WriteLine("읽기 대기중");

            while (_ThreadRun)
            {
                try
                {
                    string rx = _serialPort.ReadLine();
                    Console.WriteLine("읽기:{0}", rx);
                }
                catch (System.TimeoutException)
                {
                }
            }
        }
    }
}

HoneyWell_232.exe
0.01MB

2021년 기준 적용 대상 스캐너 모델

3800i / 3800r / 38x0 / 56x0 / 58x0, 38x0g, 46x0 / 48x0, Genesis 7580g, Granit 191Xi, Hyperion 1300g, Stratos 27xx, Voyager 12 xxg, Voyager 1400g, VuQuest 3310g, VuQuest 3320g, Xenon 190X, Granit 1980i, Granit 1981i, Voyager 1602g, Voyager 1450g, Voyager 1452g, Voyager 1202 gBF, YJ HF500

참고 사이트

 

How to send a serial command to trigger the scanner?

 

support.honeywellaidc.com

반응형

댓글