本文章是由機器翻譯。

Robotics

撰寫和測試 VPL 服務的序列通訊

Trevor Taylor

Microsoft 機器人開發 o 人 h 員 û 工 u 具 ã Studio (RDS) 是,如預期平台的程式設計機器人。 RDS 先出貨 2006 年,六月 2009年於發行最新版本 RDS 2008 R2。

RDS 包含四個主要元件:並行存取和協調方面執行階段 (CCR) 分散式軟體服務 (DSS)、 Visual 程式設計語言 (VPL) 和 Visual 模擬環境 (VSE)。 關於在 2008 年六月發行的 VSE 撰寫 Sara MorganMSDN 雜誌 (msdn.microsoft.com/magazine/cc546547).

VPL,但是,是更相關,這份文件。 VPL 是表示藉由在螢幕上繪製圖表建立程式的一個資料流] 語言。 在執行階段訊息會從一個區塊流向到另一個,圖表中,這個資料流有效地執行路徑的程式。 因為 VPL 建置 CCR 和 DSS 的上方,dataflows 非同步 (的結果從服務通知),就會發生,而且也可以平行執行。 雖然 VPL 供新手程式設計人員,經驗豐富的 coders 也可以找到它非常有用的原型。

這篇文章概述了簡單的 RDS 服務,可讓您能傳送和接收資料使用序列連接埠 (也稱為 COM 連接埠)。 程式碼範例會說明某些參與撰寫可重複使用 RDS 服務的主要概念。

若要深入了解 RDS 並下載平台,請移至 microsoft.com/robotics。 封裝包含則也可以使用在 msdn.microsoft.com/library/dd936006 的有用的說明檔案。 您也可以在 各種機器人討論論壇中張貼問題],取得進一步的協助social.msdn.microsoft.com/Forums/en-us/category/robotics.

RDS 服務

