문제

여기서 겸손한 경험과 나는 이것이 나를 바보로 만들 것이라고 생각하지만 ... 고대 금전 등록 프로그램을 .NET로 변환하려고 노력하고 있습니다. 다른 모든 것을 정복했지만 금전 등록기를 열 수는 없습니다. COM1에 연결되면 레지스터가 열리는 "트리거"텍스트를 보내야합니다.

.NET 코드는 다음과 같습니다.

    MsgBox("Opening Drawer")

    Dim port As System.IO.Ports.SerialPort
    port = New System.IO.Ports.SerialPort("Com1")

    port.PortName = "COM1"
    port.BaudRate = 9600
    port.Parity = IO.Ports.Parity.None
    port.DataBits = 8
    port.StopBits = IO.Ports.StopBits.One
    'port.Handshake = IO.Ports.Handshake.RequestToSend
    port.RtsEnable = True
    'port.DtrEnable = True
    port.Open()
    If port.IsOpen Then

        'MsgBox("Attempt 1")
        port.Write("@@@@@@@@@@@@@@@@@@@@")
        MsgBox("Signal Sent: " & Chr(65))
    Else
        MsgBox("Port is not open")
    End If

    port.Close()
    MsgBox("Pop, durn it!")

나는 msgboxes "신호 전송", "완료 팝 서랍"을 얻는다.

멍청한 일, 그냥 터지지 않을거야. MS- 캐시 서랍 (EP125KC)입니다. COM1에 확실히 연결되어 있으며 확실히 힘이 있습니다. Chr (65)는 서랍을 팝하는 데 사용되는 오래된 코드이며 작동합니다.

Open drawerComPort For Output Access Write As #1
Print #1, Chr$(65); "A";
Close #1

참고 : 위의 코드는 성공적으로 작동했습니다. 근본 문제는 역전 된 전원 코드로 인해 발생했습니다 (음수는 잘못된 쪽).

모든 도움사에 감사드립니다!

도움이 되었습니까?

해결책

당신은 당신의 악수를 아무것도 설정하지 않았지만 현금 서랍은 아마도 고유 한 아이디어를 가지고있을 것입니다. 또한 dtrenable을 true로 설정하십시오. Chr (65)는 "A"에 대한 ASCII 코드이며 VB 코드는 실제 명령이 "AA"임을 암시합니다.

매뉴얼은 현금 서랍이 보드 라이트를 자동 조정한다고 문서화합니다. 최소 20 개의 @ 문자를 보내는 것이 좋습니다. 그리고 실제 명령은 ctrl+g (chr (7))입니다. "AA"명령은 이전에 보드 레이트 불일치로 인해 작동했을 수 있습니다. 아마도.

다른 팁

내가 기억한다면 매우 녹슬 었습니다 기초적인.

Print #1, Chr$(65); "A";

문자 65와 문자열 "a"가 이어지는 문자 65는 port1에 인쇄를 의미합니다.

port.Write("AA");

또는 교대로

port.Write(new byte[]{65,'A'}, 0, 2);

0065 인 유니 코드 65를 보내는 것은 잘 끝나지 않을 수 있습니다.

그냥 생각, 원시 int를 보낼 수 있습니까?

.NET을 사용하지 않지만 포트가 버퍼링되어 있습니까? flush/fflush ()를 보내야합니까?

이 코드를 보내야한다고 확신합니까? 나는 항상 코드가 ESC IE 0x1B 16 진전에 의해 접두사에 의해 접두사라고 생각했을 것입니다 ... 현금 서랍 ...

"\x1bA"

Double 'a'가 사용된다는 흥미로운 ... 오 잘 ... :)

편집하다: 이것에 대해 생각한 후 나는 그것을하는 또 다른 방법이 있다는 것을 깨달았다. opendrawer.bas

Sub OpenDrawer()
drawerComPort = "COM1"
Open drawerComPort For Output Access Write As #1
REM ADDED ERROR HANDLING
ON ERROR GOTO ErrHandler
Print #1, Chr$(65); "A";
Close #1
print "Drawer Ok"
OpenDrawer_Exit:
On Error Goto 0
Exit Sub
ErrHandler:
print "Oops, Write Failed"
Goto OpenDrawer_Exit
End Sub

REM The Main....
OpenDrawer

이전 QB4.5 MS-Quick Basic Compiler를 다운로드하고 실행 파일로 컴파일하십시오. opendrawer.exe, QB4.5를 찾을 수 있습니다 여기. 이제이 방탄을 만들기 위해 onus가 있습니다. 즉, COM1에 쓰기가 실패하면 어떻게되는지, 예제 기본 코드에서와 같이 메시지를 발행합니다.

그런 다음 사용할 수 있습니다 System.Diagnostics.Process 숨겨진 창을 사용하여 껍질을 벗기십시오

    public class TestDrawer
    {
        private StringBuilder sbRedirectedOutput = new StringBuilder();
        public string OutputData
        {
            get { return this.sbRedirectedOutput.ToString(); }
        }
        public void Run()
        {
            System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo();
            ps.FileName = "opendrawer";
            ps.ErrorDialog = false;
            ps.CreateNoWindow = true;
            ps.UseShellExecute = false;
            ps.RedirectStandardOutput = true;
            ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

            using (System.Diagnostics.Process proc = new System.Diagnostics.Process())
            {
                proc.StartInfo = ps;
                proc.Exited += new EventHandler(proc_Exited);
                proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived);
                proc.Start();
                proc.WaitForExit();
                proc.BeginOutputReadLine();
                while (!proc.HasExited) ;
            }
        }

        void proc_Exited(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("proc_Exited: Process Ended");
            if (this.sbRedirectedOutput.ToString().IndexOf("Oops, write failed") > -1){
               MessageBox.Show(this, "Error in opening Cash Drawer");
            }
            if (this.sbRedirectedOutput.ToString().IndexOf("Drawer Ok") > -1){
               MessageBox.Show(this, "Drawer Ok");
            }
        }

        void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null) this.sbRedirectedOutput.Append(e.Data + Environment.NewLine);
            //System.Diagnostics.Debug.WriteLine("proc_OutputDataReceived: Data: " + e.Data);
        }

프로세스는 숨겨진 창으로 껍질을 벗기고 모든 출력이 이벤트 핸들러에서 리디렉션되고 처리됩니다. 이는 트릭을 수행해야합니다. 리디렉션 된 출력이 어떻게 들어가는 지 알 수 있습니다 sbRedirectedOutput (StringBuilder 인스턴스). 에서 proc_ProcExited 이벤트 핸들러는 확인합니다 sbRedirectedOutput QB4.5 프로그램에서 발행 될 'oops write 실패'메시지의 경우.

QB4.5의 런타임 라이브러리를 동일한 디렉토리에 포함시켜야 할 수도 있습니다 ... 100% 확실하지 않습니다 ... 몇 년이 지났습니다 ...

어떻게 생각해?

이것이 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top