所謂串列埠,也叫序列介面,即com口,採用序列通訊方式(即資料一位一位的傳送)的介面。也就是電腦後面d形9針插口。
最近做了兩個都和串列埠程式設計有關的功能,乙個是不間斷電源,乙個是rs232型串列埠印表機。因為是串列埠所以主要的用法都不難,難點是對裝置的相應命令的理解和使用上。因為不同型別的、不同廠家的裝置命令是不同的,因為也沒法總乙個總結。那就對於串列埠的簡單用法做一些總結吧。
主要用到的類是serialport,在system.io.ports下。傳裝置的基本使用步驟如下:
1、設定串列埠的引數。因為不同的裝置對串列埠的引數要求是不同的,最常見就是波特率,一般好像都是9600。
2、開啟串列埠。也就是serialport的open()方法。
3、想串列埠寫命令或寫文字內容。一般情況下,如果是數字型別的命令都是十六進製制的,當然也有十進位制的,不過如果有十六進製制和十進位制兩種,我覺得最好用十六進製制的,因為十六進製製好轉換為byte陣列。
向串列埠寫命令的方法是serialport的write(byte buffer, int offset, int count)。比如乙個命令,十六進製制下:00 ff,十進位制下:00 255;那麼這段命令最終轉為byte時,00和ff分別轉換,但是對於00和255顯然就不怎麼方便了。看一下後面的乙個例子就明白了。
4,接收返回值。向串列埠傳送命令,有的是指示執行操作的,有的是查詢狀態的,因此需要讀取返回值。
下面對於某乙個串列埠裝置的控制,寫乙個簡單的例子。
1、字元操作類,因為串列埠寫入的須要是byte陣列型,讀出又要將byte陣列轉為string,一般命令也是十六進製制的。所以轉換的方法需要用到。
[csharp]view plain
copy
print?
///
/// 串列埠字元類
///
public
class
charoperated
return
result.tostring().toupper();
} ///
/// 十六進製制的字串轉成byte陣列
///
///
public
static
byte
hexstringtobytearray(
string
content)
return
buffer;
} ///
/// 16進製制編碼的字串解析成 ascii碼
///
///
///
public
static
string
decodehextoasc(
string
statuscode)
return
rtn;
} ///
/// ascii碼轉字元
///
///
///
public
static
string
chr(
intasciicode)
; string
strcharacter = asciiencoding.getstring(bytearray);
return
(strcharacter);
} return
string
.empty;
} }
2、對串列埠的開啟,傳送命令,關閉等的類。
[csharp]view plain
copy
print?
public
class
commanager
} ///
/// 串列埠引數設定
///
private
void
setserialport()
///
/// 開啟串列埠裝置
///
private
void
serialportopen()
currentportname = "com1"
;//此處可指定串列埠,也可以實時讀取裝置到底連線在那個串列埠,實際情況根據裝置情況而定。
//currentportname = dogetupsportname();以某一裝置為例遍歷所有串列埠,找到連線該裝置的串列埠
setserialport(); if(
string
.isnullorempty(currentportname))
comm.portname = currentportname;
comm.open();
} catch
} ///
/// 向串列埠傳送命令
///
///
public
void
senddatastring(
string
sendstring)
} } ///
/// 向串列埠寫字串
///
///
public
void
writelingcontent(
string
content)
} } ///
/// 讀取埠返回值
///
///
private
string
doreadportresult()
} catch
return
resultstring;
} ///
/// 獲取某一裝置的埠號
///
///
private
string
dogetupsportname()
commname = portitem;
byte
data = charoperated.hexstringtobytearray(
"傳送的命令"
);
comm.close();
setserialport();
comm.portname = portitem;
comm.open();
//傳送報文到串列埠裝置
if(comm.isopen)
thread.sleep(500);
//if (條件)
////else
//}
catch
finally
} } }
catch
finally
} return
commname;
} }
使用 [csharp]view plain
copy
print?
class
program
private
static
string
serialportcomdatareceived()
intbytes = serialportcom.bytestoread;
byte
buffer =
newbyte
[bytes];
serialportcom.read(buffer, 0, bytes);
receiveresult = string
.empty;
receiveresult = charoperated.bytearraytohexstring(buffer);
receiveresult = receiveresult.trim();
return
receiveresult;
} }
關於串列埠程式設計的讀書筆記
5.dcb結構 typedef struct dcb dcb 6.改變埠設定 使用如下的兩個方法 bool getcommstate hcomm,dcb bool setcommstate hcomm,dcb 7.改變普通設定 buildcommdcb szsettings,dcb szsettin...
Linux 下的串列埠程式設計(一)
linux下串列埠程式設計要知道的那些事 jibo.tiger gmail.com 本篇文章主要講了與串列埠程式設計相關的幾個知識點,以及在linux 上編寫串列埠程式所要遵循的思想和要考慮的方面,以及它和我們之前在uc os 作業系統上編寫串列埠程式有什麼區別。一 串列埠相關的幾個基本概念 可以結...
Linux 下的串列埠程式設計(一)
linux下串列埠程式設計要知道的那些事 jibo.tiger gmail.com 本篇文章主要講了與串列埠程式設計相關的幾個知識點,以及在linux 上編寫串列埠程式所要遵循的思想和要考慮的方面,以及它和我們之前在uc os 作業系統上編寫串列埠程式有什麼區別。一 串列埠相關的幾個基本概念 可以結...