教學觀摩 - 程式設計 C# Serial Port 南榮科技大學資訊科技系林俊言
串列埠 RS-232-C 稱標準串列埠, 是目前最常用的一種串行通訊介面 全名是 資料終端裝置 (DTE) 和資料通訊裝置 (DCE) 之間串行二進位資料交換介面技術標準 數據 : TXD(pin 3): 序列埠資料輸出 RXD(pin 2): 序列埠資料登錄 交握 : RTS(pin 7): 發送資料請求 CTS(pin 8): 清除發送 DSR(pin 6): 資料發送就緒 DCD(pin 1): 資料載波檢測 DTR(pin 4): 資料終端就緒 2 圖片來源 : https://www.google.com.tw/imgres?imgurl 地線 : GND(pin 5): 地線
串列埠 發送 接收 DTE 純發送模型 DCE DTE 純接收模型 DCE 先發送 後發送 3 DTE 後接收 發送回應模型 DCE DTE 先接收 接收回應模型 DCE
串列埠屬性 SerialPort.PortName PortName 這個屬性值代表的是所要使用的序列埠名稱, 型別則是 String SerialPort.BaudRate BaudRate 屬性代表的是傳輸速率, 就是一秒傳幾個鮑 (Baud), 這個值的型別是 Int32 SerialPort.Parity 成員 說明 None Odd Even 不發生同位檢查 設定同位檢查位元, 以便位元集計數為奇數 設定同位檢查位元, 以便位元集計數為偶數 Mark 將同位檢查位元集保持為 1 Space 將同位檢查位元集保持為 0 4
串列埠屬性 SerialPort.DataBits DataBits 就是資料的長度, 雖然它是個 Int32 型別, 但是值會被限制在 5~8 之間 最常見的資料位元長度是 8 bits SerialPort.StopBits 是資料停止位元, 代表這組資料單元到此為止, 屬性值的型別是 StopBits 成員 None One Two OnePointFive 說明未使用停止位元 StopBits 屬性不支援這個值 使用一個停止位元 使用兩個停止位元 使用 1.5 個停止位元 5
串列埠 首先要用 SerialPort 這個物件就必須要 using System.IO.Ports; 之後會用到多線程的動作, 要用 using System.Threading SerialPort 建構函式 (): StringComparer stringcomparer = StringComparer.OrdinalIgnoreCase; Thread readthread = new Thread(Read); // Create a new SerialPort object with default settings. _serialport = new SerialPort(); // Allow the user to set the appropriate properties. _serialport.portname = SetPortName(_serialPort.PortName); _serialport.baudrate = SetPortBaudRate(_serialPort.BaudRate); _serialport.parity = SetPortParity(_serialPort.Parity); _serialport.databits = SetPortDataBits(_serialPort.DataBits); _serialport.stopbits = SetPortStopBits(_serialPort.StopBits); 6 _serialport.handshake = SetPortHandshake(_serialPort.Handshake);
串列埠傳收 開始 宣告 SerialPort 類別變數 產生 SerialPort 類別執行個體並賦予屬性 (1) SerialPort.Open 方法 (2) SerialPort.IsOpen 屬性 (3) SerialPort.Write /Read 方法 (4) SerialPort.Close 方法 開啟串列埠 結束 關閉串列埠 發送資料 / 接收資料 7
串列埠 要用 SerialPort 自動讀取 使用 DataReceived 事件, 當有新的訊息傳入時, 執行自訂 serialport_datareceived 函數將收到的訊息讀取與顯示, 3 2 1 public Form1() { InitializeComponent(); serialport1.datareceived += new SerialDataReceivedEventHandler(serialPort1_DataRece ived); } void serialport1_datareceived(object sender, SerialDataReceivedEventArgs e) { String data = serialport1.readline(); Console.Write("datareceived: " + data); } 8
Null-Modem Virtual Serial Port Driver 這個可以做虛擬的 Com Port 在軟體上可以模擬 crack, 缺點不是免費的可以試用 14 天 9 Download:https://sourceforge.net/projects/com0com/
程式 UI 元件 : button TextBox ComboBox 3 2 5 10
實例展示 COM3 端 COM4 端 BaudRate : 9600 Parity : Even Databits : 8 Stopbits : 1 11 執行 Vitrual SerialPort Driver 新增 pair COMports: COM3,COM4 BaudRate : 9600 Parity : Even Databits : 8 Stopbits : 1
Arduino 12
Arduino Output Transducers Ex: motors,buzzers, LED. Input Transducers Ex: ultra sonic, DTH11, sensors 13
Arduino Compiling : turns your program into binary data Uploading :sends the bits through USB cable to the Arduino The two LEDs near the USB connector blink when data is transmitted RX : 當 Arduino 接收資料時閃爍 TX : 當 Arduino 傳送資料時閃爍 14
Arduino Arduino 使用序列式常用函式 : Serial.begin() - e.g., Serial.begin(9600) Serial.print() or Serial.println() - e.g., Serial.print(value) Serial.read() Serial.available() Serial.write() Serial.parseInt() Arduino Program: int incomingbyte = 0; // 用來儲存收進來的 data byte const int ledpin = 13; void setup() { } // 開啟 Serial port, 通訊速率為 9600 bps Serial.begin(9600); pinmode(ledpin, OUTPUT); void loop() { // 檢查是否有資料可供讀取 if (Serial.available() > 0) { // 讀取一個 byte incomingbyte = Serial.read(); 15 決定打開或關掉 LED if (incomingbyte == '1') digitalwrite(ledpin, HIGH); else digitalwrite(ledpin, LOW); // 打開 LED // 關掉 LED
實例展示 COM9 端 Pin13:LED output Pin8: Buzzer output 16
E-mail: uflin56@mail.nju.edu.tw Cell phone: 0933511578