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下串口编程心得(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux提示密码没有凑效,陈连福的生信
- 下一篇: linux 其他常用命令