فتح درج النقود MS-Cash، رمز خاطئ؟كود سيء؟
-
19-09-2019 - |
سؤال
تجربة متواضعة هنا وأعتقد أن هذا سيجعلني أحمقًا، لكن...أحاول تحويل برنامج تسجيل نقدي قديم إلى .net.لقد تغلبت على كل شيء آخر، لكن لا يمكنني فتح ماكينة تسجيل النقد.إنه متصل بـ COM1، ومن المفترض أن ترسل نص "مشغل" إلى أسفل 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!")
أحصل على رسائل نصية "تم إرسال الإشارة" و"تم تنفيذ الدرج"
شيء دانغ، فقط لن تنفجر.إنه درج النقود MS (EP125KC).متصل بالتأكيد بـ COM1، بالتأكيد يتمتع بالقوة.Chr(65) هو الكود القديم المستخدم لإخراج الدرج وهو يعمل:
Open drawerComPort For Output Access Write As #1
Print #1, Chr$(65); "A";
Close #1
ملحوظة:الكود أعلاه يعمل بنجاح.كان سبب المشكلة الجذرية هو سلك الطاقة المعكوس (السلبي كان على الجانب الخطأ).
شكرا لكل المساعدة يا أصدقاء!
المحلول
لقد قمت بتعيين المصافحة على لا شيء ولكن من المحتمل أن يكون لدرج النقود فكرته الخاصة.قم أيضًا بتعيين DtrEnable على True.Chr(65) هو رمز ASCII للحرف "A"، ويشير رمز VB الخاص بك إلى أن الأمر الحقيقي هو "AA".
يوثق الدليل أن درج النقود يقوم بضبط معدل الباود الخاص به تلقائيًا.يوصى بإرسال 20 حرفًا على الأقل.وأن الأمر الحقيقي هو Ctrl+G (Chr(7)).ربما كان الأمر "AA" يعمل سابقًا بسبب عدم تطابق معدل الباود.ربما.
نصائح أخرى
إذا كنت أتذكر بلدي صدئ جدا أساسي.
Print #1, Chr$(65); "A";
تعني الطباعة إلى المنفذ 1، الحرف 65 متبوعًا بالسلسلة "A"، الآن الحرف 65 هو "A"، لذلك يبدو لي أنه يجب عليك إرسال "AA" إلى المنفذ 1
port.Write("AA");
أو بالتناوب،
port.Write(new byte[]{65,'A'}, 0, 2);
ربما يتم إرسال Unicode 65، والذي سيكون 0065، والذي لن ينتهي بشكل جيد.
مجرد فكرة، هل يمكنك محاولة إرسال int الخام؟
أنا لا أستخدم .net، لكن هل المنفذ مخزّن مؤقتًا؟هل تحتاج إلى إرسال تدفق/fflush ()؟
هل أنت متأكد أنه من المفترض أن ترسل هذا الرمز؟كنت أعتقد دائمًا أن الرمز مسبوق بـ 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
قم بتنزيل برنامج التحويل البرمجي QB4.5 MS-Quick Basic القديم، ثم قم بتجميعه إلى ملف قابل للتنفيذ opendrawer.exe
, ، يمكن العثور على QB4.5 هنا.الآن، يقع على عاتقك مسؤولية جعل هذا مضادًا للرصاص، أي.ماذا يحدث إذا فشلت الكتابة إلى 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.
انتبه إلى أنك قد تحتاج إلى تضمين مكتبة وقت تشغيل QB4.5 في نفس الدليل...لست متأكدًا بنسبة 100%...لقد مرت سنوات...
ماذا تعتقد؟
أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.