Qt QSerialPort ReadAll() 報錯 串口讀取錯誤,非法內存,及小項目開發感悟
1 小背景

從串口讀數據,本來是很簡單的問題,但是這次串口的數據量有點大,而我的上位機也有PC變成了ARM的嵌入式系統,性能相對PC有所下降。以前寫去讀串口,都是在PC下的程序,也一直用的都是readAll函數,沒有啥大問題。這次出現了問題,在第一版本中,出現了丟包嚴重,好多數據丟失,開始一度懷疑都是單片機出數的問題,所以優先解決單片機問題,解決方法很簡單,把現有程序改成PC版,在PC上通過串口連接到單片機的串口上,發現單片機確實存在出數據量不夠的因素。隨后將單片機波特率調至高波特率。在PC上驗證數據可以。
2 串口readAll讀取數據問題
移植到ARM嵌入式系統上面,畫面依舊卡頓,無解,隨打印Log查看發現,每次readAll的數據長度都不一樣,而我的解析函數都是默認解析第一幀,和面的數據等于全部丟失,導致畫面卡頓;這里要說一下,以前以我淺陋的認識認為中斷的方式就是一幀一幀的來接受,但是這幾天學習才發現我以前的認識是錯誤的,中斷只是在接收到有數據的時候就會觸發了,所以這里在使用串口的時候,最后可以加上結束符,這樣也好判斷包的完整性。
3 線程問題
其實包的完整性不是我第一個考慮的問題,我第一個考慮的問題是ARM開發板的處理性能問題,打開資源管理器查看,發現有一個核心CPU占用率95左右,有時直接100了。所以第一想到的可能是應為CPU性能有限,而我在界面上有大量的繪制工作,導致數據處理不及時或者畫面渲染卡頓造成,所以開了線程。一開線程,那就發現我以前的認知又錯了。一直以為只要寫在線程類里面的東西,都會去線程里面,后面通過打印線程ID發現根部不是一回事,線程ID和主線程ID一樣,一度懷疑開了一個假線程,后面學習才發現,只有在run函數里面的才會去到線程里面。這里又一個知識點。開了線程還是沒有解決我的問題。畫面依舊卡頓??紤]可能是中斷的問題,所以轉換思路,換直接讀取,直接在run函數里面while(1)讀取串口數據,還是無解,畫面依舊卡頓,這才回到上面“2”中的內容,打印串口readAll數據發現每次接收的數據量都不是一樣的。找到方法就很簡單了,在我的數據解析函數里面加入拆包處理就可以了。完美決絕問題。
4 線程遇到內存錯誤問題
線程其實就是一個最大的坑,這里當我竊喜的時候,程序運行無緣無故崩潰 Debug發現都是內存錯誤,傳說中的問題終于讓我遇到,但是呢,沒有解決,怎么改也不行,都是內存先關的問題,嘗試過吧串口對象設置靜態、全局、指針、實體。均失敗,都會有程序崩潰線程,最后還是把串口數據讀取移動到主進程中,才解決。
5 小總結
繞了一圈最后發現還是出現在讀取數據理解的問題上,還是自己的開發經驗不足呀。不過還是解決了這個問題了,老板看到新的畫面絲滑搬流暢,很開心,哈哈哈哈。
6 題外話
這次開發有個插曲,在第一版中,客戶給的文件中圖形畫面模糊,而且是黑白的,畫面描述很多地方都不具體,導致做出來的東西都是摸索出來的,很不滿意,加上客戶還讓出六份文檔,導致我個人直接崩潰,完全沒有得到客戶的認可,文檔也不是客戶想要的,這里是因為客戶的問題“上位機”軟件,我沒有理解到客戶的點,導致文檔全部作廢。直接爆發,和老板干了一架。估計這也沒誰了,還是太年輕,自己也沒有擺好自己的位置,我們做開發的,不就是解決客戶的問題嗎,客戶要是知道自己要啥,那還找我們做啥了,希望在后面的職業生涯中,自己可以穩重點,不要還和一個剛畢業的大學生的一樣。逼近也不小了,總不能天天讓被人哄著。
Qt 單片機 嵌入式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。