# 資料的傳輸--廣播訊息的運用

## 底層傳輸的觀念

資料的傳輸指的是當你的本地端資料有需要傳送給週邊裝置或是網路彼端的電腦時所需要做的事。在電腦的世界中，當要傳輸資料的兩端距離較近的時候，一次可以傳送一個以上的位元組，也就是同一個時間可以連接好多條資料線，一口氣把所有的內容全部都傳送到另外一端，或是在兩端之間彼此互相傳遞。如下圖所示：

![](/files/-LP_4YhylkhHSR6uPA7p)

但是，當傳輸的距離變得很遠的時候，一次太多條資料線就會增加傳輸的成本，一次傳一個位元反而是不得已的考量 ，如下所示：

![](/files/-LP_5KrAcW54NY3QxK_s)

{% hint style="warning" %}
要留意的是，上面的兩張圖只是示意圖，實際上還需要有一些控制線才可以。所以，使用序列埠傳輸至少需要3條線。
{% endhint %}

上面的例子說明的是在最底層硬體的連接線的時候，線路是如何連接的，以及對於連線成本的影響。實際上，我們在寫程式的時候，都已經被作業系統以及程式語言工具幫我們包裝打理好，只要使用到對的程式程序或程式積木來執行就可以了。但是，瞭解你使用的傳輸方式是串列還是並列，對於我們在使用嵌入式系統時就會有些用處。

## Scratch角色間的廣播

在之前的程式中曾經使用過的廣播訊息，是比較高階的作法，而且它的廣播對象是程式內部，因此並沒有所謂的串列和並列的分別。反而是從Scratch程式的廣播作業中可以瞭解到我們設計的程式其實是可以並行作業的，也就是不同的角色其實是可以並行運作的。

{% hint style="info" %}
如果是不同系統或程式之間的廣播，還存在有許多不同的技術，但是這並不在本課程的討論範圍。
{% endhint %}

既然是並行運行，就表示他們的程式是各寫各的，也因此，在角色之間如果需要溝通的話，就需要使用到廣播積木。以下再來延續上一個單元，運用廣播和清單來做一些有趣的實用範例。

### 使用清單來讓貓咪說話&#x20;

首先，來複習一下，透過清單的內容讓角色說話的程式。第一步，先建立一個叫做cat-talks的清單：

![](/files/-LPaH1tqa2lie8lrnZRX)

接著，我們在程式開始執行事件的地方，加入幾個想要讓貓咪說話的內容，而且不要忘了，每次程式要開始對清單新增項目的時候，別忘了要把清單之間的內容都先清乾淨喔。

![](/files/-LPaHpJ6BTydgLpuN-c-)

接著是標準的透過 index 變數逐一存取清單內容的程式積木。在這個例子中，我們逐一地把清單取出，然後讓貓咪把取出的項目說出來，程式積木如下所示：

![](/files/-LPaITZjkvuemHaCRMWJ)

完成上述的兩部份程式積木之後，按下開始執行按鈕，可愛的小貓咪就會把清單的內容逐一說出來，每一次停留2秒的時間。

### 新增一個角色的說話內容

接著 我們建立另外一個要和貓咪對話的角色，這一次我們新增的是小狗，但因為他預設是面向右側，所以一開始還要先把他面向的方向改一下才行，以下是我們的第一版程式積木，別忘了要再新增一個小狗專用的清單變數才行，在這裡我們使用dog-talks：

![](/files/-LPaK9Zjt8kJ0txc-zEO)

因為兩個角色的程式都是使用開始執行的事件積木，因此在按下開始執行之後，兩個角色會同時說話，但是，卻出現了一個問題，就是兩個角色只有同時地講 2句話就結束了。為什麼呢？

原來是我們在兩個不同角色的迴圈中使用了同樣一個index變數，兩個變數互相影響所造成的。為了避免此種情形的發生，我們把貓咪的叫做cindex，小狗的變數叫做dindex，如下所示：

![](/files/-LPaKxI9BV8R9nT0AS54)

這樣就可以看到兩個角色把他們應該要說的內容逐一說出了。

### 透過廣播完成兩個角色之間的對話&#x20;

前面的例子是兩個角色同時各講各的，這和一般的情況是不同的。一般來說，我們要做的是讓兩個角色之間可以對話，也就是一人說一句，貓咪說一句之後換小狗說，小狗說完之後換貓咪說才對。

兩個角色要能夠對話，需要的就是廣播訊息，也就是兩個角色每說完一句就要發出一個讓對方說話的廣播訊息，當角色說完之後再發出讓對方說話的訊息，直到所有的話都講完為止。

我們先讓貓咪說第一句話：

![](/files/-LPaN5PAuxqOcYIaEZYB)

在貓咪說完第一句話之後就發出一個dog-say的廣播，此時，要讓小狗說話就要在收到這個廣播之後的事件開始說話，如下所示：

![](/files/-LPaNQkoGICNda6icG_Z)

在上面的程式積木中先在開始執行的事件中初始化清單的內容，接著再去處理當收到dog-say訊息時要說的內容。當然，在說完之後，也要發出一個cat-say的訊息讓貓咪再說下一句話。也因此，回到貓咪的程式設計部份，也要設計回應 cat-say這個訊息的程式積木：

![](/files/-LPaO9084p1pnkpOQ1Te)

和前面小狗說話的積木基本上是一樣的，就只是它用的是cindex以及cat-talks屬於小貓咪的清單。

不過，上面這兩個事件處理程式沒有被定結束的條件，所以當程式開始執行的時候會停不下來，因為兩個角色一直在互相傳遞訊息。解決的方法是，在增加也索引變數的值之後要檢查是否比清單的項目數還多，如果是的話，就不要再要求對方說話了。

由於開始說話的是貓咪，因此我們在小狗的地方來做結束條件的設定，如下（我們把小狗說話的內容也改了）：

![](/files/-LPaR7bV-QwFv-m8zt9h)

程式的執行結果如下所示：

{% embed url="<https://youtu.be/HgoUWrQRNHk>" %}

## 作業

透過以上的方法，假設我們要設計一個用來教小朋友學習英文單字的互動式介面，舞台佈置如下：

![](/files/-LPaSEcG4tW3YQUQGff9)

在這個場景中，只要箭頭指到的地方，小貓咪就要說出它的英文單字，請問要如何製作出來它的程式呢？

{% embed url="<https://youtu.be/cOQJL-5sNmY>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/csx/liao-de.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
