Nasc Sraitheach#
Réamhrá#
Ceadaíonn an rang serial_link sruth de bheart amha a sheoladh idir róbait. Tá sé deartha le haghaidh cumarsáide idir róbait áit a dtuigeann an róbat tarchuir agus an róbat glactha araon ábhar an tsrutha sonraí.
Cuireann gach úsáid a bhaintear as send sonraí le scuaine an V5 Brain nasctha, agus léitear an scuaine isteach ar dtús, amach ar dtús (FIFO). Má sheoltar iltheachtaireachtaí sula bhfaigheann na húsáidí V5 Brain eile iad, stórálfar agus cuirfear ar ais iad ceann ar cheann san ord inar seoladh iad. Ós rud é gur féidir le teachtaireachtaí scuaine a dhéanamh, d’fhéadfadh sé go gcruthófaí riaráiste má sheoltar an stádas céanna arís agus arís eile i ngach lúb; i gcás loighic ríthábhachtach ó thaobh ama de, seoltar ach amháin nuair a athraíonn luachanna.
Tábhachtach: Caithfidh an dá róbat tionscadail a úsáideann serial_link a bheith ag rith ag an am céanna, nó ní sheolfar/ní gheofar aon sonraí.
Tógálaithe Ranga#
serial_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
Scriostóir Ranga#
Scriosann sé an réad serial_link agus scaoileann sé acmhainní gaolmhara.
~serial_link();
Paraiméadair#
Paraiméadar |
Cineál |
Cur síos |
|---|---|---|
|
|
An Port Cliste a bhfuil an nasc teachtaireachta ceangailte leis, scríofa mar |
|
|
Ainm an naisc seo. Moltar go mbeadh an teaghrán uathúil seo fada go leor chun go gcruthófar aitheantóir uathúil nuair a dhéanann vexos hasháil air. Bheadh ainm nasc lochtach rud éigin cineálach amhail “vexlink” mar d’fhéadfadh foireann eile é a úsáid. |
|
|
An cineál nasc, bíodh sé
|
|
|
Cibé an bhfuil an réad serial_link sreangaithe (réamhshocrú
|
Nótaí#
Tacaíonn VEXlink le cumarsáid gan sreang agus sreangaithe araon, agus moltar cábla cliste modhnaithe le haghaidh naisc sreangaithe chun fadhbanna ródaithe cumhachta a chosc.
Chun cumarsáid gan sreang a dhéanamh, ní mór do gach róbat Raidió Róbat V5 atá ceangailte le Port Cliste a bheith aige.
Is féidir an Raidió VEXlink a úsáid in éineacht le raidió VEXnet Rialaitheora V5, ar cheart é a cheangal leis an gCalafort Cliste leis an uimhir is airde chun coimhlintí a sheachaint.
Chun VEXlink a chruthú, ní mór an dá V5 Brains a bheith ceangailte le Raidió Róbat V5.
Sampla#
Cód do Róbat 1
// Create a wireless link in Port 1 serial_link link = serial_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredCód do Róbat 2
// Create a wireless link in Port 1 serial_link link = serial_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
Feidhmeanna na mBall#
Áirítear leis an rang serial_link na feidhmeanna ball seo a leanas:
isLinked— Seiceálann sé an bhfuil na V5 Brains péireáilte agus ag cumarsáid ar an nasc seo.send— Seolann sé teachtaireacht chuig an Inchinn phéireáilte.receive— Fanann sé leis an gcéad teachtaireacht isteach eile agus seolann sé ar ais í.received— Cláraíonn sé feidhm le glaoch uirthi aon uair a fhaightear teachtaireacht nua.
Sula nglaotar ar aon fheidhmeanna serial_link , ní mór sampla serial_link a chruthú, mar a thaispeántar thíos:
Cód do Róbat 1
// Create a wireless link in Port 1 serial_link link = serial_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredCód do Róbat 2
// Create a wireless link in Port 1 serial_link link = serial_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
Tugann sé seo ar ais an bhfuil na V5 Brains ar nasc sraitheach péireáilte le chéile.
Available Functionsbool isLinked();
Níl aon pharaiméadair ag an bhfeidhm seo.
Return ValuesTugann sé seo luach Boolean ar ais a léiríonn an bhfuil na Brains V5 nasctha:
true— The two V5 Brains are paired and communicating on this link.false— The two V5 Brains are not paired on this link.
Is dea-chleachtas é a sheiceáil i gcónaí go bhfuil na V5 Brains nasctha ag tús tionscadail sula ritheann tú aon chód eile.
Cód do Róbat 1
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.print("Robot 1 - Manager"); Brain.Screen.newLine(); Brain.Screen.print("Sending message..."); // Message to send const char* message = "Hello Robot 2"; // Send the message link.send((uint8_t*)message, strlen(message));
Cód do Róbat 2
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); Brain.Screen.print("Waiting..."); // Buffer to store incoming bytes uint8_t buffer[32] = {0}; int32_t n = link.receive(buffer, sizeof(buffer) - 1); // Null-terminate if (n > 0) { buffer[n] = 0; // Display the message that was sent Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); Brain.Screen.print((char*)buffer); } else { Brain.Screen.newLine(); Brain.Screen.print("No message received"); }
send#
Seolann sé teachtaireacht chuig an inchinn phéireáilte.
Available Functions1 — Seolann sé teachtaireacht ag baint úsáide as maolán beart.
int32_t send( uint8_t *buffer, int32_t length );
Parameters2 — Seolann sé teachtaireacht ag baint úsáide as maolán carachtar.
int32_t send( const char *buffer, int32_t length );
Paraiméadar |
Cineál |
Cur síos |
|---|---|---|
|
|
An maolán le seoladh chuig an Inchinn V5 nasctha eile. |
|
|
Fad an mhaoláin le seoladh. |
Tugann sé int32_t a léiríonn líon na mbeart a seoladh.
Cód do Róbat 1
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 1 - Manager"); // Track last sent state uint8_t lastState = 255; // impossible initial value // Tell Robot 2 when the screen is being pressed while (true) { uint8_t state = Brain.Screen.pressing() ? 1 : 0; // Only send if state changed if (state != lastState) { link.send(&state, 1); lastState = state; } wait(0.02, seconds); }
Cód do Róbat 2
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); Brain.Screen.print("Waiting..."); // Track the last state uint8_t lastShown = 255; while (true) { // Variable stores 1 - pressed, 0 - not pressed uint8_t state = 0; int32_t n = link.receive(&state, 1, 200); // Only update screen if state changes if (n == 1 && state != lastShown) { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); // Display text if Robot 1's screen is being pressed if (state == 1) { Brain.Screen.print("Manager IS being pressed!"); } else { Brain.Screen.print("Manager is NOT being pressed"); } lastShown = state; } wait(0.02, seconds); }
receive#
Fanann leis an gcéad teachtaireacht eile atá ag teacht isteach agus tugann sí ar ais í.
Available FunctionsParameters1 — Faigheann sé teachtaireacht i maolán carachtar le ham scoir roghnach.
int32_t receive( char *buffer, int32_t length, int32_t timeoutMs = 500);
Paraiméadar |
Cineál |
Cur síos |
|---|---|---|
|
|
An maolán chun an teachtaireacht a fuarthas a stóráil. |
|
|
Fad an mhaoláin. |
|
|
Cé chomh fada i milleasoicindí a fhanfaidh |
Tugann sé int32_t a léiríonn líon na mbeart a fuarthas.
receiveseolann an chéad teachtaireacht eile atá sa scuaine ón V5 Brain nasctha eile.Léitear teachtaireachtaí in ord FIFO (an ceann is sine gan léamh ar dtús).
Má tá an scuaine folamh nuair a ghlaotar
receive, fanann sé suas go dtí an teorainn amatimeoutMsle haghaidh teachtaireacht nua.Mura dtagann aon teachtaireacht isteach sa fhuinneog sin, tugann
receive0ar ais, agus fanann aon teachtaireacht a sheoltar ina dhiaidh sin sa scuaine le léamh an chéad uair eile a úsáidtearreceive.
Cód do Róbat 1
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 1 - Manager"); // Track last sent state uint8_t lastState = 255; // impossible initial value // Tell Robot 2 when the screen is being pressed while (true) { uint8_t state = Brain.Screen.pressing() ? 1 : 0; // Only send if state changed if (state != lastState) { link.send(&state, 1); lastState = state; } wait(0.02, seconds); }
Cód do Róbat 2
// Create the link serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); Brain.Screen.print("Waiting..."); // Track the last state uint8_t lastShown = 255; while (true) { // Variable stores 1 - pressed, 0 - not pressed uint8_t state = 0; int32_t n = link.receive(&state, 1, 200); // Only update screen if state changes if (n == 1 && state != lastShown) { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); // Display text if Robot 1's screen is being pressed if (state == 1) { Brain.Screen.print("Manager IS being pressed!"); } else { Brain.Screen.print("Manager is NOT being pressed"); } lastShown = state; } wait(0.02, seconds); }
received#
Cláraíonn sé feidhm le glaoch uirthi aon uair a fhaigheann an V5 Brain sonraí.
Available FunctionsParameters1 — Cláraíonn sé feidhm ghlao ar ais do gach maolán beart a fhaightear.
void received( void (* callback)(uint8_t *, int32_t) );
Paraiméadar |
Cineál |
Cur síos |
|---|---|---|
|
|
Feidhm atá sainmhínithe roimhe seo a ritheann nuair a fhaigheann an V5 Brain sonraí. |
Ní thugann an fheidhm seo luach ar ais.
Notesreceivedglaoitear ar ais le dhá argóint: maolán beart agus líon na mbeart a fuarthas.B’fhéidir nach mbeidh críoch nialasach ar na sonraí a fuarthas. Má dhéileálann an glao ar ais leis na sonraí mar shreangán, cóipeáil na bearta a fuarthas isteach i sraith carachtar agus cuir críoch nialasach leis.
callback(buffer, length)
Argóint |
Cur síos |
|---|---|
|
Pointeoir chuig an maolán beart a fuarthas. |
|
Líon na mbeart a fuarthas. |
Cód do Róbat 1
// Create the link. serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Send left or right when pressed. void screen_pressed() { if (Brain.Screen.xPosition() < 240) { link.send((uint8_t*)"left", 4); } else { link.send((uint8_t*)"right", 5); } } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Do not run code UNTIL the Brains are linked. while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.print("Robot 1 - Manager"); Brain.Screen.pressed(screen_pressed); while (true) { wait(10, msec); } }
Cód do Róbat 2
// Called when message received. void received_callback(uint8_t *buffer, int32_t length) { char msg[32]; // Copy safely and null terminate. int n = (length < 31) ? length : 31; memcpy(msg, buffer, n); msg[n] = '\0'; Brain.Screen.clearScreen(); Brain.Screen.setCursor(1,1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); // Display if Robot 1's screen is pressed on left or right if (strcmp(msg, "left") == 0) { Brain.Screen.print("Manager pressed LEFT"); } else if (strcmp(msg, "right") == 0) { Brain.Screen.print("Manager pressed RIGHT"); } } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create the link. serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked. while (!link.isLinked()) { wait(0.1, seconds); } link.received(received_callback); Brain.Screen.clearScreen(); Brain.Screen.setCursor(1,1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); Brain.Screen.print("Waiting..."); while (true) { wait(10, msec); } }