c 串列埠通訊log儲存及實時波形繪製

2021-09-02 11:45:45 字數 3632 閱讀 4827

log儲存部分

波形繪製部分

做專案的時候需要檢測傳送給步進馬達的脈衝數和編碼器實際接收到的脈衝數的差值,以用於判斷步進馬達是否失步。為了能方便呼叫log以及實時監控脈衝計數的變化,因此寫了這個軟體。測試下來還是很實用的。下位機的資料傳送是不定位數整數,每傳送乙個會有乙個換行,體現在c#裡就是\r\n

廢話不多說,直接講部分重點

自動查詢串列埠

//查詢主機上存在的串列埠

combobox_port.items.

addrange

(serialport.

getportnames()

);if(combobox_port.items.count >0)

else

新增資料監聽
//向comdevice.datareceived(是乙個事件)註冊乙個方法com_datareceived,當埠類接收到資訊時時會自動呼叫com_datareceived方法

comdevice.datareceived +

= new serialdatareceivedeventhandler

(com_datareceived)

;

資料接收
private void

com_datareceived

(object sender, serialdatareceivedeventargs e)

資料解碼
public void

adddata

(byte[

] data)"+

" ", data[i]);

}addcontent

(sb.

tostring()

.toupper()

);}else

if(radiobutton_ascii.checked)

else

if(radiobutton_utf8.checked)

else

if(radiobutton_unicode.checked)

else"+

" ", data[i]);

}addcontent

(sb.

tostring()

.toupper()

);}}

資料顯示
private void

addcontent

(string content)))

;}

資料傳送
/// 

/// 將訊息編碼並傳送

///

///

///

private void

button_send_click_1

(object sender, eventargs e)

byte[

] senddata = null;

if(radiobutton_hex.checked)

else

if(radiobutton_ascii.checked)

else

if(radiobutton_utf8.checked)

else

if(radiobutton_unicode.checked)

else

senddata

(senddata);}

///

/// 此函式將編碼後的訊息傳遞給串列埠

///

///

///

public bool senddata

(byte[

] data)

catch (exception ex)

}else

return false;

}

log的儲存比較簡單,注意一下每次向檔案中寫完資料後,記得關閉資料流。

private void

addcontent

(string content)

else

filesystemwatcher_changed()

;}))

;}

由於資料的長度不定,之前考慮寫正規表示式來將資料解析出來,但是發現太難寫了,就放棄了。。。

所以採用的方法是先將資料儲存到log檔案中,然後每次訪問log檔案取出最後一行的資料,新增到繪圖佇列中。

圖表的初始化

this.chart1.series.

clear()

; series series1 = new series

(combobox_port.text)

; series1.chartarea =

"c1"

; this.chart1.series.

add(series1)

;

從log中抓取最新資料

這個函式在每次log儲存完後進行呼叫,每次從log中選擇最新的資料,這裡的arraystr.length - 2是因為最後一行是空行,所以倒數第二行才是最新的資料。

string wetlog =

; private void

filesystemwatcher_changed()

資料佇列的更新

首先建立乙個大小為100的double型別的佇列

private queue<

double

> dataqueue = new queue<

double

>

(100);

private int num =

5;

資料更新,這裡有乙個bug暫時沒解決,即我每次在log儲存後進行資料抓取和更新佇列,但是發現有的資料偶爾會重複一次寫入到佇列中,經過多次debug沒解決掉。因此便將佇列中相鄰重複資料進行跳過乙個進行繪製。

private void

updatequeuevalue

(double p)

} dataqueue.

enqueue

(p);

this.chart1.series[0]

.points.

clear()

;for

(int i =

0; i < dataqueue.count-

1; i++

) this.chart1.series[0]

.points.

addxy

((i+1)

, dataqueue.

elementat

(i));}

}

以上是所有主要**,雖然還有一點不足,但是工具還是很實用的。希望以後多積累,能寫出更好工具軟體。

非常歡迎大神提出寶貴的改進建議

C 開發串列埠通訊例項及串列埠基礎

一 串列埠通訊簡介 序列介面 串列埠 是一種可以將接受來自cpu的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給cpu的器件。一般完成這種功能的電路,我們稱為序列介面電路。串列埠通訊 serial communications 的概念非常簡單,串列埠按位...

C 串列埠通訊

串列埠通訊類 serialportdao.csusing system using system.collections.generic using system.text using system.io.ports namespace ly.fuelstationpos.protocol set ...

C 串列埠通訊

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