原文:
c# ---- 串列埠資料ysi例項
c#----串列埠資料接收傳送中,傳送接收資料已經可以模擬了。
本次ysi例項過程中 主要是:型別轉換問題 、計算校驗碼
一、不同裝置不同的規則,本次例項**如下:
string serialnumber = sn;//packet command payload
int i1 = 0x11;//
packet length byte
int i2 = 0xa5;//
packet sync byt
string strarr = new
string[32];//
命令字串
strarr[0] = convert.tostring(i1, 16);//
轉化固定字元
strarr[1] = convert.tostring(i2, 16);//
轉化固定字元
char arr = serialnumber.tochararray();//
字元陣列
int ii = new
int[16];//
整形陣列,為了計算校驗碼
ii[0] = i1;//
轉化固定字元
ii[1] = i2;//
轉化固定字元
for (int i = 0; i < arr.length; i++)
//計算校驗碼
int checksum = 0
;
for (int i = 0; i < ii.length; i++)
strarr[
16] = convert.tostring(checksum, 16);
上述,一是採用強制型別轉換 char 型別為 16進製制int,然後計算校驗碼;二是將char轉換為16進製制形式的string。
這樣最後就得出需要傳送的字串陣列。
二、傳送字串資料並且接收資料,**如下:
//計算傳輸字串
string sendstr =sendstr(sdstr);
//傳送位元組陣列
byte wbb = new
byte[64
];
//轉換成16進製制位元組
for (int i = 0; i < sendstr.length; i++)
//接收位元組陣列
byte rdb = new
byte[64
];
//開啟新的串列埠連線
sp.open();
//丟棄來自序列驅動程式的接受緩衝區的資料
sp.discardinbuffer();
//丟棄來自序列驅動程式的傳輸緩衝區的資料
sp.discardoutbuffer();
//使用緩衝區的資料將指定數量的位元組寫入串列埠
sp.write(wbb, 0
, wbb.length);
//當前執行緒掛起500毫秒
system.threading.thread.sleep(500
);
//讀取資料超時
sp.readtimeout = 1000
;
//讀取接收資料
sp.read(rdb, 0, rdb.length);
上述,一是需要轉換為位元組傳送,裝置要求16進製制位元組;二是傳送資料後,可以掛起執行緒500毫秒,避免資料衝突的問題。
這樣返回位元組陣列rdb。
三、接收後的位元組陣列,需要轉換解析,**如下:
//讀取記錄轉換為字串
string rdstr = new
string[100
];
for (int i = 0; i < rdb.length; i++)
上述,先轉換為16進製制字串。
四、最終需要收集的資料是浮點型資料
網上搜到乙個string 與浮點型別相互轉換的類,可以直接使用,**如下:
classstconvertfloat
else
num[
0] = '0'
;
//求指數
int exponent = 0
;
if (f >= 1)//
指數符號為正情況,即fabs(f)>=1
}else
//負指數情況
exponent = (128 - exponent) + 128;//
(128-exponent)為補碼,+128是指數符號位置1
} exponent += 127;//
指數轉換為階碼
inti;
for (i = 8; i >= 1; i--)//
將指數轉換為二進位制數
f = f - 1;//
小數轉換為標準格式
//求小數部分
double s = 1
;
for (i = 9; i < 32; i++)
else
num[i] = '0'
; }
if (style == 2)//
二進位制輸出
else
//二進位制轉換為十六進製制
string tt = new
string
(num);
tt = tt.substring(0, 8
);
return
tt; }
}public
static
double standardtofloat(string fnum, int
style)
else
//十六進製制轉換為二進位制
for (j = 3; j >= 0; j--)}}
double f = 1;//
f為最終浮點數結果,標準浮點格式隱含小數點前的1
double s = 1;//
s為小數各個位代表的權值
for (i = 9; i < 32; i++)//
轉換小數部分
}int exponent = 0;//
指數部分
int d = 1;//
d代表指數部分各位的權值
for (i = 8; i >= 1; i--)//
此時計算的是階碼
if (exponent >= 127
) exponent -= 127;//
將階碼轉換為指數
else
if (num[0] == '
1')//
浮點數符號位為1,說明為負數
f = f * (-1
); f = f * math.pow(2, exponent);//
將小數部分和浮點部分組合
return
f; }
}
綜上:串列埠資料傳送接收是比較簡單的,難點在於資料型別轉換。
需要怎麼轉換成位元組傳送出去,再如何接收位元組轉換成所需資料。
C 開發串列埠通訊例項及串列埠基礎
一 串列埠通訊簡介 序列介面 串列埠 是一種可以將接受來自cpu的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給cpu的器件。一般完成這種功能的電路,我們稱為序列介面電路。串列埠通訊 serial communications 的概念非常簡單,串列埠按位...
休眠 關閉串列埠輸出 C 開發串列埠通訊例項及串列埠基礎
序列介面 串列埠 是一種可以將接受來自cpu的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給cpu的器件。一般完成這種功能的電路,我們稱為序列介面電路。串列埠通訊 serial communications 的概念非常簡單,串列埠按位 bit 傳送和接收...
C 串列埠收發資料
串列埠命名空間 using system.io.ports 例項化串列埠物件 串列埠引數 串口號,波特率,資料位,停止位 奇偶校驗位 例項1 只通過串口號新建例項 返回值 串口號集合 serialport.getportnames 判斷串列埠是否開啟 如果串列埠沒有開啟就開啟串列埠 port.iso...