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,發端和接收端的時鐘總會存在差異,如果接收端不進行時鐘同步,而是使用自己本地的時鐘,則足夠長的時間後接收到的資料總會出現不可預知的重複或丟失,導致接收錯誤。因此發端必須將與資料速率相關的時鐘訊號傳輸給接收端,時鐘訊號可以走單獨的訊號線,也...