সিরিয়াললিঙ্ক#
ভূমিকা#
সিরিয়াললিঙ্ক দুটি EXP ব্রেইনকে VEX লিঙ্কের মাধ্যমে সরাসরি সিরিয়াল ডেটা পাঠানো ও গ্রহণ করার সুযোগ দেয়। লেবেলযুক্ত বার্তার পরিবর্তে, সিরিয়াললিঙ্ক একটি বাফার (একটি স্ট্রিং বা একটি বাইটঅ্যারে) প্রেরণ করে। এটি উন্নত রোবট-টু-রোবট যোগাযোগের জন্য এটিকে উপযোগী করে তোলে, যেমন সেন্সর ডেটা স্ট্রিমিং, কাস্টম প্যাকেট ফরম্যাট পাঠানো, অথবা বাইটের উপর ভিত্তি করে নিজস্ব প্রোটোকল তৈরি করা।
send এর প্রতিটি ব্যবহার লিঙ্ক করা EXP Brain-এর রিসিভ বাফারে ডেটা যোগ করে। ডেটা আসার ক্রমানুসারে পড়া হয় (ফার্স্ট-ইন, ফার্স্ট-আউট)। যদি অন্য EXP Brain receive ব্যবহার করার আগে একাধিক বাফার পাঠানো হয়, তাহলে সেগুলি কিউতে থেকে যায় এবং পাঠানোর ক্রমানুসারে এক এক করে ফেরত আসে। যেহেতু ডেটা কিউতে জমা হতে পারে, তাই প্রতিটি লুপে বারবার বড় বাফার পাঠালে ব্যাকলগ তৈরি হতে পারে; সময়-সংবেদনশীল লিঙ্কগুলির জন্য, কেবল আপনার যা প্রয়োজন তাই পাঠান।
গুরুত্বপূর্ণ: উভয় রোবটকে অবশ্যই একই সময়ে SerialLink ব্যবহার করে এমন প্রজেক্ট চালাতে হবে, অন্যথায় কোনো ডেটা পাঠানো বা গ্রহণ করা যাবে না।
এই পৃষ্ঠায় উদাহরণ link নাম হিসেবে SerialLink ব্যবহার করা হয়েছে। প্রয়োজন অনুযায়ী এটিকে আপনার নিজস্ব কনফিগার করা নাম দিয়ে প্রতিস্থাপন করুন।
উপলব্ধ পদ্ধতিগুলোর একটি তালিকা নিচে দেওয়া হলো:
is_linked– এই ব্রেইনটি তার জোড়া ব্রেইনের সাথে সক্রিয়ভাবে সংযুক্ত আছে কিনা তা ফেরত দেয়।send– জোড়া ব্রেইনে একটি সংক্ষিপ্ত বার্তা পাঠায় (ঐচ্ছিক int/float ডেটা সহ)।receive– পরবর্তী আগত বার্তার জন্য অপেক্ষা করে এবং তা ফেরত পাঠায়।received– যখনই একটি নতুন বার্তা পাওয়া যাবে তখন কল করার জন্য একটি ফাংশন নিবন্ধন করে।
একটি লিঙ্ক তৈরি করুন#
উভয় EXP Brain-এ একটি SerialLink তৈরি করুন, যাতে তাদের মধ্যে একটি যোগাযোগ চ্যানেল স্থাপিত হয়—হয় V5 Robot Radios-এর মাধ্যমে তারবিহীনভাবে অথবা একটি তারযুক্ত Smart Cable-এর মাধ্যমে—এবং রোবটগুলো একে অপরের কাছে র সিরিয়াল ডেটা পাঠাতে পারে।
SerialLink(smartport, name, linktype, wired)
প্যারামিটার |
বর্ণনা |
|---|---|
|
এই লিঙ্কের জন্য ব্যবহৃত স্মার্ট পোর্ট—যে পোর্টে V5 রোবট রেডিও সংযুক্ত থাকে (ওয়্যারলেস) অথবা স্মার্ট ক্যাবলটি প্লাগ করা থাকে (ওয়্যারড)। এটিকে |
|
এই লিঙ্কটিকে স্ট্রিং হিসেবে যে অনন্য নামটি দেওয়া হবে। |
|
এই ব্রেইনটি এই লিঙ্ক পেয়ারের জন্য যে ভূমিকা পালন করবে। প্রতিটি পেয়ারে অবশ্যই একজন ম্যানেজার এবং একজন ওয়ার্কার থাকতে হবে:
|
|
ঐচ্ছিক। এই সংযোগটি তারযুক্ত নাকি তারবিহীন:
|
রোবট ১-এর জন্য কোড
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)রোবট ২ এর কোড
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
উপলব্ধ পদ্ধতি#
একবার আপনার SerialLink সেট আপ হয়ে গেলে এবং Brain-গুলো লিঙ্ক হয়ে গেলে, আপনি নিচের পদ্ধতিগুলো ব্যবহার করে র সিরিয়াল ডেটা পাঠাতে, গ্রহণ করতে এবং তার উত্তর দিতে পারবেন।
is_linked#
is_linked মেথডটি রিটার্ন করে যে একটি SerialLink-এ থাকা EXP Brain-গুলো একে অপরের সাথে জোড়বদ্ধ কিনা।
True– দুটি EXP ব্রেইন জোড়া বেঁধেছে এবং এই লিঙ্কে যোগাযোগ করছে।False– এই লিঙ্কে দুটি EXP Brain জোড়া হিসেবে নেই।
দ্রষ্টব্য: পরবর্তী যেকোনো কোড চালানোর আগে, প্রজেক্ট শুরুর সময়ে EXP Brains গুলো লিঙ্ক করা আছে কিনা তা সবসময় যাচাই করে নেওয়া একটি ভালো অভ্যাস।
Usage:
link.is_linked()
প্যারামিটার |
বর্ণনা |
|---|---|
এই পদ্ধতিতে কোনো প্যারামিটার নেই। |
রোবট ১-এর জন্য কোড
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")রোবট ২ এর কোড
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
send#
send অপর সংযুক্ত EXP ব্রেইনটিতে কাঁচা সিরিয়াল বাইট প্রেরণ করে।
receive দিয়ে সেই ডেটা পড়ার সময়, receive কেবল তখনই রিটার্ন করবে যখন এটি তার length প্যারামিটার দ্বারা নির্দিষ্ট সংখ্যক বাইট সংগ্রহ করবে। সেই কারণে, যদি আপনার কোড সর্বদা একটি নির্দিষ্ট lengthদিয়ে receive কল করে, তাহলে আপনাকে নিশ্চিত করতে হবে যে send দিয়ে পাঠানো প্রতিটি মেসেজ ঠিক তত বাইটের হয় (প্রায়শই প্যাডিং ব্যবহার করে) যাতে রিসিভার অতিরিক্ত বাইটের জন্য অপেক্ষা করে ব্লক না হয়।
যদি আপনি সঠিক বাইট সংখ্যার উপর নির্ভর করতে না চান, তাহলে পরিবর্তে received ব্যবহার করুন; এটি আপনাকে একটি নির্দিষ্ট দৈর্ঘ্যের প্রয়োজন ছাড়াই উপলব্ধ যেকোনো বাইট পরিচালনা করতে দেয়।
Usage:
send(buffer)
প্যারামিটার |
বর্ণনা |
|---|---|
|
অন্য সংযুক্ত EXP ব্রেইনে পাঠানোর জন্য ডেটা। এটি একটি |
রোবট ১-এর জন্য কোড
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")রোবট ২ এর কোড
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
receive#
receive অন্য লিঙ্ক করা EXP ব্রেইন থেকে FIFO ক্রমে (সবচেয়ে পুরানো অপঠিত ডেটা প্রথমে) সিরিয়াল ডেটা ফেরত দেয়।
যেহেতু receive একটি নির্দিষ্ট সংখ্যক বাইটের জন্য অপেক্ষা করে, তাই send ব্যবহার করার সময় নির্দিষ্ট দৈর্ঘ্যের মেসেজিং-এ প্রায়শই প্যাডিং-এর প্রয়োজন হয়, যাতে প্রতিটি মেসেজ প্রত্যাশিত আকারে পৌঁছায়। যদি প্রেরক length বাইটের চেয়ে কম ডেটা প্রেরণ করে, তাহলে receive অবশিষ্ট বাইটগুলোর জন্য অপেক্ষা করতে থাকবে এবং কিছুই ফেরত পাঠাবে না।
If the queue is empty and you provide a timeout, receive waits up to that many milliseconds for new data. If nothing arrives in that window, it returns None. Any data sent afterward remains queued to be read later.
Usage:
receive(length, timeout)
প্যারামিটার |
বর্ণনা |
|---|---|
|
গ্রহণ করার জন্য বাইটের সংখ্যা। |
|
ঐচ্ছিক। কতক্ষণ (মিলিসেকেন্ডে |
রোবট ১-এর জন্য কোড
# Send a math problem for the other Brain to solve # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ packet = "add,7,2.5" # Pad with spaces until it's exactly 16 bytes while len(packet) < 16: packet = packet + " " link.send(packet)রোবট ২ এর কোড
# Solve the math problem that the other Brain sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # Receive exactly 16 bytes buffer = link.receive(16) # Remove the added " " padding text = buffer.decode().strip() # Separate the operator and numbers parts = text.split(",") operator = parts[0] a = float(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If not "add" or "subtract", do nothing else: pass brain.screen.print("Result = ", result)
received#
received একটি ফাংশন রেজিস্টার করে, যা EXP Brain যখনই সিরিয়াল ডেটা গ্রহণ করে, তখনই কল করা হবে।
Usage:
link.received(callback)
প্যারামিটার |
বর্ণনা |
|---|---|
|
পূর্বে সংজ্ঞায়িত একটি ফাংশন যা EXP ব্রেইন সিরিয়াল ডেটা গ্রহণ করলে কার্যকর হয়। |
received কলব্যাক দুটি আর্গুমেন্ট সহ কল করা হয়েছে:
কলব্যাক সিগনেচার:
callback(buffer, length)
যুক্তি |
বর্ণনা |
|---|---|
|
প্রাপ্ত সিরিয়াল ডেটা ধারণকারী একটি |
|
এই কলব্যাকের জন্য |
রোবট ১-এর জন্য কোড
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")রোবট ২ এর কোড
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)