freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

多個串口設備數(shù)據(jù)的連續(xù)采集(編輯修改稿)

2025-06-22 06:17 本頁面
 

【文章內(nèi)容簡介】 w byte[2]。 for (int i = offset。 i offset + count。 i++) { CrcReg ^= b[i]。 // 將當前字節(jié)與 CRC寄存器的低 8位進行按位異或 for (int n = 1。 n = 8。 n++) //進行 8次邏輯移位 { LSB = CrcReg amp。 1u。 //―u‖表示該常量是無符號整型 CrcReg = 1。 //CRC寄存器邏輯右移 1位 if (LSB == 1) CrcReg ^= CrcPoly。 } } 22 工控程序設計 tmp[0] = (byte)(CrcReg amp。 0xFF)。 //低 8位在前 tmp[1] = (byte)((CrcReg amp。 0xFF00) 8)。 //高 8位在后 return tmp。 } } 下面的測試程序調(diào)用 CRC16方法,計算出長度為兩個字節(jié)的循環(huán)冗余校驗碼,并附加在字節(jié)數(shù)組末尾: byte[] b ={0x41,0x42,0x43,0,0}。 //保留兩個字節(jié)位置存儲校驗碼 byte[] crc = CCheck. CRC16 (b, 0, – 2 ,0x8005)。 //計算循 環(huán)冗余校驗碼 b[] = sum[0]。 //附加在字節(jié)數(shù)組末尾 b[] = sum[1]。 23 工控程序設計 2 上位機主動模式串口通信類的設計 煤礦鉆機性能測試系統(tǒng)中用到的 HC100智能測控儀、 JW2A扭矩儀和 LU902M位式調(diào)節(jié)儀與 HSDZC電能綜合測試儀不同,這些設備需要上位機主動發(fā)送命令,才給予回復,因此可以把這三種設備的通信模式歸為 “ 上位機主動模式 ” 。 下面將設計上位機主動模式的串口通信類 CActiveCOMHelper,和CPassiveCOMHelper類不同的是, CActiveCOMHelper類中增加了一個名為mand的成員,存放當前應該執(zhí)行的命令,線程函數(shù)根據(jù)該成員的相關屬性,就知道現(xiàn)在應該給下位機發(fā)送什么命令。由于采用 “ 提問 ——回答 ” 的方式,能夠準確控制下位機發(fā)送來的數(shù)據(jù),故不再需要隊列來暫存接收的數(shù)據(jù)。 CCommand類實現(xiàn)代碼如下: public class CCommand { public string mandName。//命令名字 public byte[] cmdContent。//命令的內(nèi)容 public Parity parity = 。//發(fā)送命令時采用的校驗方式 public byte[] replyContent。//回復內(nèi)容 24 工控程序設計 public int replyLength。//回復內(nèi)容的規(guī)定長度 public bool isCompleted。 //命令是否完成 public CCommand() //創(chuàng)建對象時 mandName不能為 null,以免后面比較時出錯 { = 。 } } mand成員( CCommand的實例)是 UI模塊和 CActiveCOMHelper對象的連接紐帶。 UI模塊首先查詢前一個命令是否完成( isCompleted是否為 true),若已經(jīng)完成,就設置下一條命令的名字、內(nèi)容、校驗方式、回復內(nèi)容的規(guī)定長度,交給 CActiveCOMHelper對象去執(zhí)行; CActiveCOMHelper對象執(zhí)行完命令后,把回復內(nèi)容填好,并將完成標志 isCompleted設置為 true。如此循環(huán),就可以不斷讓 CActiveCOMHelper對象執(zhí)行命令。這樣分工的好處是,處于上層的 UI模塊沒有必要知道如何和串口通信、如何創(chuàng)建線程等等復雜瑣碎的具體操作,而只要知道該發(fā)什么命令,以及如何處理收到的結(jié)果。 25 工控程序設計 CActiveCOMHelper類實現(xiàn)代碼如下: public class CActiveCOMHelper { public int readTimeOut。//接收數(shù)據(jù)超時毫秒數(shù) public string portName。//設備所占用的串口名 private bool stopFlag。//線程循環(huán)停止標志 private int baudRate, dataBits。 private StopBits stopBits。 private CCommand mand。 public delegate void DataReceivedHandler(CActiveCOMHelper sender)。 public event DataReceivedHandler DataReceived。 public CActiveCOMHelper(string portName, int baudRate, int dataBits, StopBits stopBits) 26 工控程序設計 { = portName。 = baudRate。 = dataBits。 = stopBits。 = 3000。//默認 3000毫秒讀取超時 = new CCommand()。 //始終保持有一個命令 = true。 //該命令開始時處于完成狀態(tài) } public void start() { Thread t = new Thread(new ThreadStart(threadFun))。 = true。 stopFlag = false。 ()。 } 27 工控程序設計 public void stop() { stopFlag = true。 } public CCommand getCommand() //獲取一個克隆的命令對象 { CCommand cmd = new CCommand()。 (this)。 //線程同步:在進行 get操作時,不準進行 set操作 = 。 = 。 = 。 = 。 = 。 = 。 (this)。 return cmd。 } 28 工控程序設計 public void setCommand(CCommand cmd) { (this)。 //線程同步:在進行 set操作時,不準進行 get操作 = cmd。 (this)。 } protected virtual bool checkReply(string cmdType, byte[] bRecv) { return false。 } private void threadFun() { SerialPort sp = new SerialPort(portName, baudRate, , dataBits, stopBits)。 try { if () ()。 ()。 } 29 工控程序設計 catch { return。 } byte first。 byte[] bRecv, bSend。 while (!stopFlag) { CCommand cmd = getCommand()。 if ( == false) try { = readTimeOut。 ()。 //清除接收緩沖區(qū) bSend = 。//要發(fā)送的內(nèi)容 = 。//校驗位 (bSend, 0, )。 first = (byte)()。 //阻塞方式讀取數(shù)據(jù) 30 工控程序設計 bRecv = new byte[]。//存儲回復數(shù)據(jù)(字節(jié)數(shù)已經(jīng)規(guī)定) bRecv[0] = first。 int n = 0。//檢查的次數(shù) while (n = 3 amp。amp。 1) { n++。 (20)。 //等待 20毫秒后再檢查數(shù)據(jù)是否達到規(guī)定長度 } if (n 3) continue。 //等待 3次后數(shù)據(jù)還未到達 (bRecv, 1, 1)。 if (checkReply(, bRecv)) { = bRecv。//填寫回復內(nèi)容 = true。//修改命令完成標志 setCommand(cmd)。 if (DataReceived != null) //引發(fā)事件,通知使用該類的程序 DataReceived(this)。 } } 31 工控程序設計 catch { } else (20)。//沒有新命令下達,延時防止 CPU占用率過高 } if (sp != null amp。amp。 ) ()。 } } 在前一個步驟中已經(jīng)實現(xiàn)了串口數(shù)據(jù)接收、解析和顯示的功能,并且在工作者線程中接
點擊復制文檔內(nèi)容
法律信息相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1