2010-02-09 3 views
1

여기서 우연히 만만치 않게 보일 것입니다.이 말은 저를 바보로 만들 것이라고 생각하지만, 저는 고대 현금 레지스터 프로그램을 .net으로 변환하려고합니다. 다른 모든 것을 정복했지만 금전 등록기를 열 수는 없습니다. 그것의 COM1에 연결되어, 당신은 "트리거"텍스트를 COM1 아래로 보내어 레지스터가 열리게해야합니다.MS- 현금 서랍, 잘못된 코드 열기? 나쁜 코드?

다음은 .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-Cash Drawer (EP125KC)입니다. 확실히 COM1에 연결되어 있습니다. 확실히 전원이 있습니다. Chr (65)는 서랍을 불러오는 데 사용되는 이전 코드이며 작동합니다.

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

참고 : 위의 코드는 성공적으로 적용되었습니다. 근본적인 문제는 숭상 된 전원 코드로 인한 것입니다 (부정적인면은 잘못된 것입니다).

모든 도움 주셔서 감사합니다.

+0

@ Markus : 포트가 MsgBox ("Done pop drawer") 앞에 주석 처리 된 기능의 끝에서 닫히지 않은 것을 알 수 있습니다. 코드가 전송 된 후 COM1 포트를 닫을 때까지 현금 서랍이 나오지 않을 것입니다 ... 포트를 '플러시'하는 수단으로 포트를 닫는 것을 고려하십시오 ... – t0mm13b

+0

그래, 코드 .... 주석 처리가되지 않았습니다 ... 문제가 아닙니다. (FYI : 문제의 코드를 편집했습니다.) – Markus

+0

아침에 다시 올거야 ... 지금은 텍스트 상자에 임의의 내용을 입력하고 COM1을 통해 보내고 있습니다 ... 달콤한 "땡"하지 마십시오. – Markus

답변

1

. 또한 DtrEnable을 True로 설정하십시오. Chr (65)는 "A"의 ASCII 코드이며 VB 코드는 실제 명령이 "AA"임을 나타냅니다.

금전 함이 전송 속도를 자동 조정하는 설명서. 20 자 이상을 보내는 것이 좋습니다. 그리고 실제 명령은 Ctrl + G입니다 (Chr (7)). "AA"명령은 전송 속도 불일치로 인해 이전에 작동했을 수 있습니다. 혹시.

+0

당신은 정교 할 수 있습니까, 20 @ chars 또는 20 ctrl + g ... 핸드 셰이크가 RequestToSend로 설정되었습니다. – Markus

+0

20 @ 문자, 1 Ctrl + G. 설명서가 있습니까? –

+0

불행히도 ... 링크가 있다면 – Markus

0

녹슨 매우 기억하십시오. BASIC.

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

문자열 "A", 이제 문자 (65)가 'A'일 다음에 문자 65 포트 1 인쇄를 의미한다, 그래서 당신은

port.Write("AA"); 
을 포트 1 할 "AA"를 전송해야처럼이 나에게 보인다

또는 교대로, 당신은 금전 아마 자신의 아이디어를 가지고 있지만 중에 당신의 악수를 설정 한

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

이 코드를 보내시겠습니까? 나는 ...

 
"\x1bA" 

재미있는 더블 'A'가 사용된다는 것을 ... 오 잘 ... :)

항상 코드가 금전에 대한 ... ESC 즉, 0x1b 진수 접두어 것을 생각했을

편집 : 나는 그것을하는 또 다른 방법이 실현 이것에 대해 생각하면 ... 내가 총알 교정의 비트와 함께 원래의 기본 코드를 수정 한 ... 읽어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 

D 이전 QB4.5 MS-Quick Basic 컴파일러를 소유하고 실행 파일을 컴파일하면 opendrawer.exe으로, QB4.5는 here이됩니다. 이제,이 무서운 방탄복을 착용하게되었습니다.COM1에 쓰는 것은 내가 그럼 당신은 숨겨진에 숨겨진 창을

 
    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); 
     } 

프로세스 쉘을 사용하여 쉘하기 위해 System.Diagnostics.Process을에서 사용할 수 있습니다

을 수정 한 예 기본 코드에서 같은 문제를, 메시지를 실패 할 경우 어떤 일이 발생 창 및 모든 출력 리디렉션 및 이벤트 처리기에서 처리 할 ... 그 트릭을해야합니다. 리디렉션 된 출력이 sbRedirectedOutput (StringBuilder 인스턴스)으로 들어가는 방법에 유의하십시오. proc_ProcExited 이벤트 핸들러에서 sbRedirectedOutput은 QB4.5 프로그램에서 발행 된 'Oops Write failed'메시지를 확인합니다.

당신은 어떻게 생각하세요 ... 당신은 ... 100 % 확실하지 ...가되는 것 년 같은 디렉토리에 QB4.5의 런타임 라이브러리를 포함해야 할 수도,주의?

호프가 도움이 되었으면 안녕하세요, 탐.

0

0065 일 가능성이있는 유니 코드 65를 보내는 중일 수 있습니다.

그냥 생각해보세요. 원시 int를 보내시겠습니까?

0

.net은 사용하지 않지만 버퍼링 된 포트는 무엇입니까? flush/fflush()를 보내야합니까?

+0

SerialPort.Flush 메서드 - 이 SerialPort의 송신 버퍼에서 대기중인 모든 데이터를 보내고 버퍼를 지 웁니다. - 네임 스페이스 : System.IO.Ports - http://msdn.microsoft.com/en-us/library/dd169859.aspx – Mobs

관련 문제