প্রতিধ্বনি এবং বিড়াল ব্যবহার করে সিরিয়াল লুপব্যাকের পরীক্ষা অপ্রত্যাশিত ফলাফল


18

সুতরাং আমার কাছে একটি স্ট্যান্ডার্ড আরএস 232 সিরিয়াল পোর্ট রয়েছে যা কেবল Tx থেকে আরএক্স পর্যন্ত একটি তারের চালিয়ে নিজেই ফিরে ফিরে আসে। আমি চালিয়ে echoএবং catদুটি পৃথক টার্মিনালে লুপব্যাক পরীক্ষা করছি :

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

আমার ইস্যুটি আউটপুট নিয়ে। আমি একটি "হাই" টার্মিনাল চলমান বিড়ালটিতে ফিরে আসার প্রত্যাশা করব তবে পরিবর্তে আমি এটি পেয়েছি:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... এবং এই পর্যন্ত আমি ctrl+ না c cat

বিড়ালটিকে বাধা দেওয়ার পরে, আমি যদি আবার এটি চালাই তবে এটি দ্বিতীয় হাই প্রতিধ্বনি চালানো পর্যন্ত "হাই" গুলি আউটপুট দেয় না।

এটা কি স্বাভাবিক? কোনও ধারণা কেন আমি এই আচরণটি দেখছি?

সম্পাদনা : নতুনরেখার দ্বারা, আমি ASCII বলতে চাইছি 0x0A। এই আউটপুটে কোনও গাড়ীর রিটার্ন নেই।


একই ডিভাইসটি দুটি প্রক্রিয়া খোলার কারণে এটি হতে পারে? আপনি যদি চালিয়ে যান tip /dev/ttyS1( ~.প্রস্থান করতে) এবং সেখানে ডেটা টাইপ করার চেষ্টা করছেন? তারটি সংযুক্ত থাকাকালীন এটি আপনার টার্মিনালে প্রদর্শিত হবে, কারণ এটি সঞ্চারিত যা প্রাপ্ত তা গ্রহণ করে।
এমআরবি

3
আপনি কি সত্যিই নতুনলাইন, বা ক্যারেজ-রিটার্ন / নিউলাইন জুটি পাচ্ছেন? পার্থক্যটি আপনি যে স্তরে কাজ করছেন তা গুরুত্বপূর্ণ। "বিড়াল / দেব / ttyS1> সামুফিল" চেষ্টা করুন তারপরে টিটিওয়াই ডিভাইস ফাইল থেকে কী বাইটস আসছে তা দেখতে "ওড-এক্স সামুফিল" করুন। এছাড়াও, একটি "stty -F / dev / ttyS1 -a" করুন। "স্টাটি" এর জন্য ম্যান পৃষ্ঠাটি পড়ুন এবং প্রতি সামান্য সেটিংয়ের জন্য স্টাটির আউটপুট আপনাকে কী বলে তা দেখুন। আরএস 232 সিরিয়াল কমগুলি জটিল।
ব্রুস এডিগার

উত্তর:


21

ব্রুসের দ্বিতীয় মন্তব্যের জন্য ধন্যবাদ, আমি নিজেই সমস্যাটি বের করতে সক্ষম হয়েছি।

দৌড়ানোর পরে stty -a -F /dev/ttyS1, 3 টি বিকল্প ছিল যা আমি সমস্যার জন্য অবদান রাখতে পেয়েছি: "প্রতিধ্বনি", "onlcr" এবং "আইক্রনল"।

যেহেতু এই সিরিয়াল বন্দরটি নিজের কাছে ফিরে ফিরে এসেছে, দৌড়ানোর পরে যা ঘটেছিল তা এখানে echo "hi" > /dev/ttyS1:

  1. echoকমান্ড ডিফল্টরূপে বার্তা শেষে একটি newline, তাই "হাই" + + এলএফ আউট, / dev / ttyS1 পাঠানো হয় appends
  2. "Onlcr" সেট করা থাকায় সিরিয়াল ডিভাইস LF কে CRLF এ রূপান্তর করেছিল তাই Tx লাইনটি প্রেরণকারী শারীরিক বার্তাটি "হাই" + CRLF ছিল
  3. "আইসিআরএনএল" সেট করা থাকায়, আরএক্স লাইনে প্রাপ্ত শারীরিক বার্তাটি সিআরকে এলএফতে রূপান্তর করেছিল। সুতরাং 'বিড়াল' দ্বারা আউটপুট করা বার্তাটি ছিল "হাই" + এলএফএলএফ।
  4. "প্রতিধ্বনি" সেট করা হওয়ার কারণে, আরএক্স ("হাই" + এলএফএলএফ) এ প্রাপ্ত বার্তাটি টিএক্স লাইনে আবার পাঠানো হয়েছিল।
  5. Onlcr এর কারণে, "হাই" + এলএফএলএফ "হাই" + সিআরএলএফসিএলএফআরএফ হয়েছে।
  6. আইক্রনলের কারণে, "হাই" + সিআরএলএফসিআরএলএফ "হাই" + এলএফএলএফএলএফএলএফ হয়ে গেছে
  7. প্রতিধ্বনির কারণে, "হাই" + এলএফএলএফএলএফএলএফ তখন টিএক্স বাইরে পাঠানো হয়েছিল

এবং আরও ...

এই সমস্যাটি সমাধানের জন্য, আমি নিম্নলিখিত কমান্ডটি চালিয়েছি:

stty -F /dev/ttyS1 -echo -onlcr

"প্রতিধ্বনি" অক্ষম করা বার্তাগুলির অসীম লুপটিকে আটকায় এবং "অনেলসিআর" অক্ষম করে সিরিয়াল ডিভাইসটিকে আউটপুটটিতে এলএফ-কে সিআরএলএফ রূপান্তরিত করতে বাধা দেয়। এখন catপ্রতিবার আমি চালানোর জন্য একটি "হাই" (একক নিউলাইন সহ!) পান echo

সিআর = ক্যারেজ রিটার্ন (ASCII 0x0D); এলএফ = লাইন ফিড বা নিউলাইন (ASCII 0x0A)


-icrnlআমার জন্য কৌশলটি।
tcpaiva

3

পরীক্ষার জন্য সিরিয়াল টিটিআইতে ফাইলগুলি কনটেনেট করার সাথে আমার একই রকম সমস্যা ছিল। গৃহীত উত্তর ছাড়াও:

আপনি যদি এর মতো কিছু করে সিরিয়াল আউটপুট পরীক্ষা করে থাকেন:, cat somefile.txt > /dev/ttyS0আপনি সঠিক বাইট মানগুলির জন্য পরীক্ষা করে নিলে এতে ভাল পরিমাণে অপ্রত্যাশিত বাইট ডেটা থাকবে।

সঙ্গে sttyএকটি সহজ করছেন stty raw -F /dev/ttyS0ঢোকাতে থেকে টার্মিনাল বন্ধ হবে / অক্ষর প্রতিস্থাপন (যেমন [...] 0x0A [...]-> [...] 0x0D 0x0A [...])। rawপতাকা টার্মিনাল মোড পরিবর্তন তাই কোনও ইনপুট এবং আউটপুট প্রক্রিয়াকরণ সঞ্চালিত হয়।


1
হুম ... দেখে মনে হচ্ছে না stty rawডিফল্টরূপে প্রতিধ্বনি অক্ষম করবে। আপনার দরকার হতে পারে stty raw -echo
বিমিনিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.