RDS 服務會使用 CCR 和 DSS 建置的。 因為 RDS 具有以服務導向架構 (SOA) Representational 狀態傳輸 (REST) 模型,使用 [分散式軟體服務通訊協定 (DSSP) 服務之間的通訊基礎,它們是在概念上類似 Web 服務。 搜尋所有這個字母 soup 透過,這表示是您 don’t 交談直接 RDS 服務。 而是,將訊息傳送至一個充當外部介面 (方法 Web 開發人員可能會熟悉) 服務的 Proxy 中。 這也表示服務可散發任何地方在網路上。

使用 Proxy 有兩個效果。 請先,服務之間傳送的訊息會序列化傳輸之前,還原序列化,另一端。 XML 是正在傳輸的資料一般的格式。 第二個,Proxy 定義合約 — 有效地公開給其他服務的 API 的集合。

每個服務具有您可以擷取或修改該服務上的作業的內部狀態。 這些都牽涉到的傳送要求訊息,並等待類似於使用大部分的 Web 服務的處理序中的回應訊息。

當服務 ’s 狀態變更時,在給訂閱者可以傳送出通知。 此發佈-和-訂閱方法可讓 RDS 服務不同於傳統的 Web 服務因為告知訊息將以非同步方式傳送給訂閱者。

您在建置新服務時它會自動變成可見 VPL 中,您可以啟動立即使用。 這是其中一項關鍵的 RDS 功能,而且會它讓測試和建立原型很簡單 — 您 don’t 需要在 C# 中撰寫測試載具因為您可以使用 VPL 來替代。

從遠端控制機器人

許多簡單的教育機器人有其 on-board 大腦的 8 位元或 16 位元 microcontrollers。 但因為.NET Framework 下執行 Windows 上 RDS,它 doesn’t 產生可以直接在這些機器人執行的程式碼。 它們必須從遠端控制透過通訊連結來代替。 (替代方案有一個 on-board 的個人電腦如 MobileRobots Pioneer 3DX 是)。

因為大部分的 microcontrollers 支援序列連接埠,序列連線是明顯的解決方案。 不過,提供使用纜線連結 isn’t 理想 — 它會限制機器人 ’s 行動力。

另一個方法您可以藉由安裝到藍芽序列裝置上機器人建立無線連線使用 「 Bluetooth 」。 有些機器人 LEGO NXT,例如隨附的內建的 「 Bluetooth 」。 其他人,例如 RoboticsConnection 刺,有選擇性的 「 Bluetooth 」 模組。 「 Bluetooth 」 是一個很好的選擇,假設它 ’s 標準大部分的膝上型電腦上這些天。 即使您的 PC doesn’t 具有 Bluetooth,尋找價格低廉、 隨時可用的 USB Bluetooth 裝置。

好消息是您 don’t 必須知道任何關於程式設計 Bluetooth 因為機器人連線會顯示為虛擬的序列連接埠。 可以使用相同的程式碼,作為實體纜線已提供序列連線時所執行的動作一樣。 唯一的差別在於您必須建立一個搭配您的 PC 與藍芽裝置上機器人之間讓虛擬 COM 連接埠將會被建立。

有些機器人控制器版有可接受使用簡單的指令語言的指令的韌體。 比方說與 RoboticsConnection (其取得其名稱,其使用序列通訊協定) 從序列化程式,您可以鍵入透過終端機程式像 [超級終端機] 控制站的命令。 命令所有人們可讀取,且終止每個藉由按下 請輸入。

如果您設計您自己使用的通訊協定與機器人,您需要做幾個選擇。 首先,您必須決定是否傳送二進位資料。 將二進位值轉換成十六進位或十進位傳輸需要更多的頻寬,並增加負荷的 on-board CPU 處理。 在另一方面,它會讀取訊息更容易,而您 won’t 遇到任何奇怪的行為,因為以 misinterpreted 的控制字元。

下一個問題是是否要使用固定長度的封包或更有彈性的變數長度格式。 固定長度,都可以輕易地剖析和最適用於十六進位。

您也應該考慮是否您使用總和檢查碼。 正在計算核取的數字的電腦對電腦通訊是很容易的。 如果但是,您想要以手動方式輸入命令,以測試您機器人,找出核取位數取得非常難以處理。 使用 [加總檢查碼時 
typically 接收者會傳送回未認可 (ACK) 或負認可 (NAK) 取決於是否命令附成功與否。 您決定使用總和檢查碼真的談往下,到連線的可靠性。

SerialPort 服務

它應該是明顯由現在為什麼序列連接埠服務是很有用。 RDS] 封裝不過,doesn’t 包含這類服務雖然許多的機器人 範例 使用序列通訊連結。 如果您瀏覽 RDS 範例程式碼,發現每個範例以不同方式處理序列連接埠。 這篇文章概述了使用一個序列連接埠的其中一種方法。 它不 ’s 唯一的方法以及不一定是最佳的方式。

進一步繼續任何之前, 請確定您下載並安裝 RDS. 在本文中下載包含 
SerialPort 服務的原始程式碼。 將它解壓縮到您的 RDS 安裝目錄 (也稱為掛接點)] 下的資料夾。 請注意您應該保留您的程式碼分開,讓您 don’t 混合向上您的程式碼與 [Microsoft 隨附 RDS 範例資料夾。 而且,建議放置您 RDS 掛接點下方而其他地方不是在您的硬碟機的程式碼因為它簡化了開發。 我有我讓我自己的所有程式碼中子資料夾,方便您備份 [專案] 資料夾。

SerialPort 原始程式碼中主要的檔案是 SerialPort.cs、 SerialPortTypes.cs 和 SerialPort.manifest.xml。

SerialPort.cs 保留該服務或行為的實作。 組成服務類別本身,其中包含作業處理常式,加上任何必要的支援方法和變數。

SerialPortTypes.cs 包含服務狀態、 作業型別和訊息類型的定義。 作用中它描述介面,該服務,並不應包含任何可執行的程式碼。 這是有關服務合約的重點 — ’s 只有一個資料定義。

SerialPort.manifest.xml 稱為資訊清單,說明如何結合,或 orchestrated 以執行應用程式服務。 這個檔案是用來做為建立內部執行服務的 DSS 節點 「 DssHost 」 公用程式的輸入。 在這種情況下資訊清單只會執行是相當無用的 「 SerialPort] 服務。 有用的資訊清單也會指定依賴 SerialPort 服務使連線其他服務。

