C 串列埠serialPort操作

2021-08-25 10:35:06 字數 3714 閱讀 9310

現在大多數硬體裝置均採用串**術與計算機相連,因此串列埠的應用程式開發越來越普遍。例如,在計算機沒有安裝網絡卡的情況下,將本機上的一些資訊資料 傳輸到另一台計算機上,那麼利用串列埠通訊就可以實現。執行本程式,在「傳送資料」文字框中輸入要傳送的資料,單擊【傳送】按鈕,將傳送的資料傳送到所選擇 的埠號中;單擊【接收】按鈕,傳遞的資料被接收到「接收資料」文字框中。如圖13.1所示。

技術要點

在.net framework 2.0中提供了serialport類,該類主要實現串列埠資料通訊等。下面主要介紹該類的主要屬性(表13.1)和方法(表13.2)。

表13.1 serialport類的常用屬性

名稱說明

basestream

獲取 serialport 物件的基礎 stream 物件

baudrate

獲取或設定序列波特率

breakstate

獲取或設定中斷訊號狀態

bytestoread

獲取接收緩衝區中資料的位元組數

bytestowrite

獲取傳送緩衝區中資料的位元組數

cdholding

獲取埠的載波檢測行的狀態

ctsholding

獲取「可以傳送」行的狀態

databits

獲取或設定每個位元組的標準資料位長度

discardnull

獲取或設定乙個值,該值指示 null 位元組在埠和接收緩衝區之間傳輸時是否被忽略

dsrholding

獲取資料設定就緒 (dsr) 訊號的狀態

dtrenable

獲取或設定乙個值,該值在序列通訊過程中啟用資料終端就緒 (dtr) 訊號

encoding

獲取或設定傳輸前後文字轉換的位元組編碼

handshake

獲取或設定串列埠資料傳輸的握手協議

isopen

獲取乙個值,該值指示 serialport 物件的開啟或關閉狀態

newline

獲取或設定用於解釋 readline( )和writeline( )方法呼叫結束的值

parity

獲取或設定奇偶校驗檢查協議 續表

名稱說明

parityreplace

獲取或設定乙個位元組,該位元組在發生奇偶校驗錯誤時替換資料流中的無效位元組

portname

獲取或設定通訊埠,包括但不限於所有可用的 com 埠

readbuffersize

獲取或設定 serialport 輸入緩衝區的大小

readtimeout

獲取或設定讀取操作未完成時發生超時之前的毫秒數

receivedbytesthreshold

獲取或設定 datareceived 事件發生前內部輸入緩衝區中的位元組數

rtsenable

獲取或設定乙個值,該值指示在序列通訊中是否啟用請求傳送 (rts) 訊號

stopbits

獲取或設定每個位元組的標準停止位數

writebuffersize

獲取或設定串列埠輸出緩衝區的大小

writetimeout

獲取或設定寫入操作未完成時發生超時之前的毫秒數

表13.2 serialport類的常用方法

方 法 名 稱

說明close

關閉埠連線,將 isopen 屬性設定為false,並釋放內部 stream 物件

open

開啟乙個新的串列埠連線

read

從 serialport 輸入緩衝區中讀取

readbyte

從 serialport 輸入緩衝區中同步讀取乙個位元組

readchar

從 serialport 輸入緩衝區中同步讀取乙個字元

readline

一直讀取到輸入緩衝區中的 newline 值

readto

一直讀取到輸入緩衝區中指定 value 的字串

write

已過載。將資料寫入串列埠輸出緩衝區

writeline

將指定的字串和 newline 值寫入輸出緩衝區

注意:用跳線使串列埠的第2、3針連線,可以在本地計算機上實現串列埠通訊,所以,通過串列埠的第2、3針的連線可以對程式進行檢測。串列埠截面圖如圖13.2所示。

圖13.2 串列埠截面圖

實現過程

(1)新建乙個專案,命名為ex13_01,預設窗體為form1。

(2)在form1窗體中,主要新增兩個button控制項,分別用於執行傳送資料和接受資料,新增兩個textbox控制項,用於輸入傳送資料和顯示接收資料。

(3)主要程式**。

private void button1_click(object sender, eventargs e)

private void button2_click(object sender, eventargs e)

舉一反三

根據本例項,讀者可以實現以下功能。

遠端監控對方計算機螢幕。

下位機控制程式。

例項419通過串列埠關閉對方計算機

例項說明

在網路應用程式中,主要通過網絡卡實現資料的傳輸,因此可以利用套接字技術實現遠端關閉計算機。如果計算機中沒有安裝網絡卡,該如何實現遠端關閉計算機呢?本例實現了利用串列埠關閉對方計算機,程式執行結果如圖13.3所示。

技術要點

本例項使用serialport類的屬性和方法,請參見例項「通過串列埠傳送資料」。下面主要介紹serialport類的datareceived 事件,datareceived 事件為本例項的主要使用技術。datareceived事件表示將處理 serialport 物件的資料接收事件的方法。序列接收事件可以由 serialdata 列舉中的任何項引起,是否引發此事件由作業系統決定,所以不一定會報告所有奇偶校驗錯誤。

注意:本例項從開發到測試,都是由本地計算機完成的,使用者只需要使用跳線將串列埠的第2、3針連線,可以在本地計算機上實現串列埠通訊。跳線連線請參見圖13.2。

實現過程

(1)新建乙個專案,命名為ex13_02,預設窗體為form1。

(2)在form1窗體中,主要新增兩個button控制項,分別用於開啟通訊串列埠和關閉對方計算機。

(3)主要程式**。

private void button1_click(object sender, eventargs e)

//資料接收事件,等待接收關機命令

private void serialport1_datareceived(object sender, serialdatareceivedeventargs e)

} //傳送關機命令

private void button2_click(object sender, eventargs e)

else

}

在我的測試軟體中發現乙個問題,就是當傳送資料小於或等於8位時,一切正常,如果大於8為位元組,則在datareceived事件中接收到的資料會分成兩段,第一段為8位,第二段為剩下的位元組,很奇怪,在msdn中講到不能保證每次傳送的資料都能正確接收到,需要參照bytestoread屬性來確定要讀取的資料量,所以我想出來的解決辦法為:

int datalength=serialport.bytestoread;

int i=0;

stringbuilder sb=new stringbuilder();

while(i這種奇怪的方法可以解決問題,後來想想應該是串列埠的工作方式決定的也有可能,期待其他的解決方式。

SerialPort 串列埠通訊

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...

serialPort 串列埠通訊

namespace 串列埠通訊 01 啟動 02 前進 03 後退 22 保持前進 33 保持後退 private void button1 click object sender,eventargs e else private void button2 click object sender,e...

串列埠通訊Serial Port類C 實現

串列埠介紹 串列埠叫做序列介面,也稱序列通訊介面,按電氣標準及協議來分包括rs 232 rs 422 rs485 usb等。rs 232 c rs 422與rs 485標準只對介面的電氣特性做出規定,不涉及接外掛程式 電纜或協議。usb是近幾年發展起來的新型介面標準,主要應用於高速資料傳輸領域。rs...