做了一個串口讀寫溫度的程序
目的
因為公司需要一個熱電偶來測試機器內部的實際溫度,之前是靠人手工記錄,但是因為人的因素,記錄間隔時間太長,導致記錄的數據意義不大,而且人長時間值守確實很無聊,現在需要用程序將人工取代以提高效率和精度,所以采購了溫濕度差傳感器和usb接口(usb轉R485),打算做一個自動采集程序來代替人員工作;
硬件連接
硬件連接很簡單,按照傳感器的線序和usb接口對應上就行了,然后把usb接口通過轉接線接到電腦usb口上。按照商家提供的驅動安裝說明安裝usb接口驅動,就會在設備管理器里看到一個串口,至此,硬件部分准備完畢。
軟件調試
這個傳感器的協議是MODBUS,需要讀寫16進制的字符數組到設備。先用商家配的串口調試助手來測試通信協議代碼,測試正常后將會用到的幾個代碼保存后面用。
串口數據讀取和寫入
軟件部分使用的是 .NET里的System.IO.Ports里的SerialPort類。設置串口,讀寫串口的方法都是線程的。沒有什么太多的難度。
唯一麻煩的地方:
- 一個在於如何在16進制表示的字符串和byte[]之間的轉換。
- 一個在於如何對這個字符串進行CRC16_MODBUS校驗。
16進制的字符串比如,"01 03 01 F4 00 02",中間用空格隔開的,需要先去除空格,然后每兩位當成一個16進制的表示,然后轉換為byte,用的方法是Convert.ToByte(取到的2位字符串,16),然后存儲在byte中。應為兩位的16進制最小是0(00),最大的255(FF),只需要不斷執行這個過程就可以把整個字符串全部轉換存入byte[]中。
接下來是生成前面字符串的CRC校驗碼,這個我查了一下校驗方法的寫法,覺得自己寫起來還是挺麻煩的,於是就在Nuget上找了一下現成的校驗方法,找到一個Toko.CRC,很容易使用的一個CRC校驗庫。通過它可以給現有的string生成CRC16_MODBUS類型的校驗碼。
之后需要將校驗碼和前面的byte[]數組進行結合,校驗碼的高位放在后面,地位放在前面;比如校驗碼是05 25,追加到前面byte[]的時候就是2505,這個是協議的要求。
然后使用port.Write,將byte[]寫入到串口寫緩沖區就可以了。
寫完之后要將當前線程暫停一會兒,因為傳感器返回讀取的數據到讀緩沖區需要時間,暫停結束后再通過port.Read的方式讀取byte[],(可選:這里可以考慮對讀取的byte[]進行CRC校驗,確定數據OK,或者簡單的對byte[]的長度進行判斷,看讀取過程中是否有問題)需要先將byte[]轉換回16進制表示的字符串,使用"{0:x2}"格式化,然后把對應需要的數據位的字符串取下來,然后再將這些字符串分別轉換為十進制數字,存入設定的變量當中。
數據處理和繪圖
得到溫度和濕度的數據之后就簡單了,需要存入文件存文件,需要顯示顯示,需要繪圖繪圖。不再闡述。