在使用 SerialPort 服務之前必須執行 DssProjectMigration 工具,並再重新編譯該服務。 開啟 DSS 命令提示字元 (尋找 RDS] 下 [開始] 功能表中),並確定您的路徑設定讓您可以在 \bin 資料夾中執行的檔案。 然後將變更為目錄解壓縮程式碼的地方,輸入下列命令:

Dssprojectmigration /b- .

/b-option 表示 don’t 建立備份複本,句點字元 (.) 是指目前的目錄。

您可以編譯 Visual Studio 中的服務或執行這項操作從命令列鍵入:

Msbuild serialport.sln

編譯該服務會產生服務 DLL]、 [Proxy DLL,] 和 [轉換 (可將轉譯服務 DLL 和 Proxy 之間的資料型別) 的 DLL。 這些會全部放入 [RDS mountpoint 下的 [\bin] 資料夾。 您也應該將複製 \範例\config 資料夾 (雖然這 isn’t 基本) 一起保存將資訊清單和組態檔。

服務合約

每個服務具有一個唯一的合約] 識別項在 Types.cs 檔中宣告,並看起來像是一個 URL。 但是,注意,它在 Web 上有沒有意義,而且使用 URL 樣式識別項是只是一種很方便的方法來保證唯一性藉由允許組織建立他們自己的命名空間。 (針對您的專案您需要使用命名空間以外 microsoft.com/robotics)。SerialPortTypes.cs 包含下列定義:

public sealed class Contract {
  [DataMember]
  public const string Identifier = "http://www.promrds.com/contracts/2009/12/serialport.html";
}

服務合約,也包含的狀態和定義其他服務可以操作何種屬性的作業和方式。 SerialPortState (請參閱 圖 1) 包括序列連接埠組態、 逾時,某些參數和接收非同步運算時的最後一個位元組。

圖 1SerialPortState

[DataContract]
public class SerialPortState {
  private bool _openOnStart;
  private bool _asynchronous;
  private SerialPortConfig _config;
  private byte _lastByteReceived;
  private bool _isOpen;

  // Open the COM port when the service starts
  // Must be set in config file
  [DataMember]
  public bool OpenOnStart {
    get { return _openOnStart; }
    set { _openOnStart = value; }
  }

  // Operate in Asynchronous mode 
  [DataMember]
  public bool Asynchronous {
    get { return _asynchronous; }
    set { _asynchronous = value; }
  }

  // Configuration parameters for the serial port
  [DataMember]
  public SerialPortConfig Config {
    get { return _config; }
    set { _config = value; }
  }

  // Last byte received from the serial port
  [DataMember]
  public byte LastByteReceived {
    get { return _lastByteReceived; }
     set { _lastByteReceived = value; }
  }

  // Indicates if the port is currently open
  [DataMember]
  public bool IsOpen {
    get { return _isOpen; }
    set { _isOpen = value; }
  }
}

您可以在狀態] 及 [訊息類型中定義自己的資料型別,供使用。 此服務中有 ’s SerialPortConfig 類別。 若要讓它顯示在 Proxy,它必須是公用和標記與 [DataContract] 屬性。 在類別中的每個屬性必須宣告公用,而且也是標記使用 [DataMember] 屬性。 如果這 isn’t 做屬性將無法存取。

您也可以公開公用列舉 — 這樣一來,其他程式設計師 don’t 一定要使用您的服務的程式碼中使用神奇數字。 它 ’s 良好的程式設計太,作法,因為它允許資料型別檢查。

當您設計一個服務時,也必須決定如何其他服務將會與它互動。 這個 SerialPort 服務支援下列作業的邏輯群組下面列出:

  • 取得、 訂閱
  • ReceiveByte
  • SetConfig,開啟、 關閉 ClearBuffers
  • ReadByte ReadByteArray,ReadString
  • WriteByte WriteByteArray,WriteString

請注意 ReceiveByte 作業是供內部使用的服務本身的而且 shouldn’t 由其他服務使用。 稍後會有更多說明。

是的讀取和寫入作業,所有同步 — 服務沒有回應,直到操作已完成。 如果您在非同步模式 (說明如下) 中開啟序列連接埠,服務會傳送收到每個位元組的 ReceiveByte 通知給您,而且您不應該使用讀取作業。 寫入的作業不過,永遠是同步。

每個作業具有要求訊息類型和回應訊息類型。 其中有些可能會有屬性,且其他人會是空白 — 本身的資料型別,即足以傳達適當的訊息。

服務行為

如先前所述,服務的可執行的程式碼就會處於 SerialPort.cs。 所有服務都衍生自 DsspServiceBase 它提供了數個 Helper 方法和屬性。 啟動服務時呼叫其 Start 方法:

protected override void Start() {
  InitializeState();
  base.Start();
  if (_state.OpenOnStart)
    OpenPort();
}

開始負責初始化狀態 (如有必要的話),然後在如果 OpenOnStart 指定 (說明如下) 的組態檔中,會自動開啟序列埠。

支援服務的每個作業必須有服務處理常式。 但如卸除] 及 [Get,某些作業由基礎結構 (除非您想要覆寫預設行為)。

OpenHandler 顯示非常簡單的處理常式:

[ServiceHandler]
public void OpenHandler(Open open) {
  // Remember the Asynchronous flag
  _state.Asynchronous = open.Body.Asynchronous;
  if (OpenPort()) {
    open.ResponsePort.Post(
      DefaultSubmitResponseType.Instance);
  }
  else {
    throw (new Exception(“Open Failed”));
  }
}

這個處理常式會呼叫 OpenPort 內部方法。 如果這是成功,會回傳回應。 因為沒有資訊来傳回,這是只由 DSS 提供一個預設回應。

如果接著就會擲回例外狀況開啟失敗。 DSS 攔截的例外狀況,並將其轉換成將會為回應傳送的錯誤。 雖然不立即明顯,如果發生例外狀況中 OpenPort,它也會反昇,並傳回一個錯誤。

有 ’s 解釋 OpenPort] 方法的所有不需要,但是一個點是重要 — 您可以開啟同步或非同步作業的序列連接埠。 在同步模式中所有的讀取和寫入要求傳回回應之前完成。 不過,如果您在非同步模式中開啟時,收到每個字元會傳送通知。 若要將這項工作程式碼會設定傳統的事件處理常式:

