سؤال

وأنا أحاول قراءة البيانات من منفذ تسلسلي ويندوز من خلال جافا. لدي المكتبات javax.comm وأنا قادرة على الحصول على بعض البيانات ولكن لا البيانات الصحيحة. عندما قرأت الميناء إلى صفيف بايت وتحويله إلى نص أحصل على سلسلة من الأحرف ولكن لا سلسلة نصية الحقيقية. لقد حاولت تحديد صفيف بايت كما يجري كل "UTF-8" و "US-ASCII". لا أحد يعرف كيفية الحصول على النص الحقيقي للخروج من هذا؟

وهنا هو رمز بلادي:

while (inputStream.available() > 0) {
 int numBytes = inputStream.read(readBuffer);
 System.out.println("Reading from " + portId.getName() + ": ");
 System.out.println("Read " + numBytes + " bytes");
}

System.out.println(new String(readBuffer));
System.out.println(new String(readBuffer, "UTF-8"));
System.out.println(new String(readBuffer, "US-ASCII"));

وسوف إخراج الأسطر الثلاثة الأولى لن اسمحوا لي نسخ ولصق (وأفترض لأنها ليست الأحرف العادية). هنا هو إخراج عشري: 78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

وأنا أقرأ من جهاز GPS Hollux التي لا الناتج في شكل سلسلة. أعرف أن هذا بالتأكيد لأنني فعلت ذلك من خلال C #.

والإعدادات التي أستخدمه للاتصالات التي أعرف أنها حق من العمل في C # التطبيق هي: بالباود: 9600 Databits: 8 توقف قليلا: 1 التكافؤ: لا شيء

هل كانت مفيدة؟

المحلول

وأنا لا أستطيع أن أقول من التعليمات البرمجية الخاصة بك، ولكن يبدو أنك تستخدم java.io.InputStream لقراءة الكائن. يجب عليك استخدام إما java.io.BufferedReader أو java.io.InputSreamReader.

وهناك العديد من الطرق للقيام بذلك، ولكن هذا هو ما نستخدمه:

javax.comm.SerialPort port = ...{initialize your serial port}
BufferedReader portReader = 
    new BufferedReader(new InputStreamReader(port.getInputStream()));

try {
    String line = portReader.readLine();
} catch(IOException e) { ... }

نصائح أخرى

ومن المرجح أن الجهاز الموصول لا يستخدم بروتوكول النص. العديد من الأجهزة تستخدم تنسيق الرسالة ثنائي التي قد يكون النص المضمن في ذلك، ولكن تمثل المعلومات الأخرى مع المزيد من رموز المدمجة.

يرجى تعديل سؤالك وتوفير مزيد من المعلومات، مثل الجهاز الذي كنت التواصل معها من خلال المنفذ التسلسلي، والإخراج الذي تحصل عليه من رمز لديك على التوالي. ان انتاج مفيدة أخرى لإضافة يكون شيئا يطبع تمثيل عشري من البيانات التي قرأتها. وهناك طريقة سريعة وقذرة لذلك هو ما يلي:

import java.math.BigInteger;
...
System.out.println(new BigInteger(1, readBuffer).toString(16));

وأنا لم تكن قد عملت مع هولوكس GPS، ولكن كنت قد كتبت على واجهة غارمين مع javax.comm. في هذه الحالة، تستخدم وحدة بروتوكول غارمين الملكية (ثنائي) بشكل افتراضي، ولكن يمكن مكنت NMEA (يستند إلى نص) 0183 البروتوكول على الجهاز. هل من الممكن أن يتم تلقي شكل رسالة HOLUX الملكية، وتحتاج إلى استخدام بعض الأوامر على وحدة GPS للتبديل البروتوكولات؟

 byte[] readBuffer = null;
                try {
                    while (inputStream.available() > 0) {
                        int n = inputStream.available();
                        readBuffer = new byte[n];
                        inputStream.read(readBuffer, 0, n);
                    }
                    String y = new String(readBuffer, StandardCharsets.ISO_8859_1);
                    String str = new String(readBuffer, "UTF-8");
                    jTextField3.setText("    " + str+ "    ");

وإرضاء لي أن سلسلة من ثنائي

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