2010年10月1日 星期五

Window 7 - 列印發票軟體 / Visual C# 2010 express 序列埠 (RS232) - 2

    因為一直等不到 Serial Port 的印表機 ,於是想先用我的 PDA 模擬成 RS232 終端機先行測試,首先先把 PDA 的 Com Port 設成 9600,N,8,1,也把程式中的COM Port 設成一樣,為了能快速設定 SerialPort,在 using 後加一行:

using System.IO.Ports;

這樣 Visual C# 2010 的編輯器會幫你帶出很多預先設定好的質,設定 SerialPort 的程式如下:

          
serialPort1.PortName = "COM6";
serialPort1.BaudRate = 9600;
serialPort1.Parity = Parity.None;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;

設定好 SerialPort 後, 再加一個按鈕輸出 "Hello World" 到 PDA 上,在 button.click 中加入

serialPort1.WriteLine("Hello world");

果然在 PDA 上收到了 "Hello world" 。

    處理 SerialPort 比較頭大的部分,都在於讀資料的部分,因為在執行前面作業的時候,背後可能已經有資料傳輸了,系統要一直準備接收資料,還好 Visual C# 2010 處理了大部分,不過先試一個最直接但會產生錯誤的方法,在 Form 上加一個 TextBox 物件準備接收 SerialPort傳來的資料,然後在 SerialPort 的 Datareceived 中加上 一行

textBox1.Text = serialPort1.ReadExisting;

Visual C# 很厲害馬上告訴你:


Error :Cannot convert method group 'ReadExisting' to non-delegate type 'string'. Did you intend to invoke the method?

   在 Window 7 Multithread 的環境下,是無法直接這樣輕易的把資料互傳,在 Form Class 中加上


string RxString;

並增加一個



 private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }



接著改寫 Datareceived :
private void serialPort1_DataReceived
(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)  
{
RxString = serialPort1.ReadExisting();  
this.Invoke(new EventHandler(DisplayText));
}

    PDA 上輸的字元終於可以顯示出來了, 想要了解 Invoke、Eventhandler及 Multithread 可以上網好好 Google 一下。