日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# + .net下使用serialPort做串口开发 1

發布時間:2023/12/15 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# + .net下使用serialPort做串口开发 1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???? 在.net下使用serialPort做串口通信開發,在環境狀態比較好的情況下還是比較容易的。我們可是使用serialPort.write(),將組織好的byte數組寫入到串口中。也可以通過serialPort的DataReceived 事件來觸發讀取。

??? 但是,如果通信情況不好,或者比特率較低的情況下,在接受的時候會出現很多情況,當觸發一次Datareceived的事件,可能是收到了全部數據幀,也可能只收到了半個幀,第二次觸發的時候,也許就是完整的一個幀了,這樣就給寫程序帶來的N多問題。無法通過DataReceived事件來觸發讀取了。

?? 最后,沒辦法,想出一個變通的手法,因為我們可以知道serialPort中當前輸入緩沖區的內容的大小,BytesToRead,我們可以在一段時間間隔內,獲取這個值,如果它不改變了,說明后面沒有數據了,也就是下位機發送完成。這個時間是和serialPort的波特率有關的。

? 波特率的單位是 bps 就是 bit 每秒,所以換成字節的話,得除以8,在考慮上完成字節的頭尾等,完成的一個字節是11bit,所以,我們就可以換算出 (波特率/11) 得到一秒可以發送的字節數,然后我們在拿 1000ms除以這個值,就可以得到 一個字節需要多少毫秒來發送: 1000/(波特率/11) 。

? 理論上,我們等待這個時間,就可以獲取到下一個字節了,但是考慮到實際情況,可能需要適當的延長時間,所以,我們可是適當的增加等待時間。

? 我們可以使用timer來實現;

?

timer1.Interval = (1000 / (serialPort1.BaudRate / 11)) + 20;

?

int timer2Bytes = -1;
private void timer2_Tick(object sender, EventArgs e)
{
int newBytes = serialPort1.BytesToRead;
if (timer2Bytes == newBytes && newBytes != 0)
{
byte[] data = new byte[newBytes];
serialPort1.Read(data,
0, data.Length);
if (data != null)
{
textBoxResult.Text
+= BitConverter.ToString(data) + "\r\n";
Application.DoEvents();
}
timer2Bytes
= -1;

}
else
{
timer2Bytes
= newBytes;
}
}

OK,這樣就基本完成了,但是依然還是有可能出現接受的幀不完整的情況,這個時候可以嘗試在發送一次命令讀取一次。這個好處是可以讀取到通信時間,只需要在里面添加一個計時器,比如在 else下 添加 time += timer2.Interval ;? 但是這個時間很不準確,不知道為什么。

最后一個比較好的方法就是:通過bytesToRead的長度來確定是否接受完成,并指定超時時限,這樣的好處是,能保證接受到的就是長度符合的,否則就繼續等,知道超時,可是,問題是必須事先知道,我讀取的長度將會是多少,這對程序的擴展性等,都引來很多問題。糾結中。

繼續研究如何比較好的實現,并精確的記錄下通信時間;

轉載于:https://www.cnblogs.com/lingfengchencn/archive/2010/07/01/serialPort.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的C# + .net下使用serialPort做串口开发 1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。