if (_state.Asynchronous) {
  // Set up an Event Handler for received characters
  sp.ReceivedBytesThreshold = 1;
  sp.DataReceived += new SerialDataReceivedEventHandler(
    DataReceivedHandler);
}

事件處理常式] 所示 圖 2. 這個處理常式會在.NET 執行緒上執行。 但交互操作 DSS,它必須能切換至 CCR 執行緒讓程式碼將 ReceiveByte 要求張貼到服務自己 ’s 作業主要連接埠。 之後張貼要求,程式碼應該接收回應,否則會有記憶體流失。 這是 Arbiter.Choice 的使用匿名委派的 C# 簡短附註,處理兩個可能的回應的目的。 一個啟動是為了將 Choice 接收者放入作用中的佇列。 僅容錯相關在這種情況下,成功的結果將不會有任何作用。

圖 2事件處理常式

void DataReceivedHandler(object sender, 
  SerialDataReceivedEventArgs e) {

  int data;
  while (sp.BytesToRead > 0) {
    // Read a byte - this will return immediately because
    // we know that there is data available
    data = sp.ReadByte();
    // Post the byte to our own main port so that
    // notifications will be sent out
    ReceiveByte rb = new ReceiveByte();
    rb.Body.Data = (byte)data;
    _mainPort.Post(rb);
    Activate(Arbiter.Choice(rb.ResponsePort,
      success => { },
      fault => { LogError("ReceiveByte failed"); }
      ));
  }
}

ReceiveByte 處理常式會處理新的字元,接下來執行:

