linux实验串行端口程序设计,Linux下串口编程心得(转)
最近一段時(shí)間,需要完成項(xiàng)目中關(guān)于Linux下使用串口的一個(gè)部分,現(xiàn)在開(kāi)帖記錄過(guò)程點(diǎn)滴。
項(xiàng)目的要求是這樣的,Qt應(yīng)用程序主要完成數(shù)據(jù)采集和發(fā)送功能,一開(kāi)始在google中海搜關(guān)鍵字“Qt串口編程”,得出的結(jié)論是:
一、Qt自己的類中沒(méi)有關(guān)于串口的類,不過(guò)有人做了一個(gè)第三方的類:qextserialport。可以在如下地址下載到:ftp://ftp.trolltech.com/contrib/qextserialport.tar.gz 或者h(yuǎn)ttp://qextserialport.sourceforge.net二、關(guān)于qextserialport,下載下來(lái)的文件中會(huì)自帶比較詳細(xì)的HTML文檔介紹,不過(guò)都是英文哦!而且有版本對(duì)應(yīng),目前的認(rèn)識(shí)是0.9之后的使用于qt4。
三、以下文章是講qextserial的編譯的,不過(guò)好像用處不大。http://www.cnblogs.com/leaway/archive/2008/03/13/1104562.html四、也可以不用這個(gè)類,直接調(diào)用linux的系統(tǒng)函數(shù)。Linux中“萬(wàn)物皆文件”,所以串口也不例外。只要利用open()函數(shù)打開(kāi)設(shè)備,用read()和write()函數(shù)讀寫串口,用close()關(guān)閉即可。另外,對(duì)于串口需要設(shè)置一些參數(shù)。
五、繼續(xù)往下搜,一篇號(hào)稱“Linux下串口編程Bible”的文章《Serial Programming Guide for POSIX Operating Systems》浮出水面,不過(guò)照樣是英文的。以下網(wǎng)址可以在線閱讀或下載。 http://www.easysw.com/~mike/serial/serial.html
http: //digilander.libero.it/robang/rubrica/serial.htmhttp: //digilander.libero.it/robang/rubrica/serial.htm
開(kāi)始試著在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/
一下子輕易通過(guò)編譯,還真的是不敢相信,不過(guò)后來(lái)發(fā)現(xiàn)這個(gè)根本沒(méi)用,因?yàn)槲倚枰龅绞前堰@個(gè)現(xiàn)成的類添加到我的工程之中,而不是要用它的.o文件。編譯通過(guò)只說(shuō)明現(xiàn)在下載的版本是沒(méi)有語(yǔ)法錯(cuò)誤的哈哈。
最近一段時(shí)間搞了兩天,幾近崩潰,好在晚飯前終于曙光降臨。我用Posix_qextserialport類實(shí)現(xiàn)了串口的寫數(shù)據(jù),看到數(shù)據(jù)接收到的一刻,突然感覺(jué)所有的事情都不再困難。而之前所有的努力也因?yàn)檫@一刻的到來(lái)而充滿了意義。
一、做到向串口寫數(shù)據(jù)和讀數(shù)據(jù),最后做個(gè)小界面,完善一下,直觀一點(diǎn)。
二、與原有程序結(jié)合,實(shí)現(xiàn)原來(lái)的預(yù)想功能。
三、順便研究調(diào)用第三方類和直接使用linux的要求是這樣的,Qt應(yīng)用程序主要完成數(shù)據(jù)函數(shù)兩種方式,總結(jié)成文。
無(wú)論是Win還是Lin ,最近一段時(shí)間,都是下載源碼包,然后放到源碼目錄src下,然后,需要完成項(xiàng)目中關(guān)于Linux下使用串口qmake make,即可得到對(duì)應(yīng)的庫(kù)文件。在Win的要求是這樣的,Qt應(yīng)用程序主要完成數(shù)據(jù)下是qextserialport.dll,qextserialport.prl,libqextserialport.a,需要將第一個(gè)復(fù)制到Qt安裝目錄下的,后面兩個(gè)放在Qt安裝目錄的lib下。
繼續(xù)努力。今天定下的兩條指導(dǎo)思想:
1、要研究qextserialport的文檔,因?yàn)樗菫镼t編寫的類,集成了Qt文檔豐富的優(yōu)點(diǎn),而且風(fēng)格是與Qt的其他類是完全類似的。
2、要研究1.1版本的例子,雖然0.9版本沒(méi)有例子,但是版本的延續(xù)是一脈相承的。所以看后續(xù)版本的例子也有一些啟發(fā)。
一個(gè)是亂碼問(wèn)題。
原以為昨天解決了大部分問(wèn)題今天就可以正常接收了,沒(méi)想到接收到的全是亂碼。后來(lái)想來(lái)想去覺(jué)得只有串口的波特率設(shè)置是可能造成影響的。可是我的發(fā)送端和接收端全是一樣是9600啊。無(wú)奈,看到梁哥那個(gè)串口調(diào)試工具是115200,DNW也是,我就把波特率全部設(shè)置成了115200。果然可以了,而且另外一個(gè)發(fā)現(xiàn)是:只能是這一種,設(shè)置成其他的,一樣都不行,高于115200也不行,真不知道波特率由什么決定的啦。不過(guò)通信中真是太重要了,一不匹配就什么也得不到。
第二個(gè)問(wèn)題是:當(dāng)我傳輸?shù)奈谋据^大時(shí)(其實(shí)沒(méi)有多大,只有2000多bytes),服務(wù)器就只能接收到前面一部分了,原來(lái)以為它分了多次也應(yīng)該能夠收到,但是就是沒(méi)有!
我想過(guò)了各種可能,并嘗試了各種小試驗(yàn)驗(yàn)證,逐一排查。
試驗(yàn)一:利用電腦的串口向DTU發(fā)送較長(zhǎng)數(shù)據(jù),發(fā)現(xiàn)接收正常,反過(guò)來(lái)也是正常的。
這下我認(rèn)定DTU肯定沒(méi)有問(wèn)題,出問(wèn)題的肯定只有自己發(fā)送端的程序了。我查看了qestserialport的源代碼,發(fā)現(xiàn)里面并沒(méi)有給發(fā)送的大小設(shè)置限制。nbsp; 項(xiàng)目
試驗(yàn)二:在發(fā)送端采用拆包發(fā)送機(jī)制,一次發(fā)送不超過(guò)1024,結(jié)果發(fā)現(xiàn)現(xiàn)象還是跟原來(lái)一樣沒(méi)變化。
最后沒(méi)辦法,把qextserialport的父類,爺爺類,太爺爺類都翻出來(lái)看。發(fā)現(xiàn)其祖上居然是Qt中的QIODevice,這東西真是太好了,因?yàn)镼Socket也是其同脈子孫,既然如此,可以用原來(lái)程序的思路。這樣,我用出了最后一招(GOD,這招要是不管用,我真的沒(méi)招了!):QString->QTextStream->QIODevice(Qtxtserialport)
哈哈,可以了!
總結(jié)
以上是生活随笔為你收集整理的linux实验串行端口程序设计,Linux下串口编程心得(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: linux提示密码没有凑效,陈连福的生信
- 下一篇: linux系统清除日志,如何清除Linu
