4/29/2010

Serial Port를 이용해 단말기(Vx 570)와 통신하기

Verifone Vx 570

System.IO.Ports.SerialPort Class를사용해
Vx 570 단말기에Message를 보냈을때 LRC(Longitudinal Redundancy Check)를 통해
Response Packet의 이상유무를 체크하는 간단한 프로그램을 만들었다.



만들고 보면 간단한 프로그램이었지만 정작 디버깅을 시작했을 땐 SerialPort의 특성을 제대로 이해하고 있지 못했기에 예상치 못한 결과에 당황하곤 했다.

특히 SerialPort.DataReceived 이벤트의 경우에 메인프로그램과 다른 쓰레드에서 돌아간다. 때문에 DataReceived 이벤트가 호출되었다고 해서 전송받은 데이터를 가지고 바로 다른 로직을 처리하려고 하면 모든 데이터가 전송되지 않았기에 예상치 못한 결과를 얻곤 한다.

현재는 Thread.Sleep 메소드를 이용해 모든 데이터를 받아오는데까지 걸리는 시간을 정했지만 나중에 쓰레딩을 좀 더 잘 다루게 되면 이벤트형식이나 Signal로 딜레이 없이 데이터 전송이 완료되면 다음로직을 실행할 수 있게끔 만들어야겠다.



데이터 전송 패킷은 아래와 같다.
"<stx><msg length(2 Bytes)><message><etx><lrc>"

STX(0x02)와 ETX(0x03)으로 패킷의 시작과 끝을 나타내고 LRC로 현재 패킷이 정상인지 확인한다.

LRC를 구하는 소스는 아래와 같다.
private byte getLRC(byte[] msg)
{
    byte lrc = 0;
 
    for (int i = 1; i < msg.Length - 1; i++)
    {
        lrc ^= msg[i];
    }
    return lrc;
}

LRC는  패킷의 각 바이트를 XOR 해서 나온 수이다.
내가 가진 Spec에서는 STX를 제외한 나머지 Byte만을 계산하라 해서 i = 1 부터 루프를 돌렸다.

댓글 2개:

  1. Hi

    I started working on the same Vx570 device trying to communicate via Rs-232. I was wondering if you could share more of the example?

    답글삭제
  2. If you request some documents Verifone gives u the spec for communicating with Vx570. In my case, the basic communication form is described above (). the is depending on what you want. but the could not accepted by Vx570, when Vx570 is not support what you sending to it. Mybe the serial port class help you in programming.

    답글삭제