[ServiceHandler]
public void ReceiveByteHandler(ReceiveByte recv) {
  _state.LastByteReceived = recv.Body.Data;
  // Send a notification, but only if in asynch mode
  if (_state.Asynchronous)
    SendNotification(_submgrPort, recv);
  recv.ResponsePort.Post(DefaultUpdateResponseType.Instance);
}

[ServiceHandler] 屬性可讓 DSS 服務初始化期間攔截處理常式,以便作業連接埠。 這個處理常式傳送通知給訂閱者,然後貼回說出作業已完成的回應。 (要接收通知的服務必須傳送是訂閱的作業給 SerialPort 服務)。

服務處理常式,如另讀取和寫入作業是相當自我闡明。 WriteStringHandler (請參閱圖 3) 不過包含一個小型 wrinkle — 它可以插入之間傳送的字元的小型延遲。 這被為了協助可能無法保留,如果資料傳送完整速度,像是 [BasicStamp 的 
especially 裝置,請執行位元 banging 並 don’t 有硬體通用非同步接收器/傳送器 (UART),因此它們在軟體中執行序列 I/O 的速度較慢 microcontrollers 而設計的。

圖 3WriteStringHandler

[ServiceHandler]
public virtual IEnumerator<ITask> WriteStringHandler(
  WriteString write) {

  if (!_state.IsOpen) {
    throw (new Exception("Port not open"));
  }

  // Check the parameters - An empty string is valid, but not null
  if (write.Body.DataString == null)
    throw (new Exception("Invalid Parameters"));

  // NOTE: This might hang forever if the comms link is broken
  // and you have not set a timeout. On the other hand, if there
  // is a timeout then an exception will be raised which is
  // handled automatically by DSS and returned as a Fault.
  if (_state.Config.InterCharacterDelay > 0) {
    byte[] data = new byte[1];
    for (int i = 0; i < write.Body.DataString.Length; i++) {
      data[0] = (byte)write.Body.DataString[i];
      sp.Write(data, 0, 1);
      yield return Timeout(_state.Config.InterCharacterDelay);
    }
    sp.WriteLine("");
  }
  else
    sp.WriteLine(write.Body.DataString);

  // Send back an acknowledgement now that the data is sent
  write.ResponsePort.Post(DefaultSubmitResponseType.Instance);
  yield break;
}

關於這個處理常式的另一個點在於它是一個 Iterator。 請注意此方法的宣告,如 IEnumerator <itask>和它使用收益事實傳回,並產生中斷。 C# 語言的這項功能可讓 CCR 暫停工作,而不會封鎖執行緒。 執行傳回收益時執行方法的執行緒會傳回到集區。 一旦完成時的逾時,回張貼訊息,可能是在不同的執行緒仍會繼續的執行。

設定服務

組態檔是載入服務初始化期間的服務狀態的 XML 已序列化版本。 它 ’s 支援組態檔,因為它允許您變更該服務的行為,而不需重新編譯是個不錯的作法。 這點特別重要設定 COM 連接埠號碼。

當您宣告狀態執行個體 (在 SerialPort.cs) 時,您可以指定檔案的名稱在服務中:

[ServiceState]
// Add an initial state partner to read the config file
[InitialStatePartner(Optional = true, 
  ServiceUri = "SerialPort.Config.xml")]
SerialPortState _state = new SerialPortState();

在這種情況下我們宣告為選擇性組態 ; 否則服務 won’t 啟動如果組態檔遺失。 在另一方面,這表示您需要檢查服務 ’s Start 方法中的狀態,並將它初始化為某些合理的預設值,必要時。

因為沒有路徑指定為 [ServiceUri,DSS 會假設該檔案是在與用來啟動服務資訊清單相同的資料夾中。 圖 4 顯示典型的組態檔的內容。

圖 4SerialPortState 的組態檔

<?xml version="1.0" encoding="utf-8"?>
<SerialPortState 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns=http://www.promrds.com/contracts/2009/12/serialport.html
  >
  <OpenOnStart>false</OpenOnStart>
  <Asynchronous>false</Asynchronous>
  <Config>
    <PortNumber>1</PortNumber>
    <BaudRate>57600</BaudRate>
    <Parity>None</Parity>
    <DataBits>8</DataBits>
    <StopBits>One</StopBits>
    <ReadTimeout>0</ReadTimeout>
    <WriteTimeout>0</WriteTimeout>
    <InterCharacterDelay>0</InterCharacterDelay>
  </Config>
  <LastByteReceived>0</LastByteReceived>
  <IsOpen>false</IsOpen>
</SerialPortState>

請注意這個組態檔不要求服務,以自動,開啟 COM 連接埠所以您不必傳送開啟要求。

視您的服務有專業的外觀您需要特別注意詳細資料,例如服務描述及圖示。 即使您 don’t 打算使用 VPL 自行,它 ’s VPL 中測試您的服務,而使它 VPL 友善如此其他人可以輕鬆地使用它是個不錯的作法。

您可以裝飾您的服務類別,以描述該服務的兩個屬性:

[DisplayName("Serial Port Service")]
[Description("SerialPort service provides access to a Serial (COM) Port")]

第一個屬性會顯示成 VPL 服務清單中服務的名稱 (請參閱 圖 5),然後在第二個屬性顯示成工具提示如果您滑鼠移過清單中服務的名稱。


圖 5VPL 服務清單

如果您有一個網站,而您想要您的線上服務的文件,您可以將另一個屬性附加服務類別來提供超連結:

[DssServiceDescription("http://www.promrds.com/SerialPort.htm")]

當 VPL 會看到這個屬性時,它在服務清單新增服務旁邊的小資訊圖示 (一個 「 i 」 藍色光碟上的白)。

如果您新增圖示至您服務就可以輕鬆地進行它們出現在 VPL 圖表和服務清單中。 請注意稱為一個縮圖中 服務名稱旁的小圖示圖 5. 圖 6 說明圖示會顯示出現在 VPL 圖表中的區塊內的較大的版本。


圖 6服務區

這些影像加入專案時請確定您會變更檔案內容,讓 [建置動作] 設定為 [內嵌資源。 PNG 是慣用的檔案格式,因為它支援 Alpha 色頻。 這可讓您建立具有透明背景的圖示,藉由設定背景色彩設成零 Alpha 值。

服務圖示影像應該是由 32 32,像素和縮圖 16 x 16。 影像的檔案名稱必須以該服務在這個案例 SerialPortService 的類別名稱開頭。 因此我對我的範例 SerialPortService.Image.png 和 SerialPortService.Thumbnail.png 的檔案名稱。

使用服務

此服務是很有彈性。 您可以指定序列連接埠組態,組態檔 (也就是最常見的方式) 中或藉由傳送 SetConfig 要求。 一旦您設定組態,您可以呼叫開啟作業。 為了方便起見,在組態檔中的旗標會造成服務上啟動自動開啟此連接埠。 如果已經開啟連接埠,Open 呼叫將會先關閉,然後重新開啟它。

您必須決定您想要使用服務的方式:同步或非同步。 當同步操作,每一個讀取或寫入要求將會等待,直到作業完成傳送回覆前先。 從 VPL 的角度來看這是一個簡單的方法,因為訊息流程,將會暫停在 SerialPort 區塊圖表中。 請注意非同步作業並不完全非同步 — 寫入作業仍會發生同步。 但每個新的位元組接收為通知傳送給訂閱者。

理論上,在服務上的每個狀態修改作業應該會導致傳送,讓 「 訂閱者 」 可以保留自己快取的版本的服務狀態通知。 這表示根據 DSSP 取代、 更新、 插入、 刪除和 Upsert 作業的所有作業應該都傳送對應的通知。 然而,開發人員通常快速播放,並且遺失與這個需求。

為了簡單起見,SerialPort 服務只會傳送通知使用 ReceiveByte 作業類型,在非同步模式中。 [開啟] 或 [另存新檔] 對話方塊,關閉,SetConfig 作業也會造成傳送的通知。

讀取和寫入作業不會修改狀態,因為它們會形成子類別關閉 DSSP 送出作業。 當然它們有一個副作用-這是接收,然後透過序列連結傳送資料。

測試 VPL

在本文中下載包含兩個範例 VPL 程式,EchoAsynch 並 EchoSynch,會告訴您如何使用該服務在非同步模式中 (透過通知) 和同步處理模式中。 VPL 範例會使用組態檔來設定初始的參數,包括連接埠號碼 (這樣會在組態檔中設定為 21,並必須變更以符合您的電腦 ’s COM 連接埠位址) 所 COM 連接埠。

請注意若要測試服務您將需要一個 Null 數據機纜線和兩台電腦與序列埠或是同一部電腦上的兩個連接埠。 USB 序列裝置是隨時可用,所以 ’s 相當可行的方法有多個單一個人電腦上的序列埠。 當您您的 COM 連接埠連接在一起執行終端機模擬器如 [超級終端機],然後連接到其中一個 COM 連接埠。 請先在其他序列連接埠上執行 EchoAsynch VPL 程式。 (您可以在 RDS] 下的 [開始] 功能表中找到 VPL)。 當您鍵入終端機模擬器視窗時, 您應該會看到回應的字元。

您可以使用 VPL 建立組態檔。 按 [SerialPort 服務區塊圖表中,然後檢視 [屬性] 面板中。 您應該會看到類似 圖 7. 請確定 [PortNumber 為您的個人電腦的設定正確。 (這必須是其他序列連接埠,您不在終端機模擬器中開啟)。 您注意到同位檢查及 StopBits 是下拉式清單。 這些清單中的項目直接來自 SerialPortTypes.cs 中定義的列舉。


圖 7序列連接埠的服務組態

這是一個地方 XML 文件註解有很方便的地方。 當您暫留透過組態參數,以滑鼠游標工具提示將快顯狀態的每個成員顯示對應的註解。

當您執行 EchoAsynch VPL 程式 中程式的第一個部分圖 8 非同步模式中開啟序列埠。


圖 8 在非同步模式開啟序列埠

如果您在組態如錯誤的傳輸速率比率輸入無效值將會失敗,[開啟] 或 [另存新檔] 對話方塊。 (它可能也會失敗如果 COM 連接埠正在使用中、 連接埠 doesn’t 存在,或 don’t 擁有適當權限)。 這就是為什麼程式會檢查的錯誤,並顯示它。

其餘的程式 (請參閱 圖 9) 只要回音收到每個字元。 它會採取字元從 ReceiveByte 通知,並傳送回使用 WriteByte 它們。

若要使輸出更易於閱讀一個換行字元會傳回字元 (ASCII 13,十進位) 已附加,游標會移到下一行,在您的 [終端機模擬器] 視窗中一個換行 (10)。 請注意所有 [SerialPortService 區塊以 圖 9 圖表參考相同的服務執行個體。


圖 9EchoAsynch 程式

EchoSynch VPL 程式 (請參閱 圖 10) 使用同步模式的作業 — 它 doesn’t 使用通知。 (在實際上會永遠不會傳送通知在同步模式下)。


圖 10 EchoSynch 程式

不同於前一個程式這一個使用 ReadString 和 WriteString 至回應資料。 這些作業執行類似 ReadByteArray 和 WriteByteArray 的功能,但是,字串更容易地在 VPL 中處理比位元組陣列。

字串作業使用換行 (或新行) 字元作為行尾標記。 因此 ReadString 完成當您按下換行 (Ctrl J) 不在您按下 Enter 時。 這可以會混淆您測試使用終端機模擬器,程式,因為您可能想知道執行任何動作的回應為何的第一次。 將 WriteString 加入換行並加入換行至輸出因此會出現在個別行中每個字串。

請注意在組態檔的 EchoSynch 的 500ms InterCharacterDelay。 這會導致速度非常緩慢傳送字串。 您可以試著變更此值。

Trevor Taylor 博士是針對在 Microsoft 的機器人開發 o 人 h 員 û 工 u 具 ã Studio 程式管理員。 他 ’s coauthor 與 Kyle Johns 的 專業機器人開發 o 人 h 員 û 工 u 具 ã Studio 」 (Wrox 2008)。 在通訊錄中的範例程式碼是可以從 promrds.com.

* *

多虧來檢閱本文的下列的技術專家: Kyle Johns