سؤال

تجربة متواضعة هنا وأعتقد أن هذا سيجعلني أحمقًا، لكن...أحاول تحويل برنامج تسجيل نقدي قديم إلى .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%...لقد مرت سنوات...

ماذا تعتقد؟

أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top