串列埠通訊類

2021-07-28 11:55:11 字數 4009 閱讀 2934

pc與外設通訊、與下位機經常用到串列埠通訊,為了高效方便封裝乙個好的串列埠操作類是必要的啦,以下是**。

using system;

using system.runtime.interopservices;

namespace comm

/// /// 串列埠超時時間結構體型別

///

[structlayout(layoutkind.sequential)]

private struct commtimeouts

/// /// 湓出緩衝區結構體型別

///

[structlayout(layoutkind.sequential)]

/// /// 開啟串列埠

///

/// 要開啟的串列埠名稱

/// 指定串列埠的訪問方式,一般設定為可讀可寫方式

/// 指定串列埠的共享模式,串列埠不能共享,所以設定為0

/// 設定串列埠的安全屬性,win9x下不支援,應設為null

/// 對於串列埠通訊,建立方式只能為open_existing

/// 對於串列埠通訊必須設定為null

[dllimport("kernel32.dll")]

private static extern int createfile(string lpfilename, uint dwdesiredaccess, int dwsharemode,

int lpsecurityattributes, int dwcreationdisposition, int dwflagsandattributes, int htemplatefile);

/// /// 得到串列埠狀態

///

/// 通訊裝置控制代碼

/// 裝置控制塊dcb

[dllimport("kernel32.dll")]

private static extern bool getcommstate(int hfile, ref dcb lpdcb);

/// /// 建立串列埠裝置控制塊

///

/// 裝置控制字串

/// 裝置控制塊

[dllimport("kernel32.dll")]

private static extern bool buildcommdcb(string lpdef, ref dcb lpdcb);

/// /// 設定串列埠狀態

///

/// 通訊裝置控制代碼

/// 裝置控制塊

[dllimport("kernel32.dll")]

private static extern bool setcommstate(int hfile, ref dcb lpdcb);

/// /// 讀取串列埠超時時間

///

/// 通訊裝置控制代碼

/// 超時時間

[dllimport("kernel32.dll")]

private static extern bool getcommtimeouts(int hfile, ref commtimeouts lpcommtimeouts);

/// /// 設定串列埠超時時間

///

/// 通訊裝置控制代碼

/// 超時時間

[dllimport("kernel32.dll")]

private static extern bool setcommtimeouts(int hfile, ref commtimeouts lpcommtimeouts);

/// /// 讀取串列埠資料

///

/// 通訊裝置控制代碼

/// 資料緩衝區

/// 多少位元組等待讀取

/// 讀取多少位元組

[dllimport("kernel32.dll")]

private static extern bool readfile(int hfile, byte lpbuffer,

/// /// 寫串列埠資料

///

/// 通訊裝置控制代碼

/// 資料緩衝區

/// 多少位元組等待寫入

/// 已經寫入多少位元組

[dllimport("kernel32.dll")]

private static extern bool writefile(int hfile, byte lpbuffer,

[dllimport("kernel32.dll", setlasterror = true)]

private static extern bool flushfilebuffers(int hfile);

[dllimport("kernel32.dll", setlasterror = true)]

private static extern bool purgecomm(int hfile, uint dwflags);

/// /// 關閉串列埠

///

/// 通訊裝置控制代碼

[dllimport("kernel32.dll")]

private static extern bool closehandle(int hobject);

/// /// 得到串列埠最後一次返回的錯誤

///

[dllimport("kernel32.dll")]

private static extern uint getlasterror();

/// /// 建立與串列埠的連線

///

public bool open()

// 設定通訊超時時間

getcommtimeouts(hcomm, ref ctocommport);

ctocommport.readtotaltimeoutconstant = readtimeout;

ctocommport.readtotaltimeoutmultiplier = 0;

ctocommport.writetotaltimeoutmultiplier = 0;

ctocommport.writetotaltimeoutconstant = 0;

setcommtimeouts(hcomm, ref ctocommport);

// 設定串列埠

getcommstate(hcomm, ref dcbcommport);

dcbcommport.foutxctsflow = 524800;

dcbcommport.baudrate = baudrate;

dcbcommport.flags = 0;

dcbcommport.flags |= 1;

if (parity > 0)

dcbcommport.parity = parity;

dcbcommport.bytesize = bytesize;

dcbcommport.stopbits = stopbits;

dcbcommport.foutxctsflow = 524800;

if (!setcommstate(hcomm, ref dcbcommport))

opened = true;

return true;

}/// /// 關閉串列埠,結束通訊

///

public bool close()

return false;

}/// /// 讀取串列埠返回的資料

///

/// 資料長度

public byte read(int numbytes)

else

}/// /// 清空com口緩衝區資料

///

///

public bool clearportdata()

return false;

}/// /// 向串列埠寫資料

///

/// 資料陣列

public int write(byte writebytes)

else}}

}

串列埠通訊 串列埠通訊原理

1 rs232介面 rs232 c介面聯結器一般使用型號為db 9的9芯插頭座,只需3條介面線,即 傳送資料 接收資料 和 訊號地 即可傳輸資料,其9個引腳的定義如圖11 3所示。圖11 3 rs232 c介面聯結器定義 在rs232的規範中,電壓值在 3v 15v 一般使用 6v 稱為 0 或 o...

串列埠通訊Serial Port類C 實現

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

串列埠同步通訊和串列埠非同步通訊

串列埠掃盲貼 現實中不存在絕對精確的時鐘,標稱值同樣是1mhz,發端和接收端的時鐘總會存在差異,如果接收端不進行時鐘同步,而是使用自己本地的時鐘,則足夠長的時間後接收到的資料總會出現不可預知的重複或丟失,導致接收錯誤。因此發端必須將與資料速率相關的時鐘訊號傳輸給接收端,時鐘訊號可以走單獨的訊號線,也...