2010-02-09 69 views
1

在這裏謙恭地表明,我認爲這個會讓我變成一個傻瓜,但是......我試圖將一個古老的收銀機程序轉換成.net。征服了其他所有東西,但我無法打開收銀機。它連接到COM1,你應該向COM1發送一個「觸發」文本,這將導致該寄存器打開。打開MS-Cash抽屜,錯誤代碼?錯誤代碼?

這是.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抽屜(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 2010-02-09 01:08:17

+0

是的,意識到當我試圖運行代碼....它已被取消註釋...這不是問題。 (FYI:我編輯了問題中的代碼) – Markus 2010-02-09 01:16:38

+0

早上回來,現在,我在文本框中隨機輸入東西並通過COM1發送...沒有甜蜜的「叮叮」。 – Markus 2010-02-09 01:51:12

回答

1

你已經設置你的握手,但無現金抽屜可能有自己的想法。還要將DtrEnable設置爲True。 Chr(65)是「A」的ASCII碼,你的VB代碼表明真正的命令是「AA」。

該手冊記錄了現金抽屜自動調整其波特率。它建議發送至少20個字符。而真正的命令是Ctrl + G(Chr(7))。由於波特率不匹配,「AA」命令可能以前有效。也許。

+0

您可否詳細說明,20 * chars或20 ctrl + g ...握手現在是否設置爲RequestToSend。 – Markus 2010-02-09 01:29:50

+0

20 @ chars,1 Ctrl + G。你有手冊嗎? – 2010-02-09 01:31:36

+0

不幸的是...如果你有一個鏈接請分享 – Markus 2010-02-09 01:33:59

0

如果我記得我的非常生鏽 BASIC。

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

意味着打印到PORT1其次是字符串「A」,現在字符65「A」字65,所以這看起來對我來說,你應該送「AA」到端口1

port.Write("AA"); 

或交替,

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

你確定你應該發出這段代碼嗎?我一直認爲密碼是通過ESC即0x1b十六進制前綴爲...錢箱...

 
"\x1bA" 

有趣的是雙「A」是用來...哦... :)

編輯:想着這個,我意識到有這樣做的另一種方式後,閱讀... 我有一點子彈校對的修改原來的BASIC代碼...將它保存到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失敗,發出消息像例如BASIC代碼,我修改

然後你可以使用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 failed'。

要知道,你可能需要包括QB4.5的運行時庫在同一目錄...不是100%肯定...它是多年...

你覺得呢?

希望這會有所幫助, 最好的問候, 湯姆。

0

它可能會發送Unicode 65,這將是0065,這將不會結束。

只是一個想法,你可以嘗試發送一個原始的int?

0

我不使用.net,但端口緩衝?你需要發送一個flush/fflush()嗎?

+0

SerialPort.Flush方法 - 發送在此SerialPort的發送緩衝區中等待的任何數據並清除緩衝區。 - 命名空間:System.IO.Ports - http://msdn.microsoft.com/en-us/library/dd169859.aspx – Mobs 2010-02-09 02:00:39