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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux实验串行端口程序设计,Linux下串口编程心得(转)

發布時間:2024/10/12 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux实验串行端口程序设计,Linux下串口编程心得(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一段時間,需要完成項目中關于Linux下使用串口的一個部分,現在開帖記錄過程點滴。

項目的要求是這樣的,Qt應用程序主要完成數據采集和發送功能,一開始在google中海搜關鍵字“Qt串口編程”,得出的結論是:

一、Qt自己的類中沒有關于串口的類,不過有人做了一個第三方的類:qextserialport。可以在如下地址下載到:ftp://ftp.trolltech.com/contrib/qextserialport.tar.gz 或者http://qextserialport.sourceforge.net二、關于qextserialport,下載下來的文件中會自帶比較詳細的HTML文檔介紹,不過都是英文哦!而且有版本對應,目前的認識是0.9之后的使用于qt4。

三、以下文章是講qextserial的編譯的,不過好像用處不大。http://www.cnblogs.com/leaway/archive/2008/03/13/1104562.html四、也可以不用這個類,直接調用linux的系統函數。Linux中“萬物皆文件”,所以串口也不例外。只要利用open()函數打開設備,用read()和write()函數讀寫串口,用close()關閉即可。另外,對于串口需要設置一些參數。

五、繼續往下搜,一篇號稱“Linux下串口編程Bible”的文章《Serial Programming Guide for POSIX Operating Systems》浮出水面,不過照樣是英文的。以下網址可以在線閱讀或下載。 http://www.easysw.com/~mike/serial/serial.html

http: //digilander.libero.it/robang/rubrica/serial.htmhttp: //digilander.libero.it/robang/rubrica/serial.htm

開始試著在Linux下編譯下載的例子。

[root@localhost qextserialport-0.9.0]# ls

Changes qextserialbase.cpp qextserialport.pro

html qextserialbase.h win_qextserialport.cpp

posix_qextserialport.cpp qextserialport.cpp win_qextserialport.h

posix_qextserialport.h qextserialport.h

[root@localhost qextserialport-0.9.0]# vi qextserialport.pro

[root@localhost qextserialport-0.9.0]# qmake -o Makefile qextserialport.pro

[root@localhost qextserialport-0.9.0]# vi makenbsp;

[root@localhost qextserialport-0.9.0]# vi Makefile

[root@localhost qextserialport-0.9.0]# make

g++ -c -pipe -Wall -W -g -D_REENTRANT -fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT -I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I. -I/usr/include/freetype2 -I../../include -Imoc/ -o obj/qextserialbase.o qextserialbase.cpp

g++ -c -pipe -Wall -W -g -D_REENTRANT -fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT -I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I. -I/usr/include/freetype2 -I../../include -Imoc/ -o obj/qextserialport.o qextserialport.cpp

g++ -c -pipe -Wall -W -g -D_REENTRANT -fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT -I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I. -I/usr/include/freetype2 -I../../include -Imoc/ -o obj/posix_qextserialport.o posix_qextserialport.cpp

test -d lib/ || mkdir -p lib/nbsp; rm -f libqextserialport.so.1.0.0 libqextserialport.so libqextserialport.so.1 libqextserialport.so.1.0

g++ -Wl,-rpath,/usr/local/qt-x11-free-3.3.6/lib -shared -Wl,-soname,libqextserialport.so.1 -Wl,-rpath,/usr/local/qt-x11-free-3.3.6/zhf_work/qextserialport-0.9.0/lib -o libqextserialport.so.1.0.0 obj/qextserialbase.o obj/qextserialport.o

obj/posix_qextserialport.o -L/usr/local/qt-x11-free-3.3.6/lib -lqt-mt -lpthread

ln -s libqextserialport.so.1.0.0 libqextserialport.sonbsp;

ln -s libqextserialport.so.1.0.0 libqextserialport.so.1

ln -s libqextserialport.so.1.0.0 libqextserialport.so.1.0

rm -f lib/libqextserialport.so.1.0.0nbsp;

rm -f lib/libqextserialport.so

rm -f lib/libqextserialport.so.1

rm -f lib/libqextserialport.so.1.0

mv -f libqextserialport.so.1.0.0 libqextserialport.so libqextserialport.so.1

libqextserialport.so.1.0 lib/

一下子輕易通過編譯,還真的是不敢相信,不過后來發現這個根本沒用,因為我需要做到是把這個現成的類添加到我的工程之中,而不是要用它的.o文件。編譯通過只說明現在下載的版本是沒有語法錯誤的哈哈。

最近一段時間搞了兩天,幾近崩潰,好在晚飯前終于曙光降臨。我用Posix_qextserialport類實現了串口的寫數據,看到數據接收到的一刻,突然感覺所有的事情都不再困難。而之前所有的努力也因為這一刻的到來而充滿了意義。

一、做到向串口寫數據和讀數據,最后做個小界面,完善一下,直觀一點。

二、與原有程序結合,實現原來的預想功能。

三、順便研究調用第三方類和直接使用linux的要求是這樣的,Qt應用程序主要完成數據函數兩種方式,總結成文。

無論是Win還是Lin ,最近一段時間,都是下載源碼包,然后放到源碼目錄src下,然后,需要完成項目中關于Linux下使用串口qmake make,即可得到對應的庫文件。在Win的要求是這樣的,Qt應用程序主要完成數據下是qextserialport.dll,qextserialport.prl,libqextserialport.a,需要將第一個復制到Qt安裝目錄下的,后面兩個放在Qt安裝目錄的lib下。

繼續努力。今天定下的兩條指導思想:

1、要研究qextserialport的文檔,因為它是為Qt編寫的類,集成了Qt文檔豐富的優點,而且風格是與Qt的其他類是完全類似的。

2、要研究1.1版本的例子,雖然0.9版本沒有例子,但是版本的延續是一脈相承的。所以看后續版本的例子也有一些啟發。

一個是亂碼問題。

原以為昨天解決了大部分問題今天就可以正常接收了,沒想到接收到的全是亂碼。后來想來想去覺得只有串口的波特率設置是可能造成影響的。可是我的發送端和接收端全是一樣是9600啊。無奈,看到梁哥那個串口調試工具是115200,DNW也是,我就把波特率全部設置成了115200。果然可以了,而且另外一個發現是:只能是這一種,設置成其他的,一樣都不行,高于115200也不行,真不知道波特率由什么決定的啦。不過通信中真是太重要了,一不匹配就什么也得不到。

第二個問題是:當我傳輸的文本較大時(其實沒有多大,只有2000多bytes),服務器就只能接收到前面一部分了,原來以為它分了多次也應該能夠收到,但是就是沒有!

我想過了各種可能,并嘗試了各種小試驗驗證,逐一排查。

試驗一:利用電腦的串口向DTU發送較長數據,發現接收正常,反過來也是正常的。

這下我認定DTU肯定沒有問題,出問題的肯定只有自己發送端的程序了。我查看了qestserialport的源代碼,發現里面并沒有給發送的大小設置限制。nbsp; 項目

試驗二:在發送端采用拆包發送機制,一次發送不超過1024,結果發現現象還是跟原來一樣沒變化。

最后沒辦法,把qextserialport的父類,爺爺類,太爺爺類都翻出來看。發現其祖上居然是Qt中的QIODevice,這東西真是太好了,因為QSocket也是其同脈子孫,既然如此,可以用原來程序的思路。這樣,我用出了最后一招(GOD,這招要是不管用,我真的沒招了!):QString->QTextStream->QIODevice(Qtxtserialport)

哈哈,可以了!

總結

以上是生活随笔為你收集整理的linux实验串行端口程序设计,Linux下串口编程心得(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

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