C 串列埠資料YSI例項

2021-09-06 16:46:56 字數 3763 閱讀 3447

原文:

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 與浮點型別相互轉換的類,可以直接使用,**如下:

class

stconvertfloat

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...