Linux下基于QT的串口通信程序(Tiny6410)

来源:互联网 发布:淘宝的旺旺号是啥 编辑:程序博客网 时间:2024/04/28 10:02

由于有关ARM开发板很多外设都是支持串口通信的,所以在QT下编写一个串口通信程序就显得尤为重要。下面将一步一步叙述开发过程:

Linux下QT串口通信相关文件及例程下载!!!

1、开发板上设备驱动位置:/dev下存有各种设备驱动文件名

2、首先来看一下串口通信几个关键文件:

posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类;
qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类  ;
qextserialport.cpp和qextserialport.h文件定义了一个QextSerialPort类 。

3、读取串口方式:Polling(查询方式)和EventDriven(事件驱动方式)
此两种方式在QextSerialBase类的一个枚举变量QueryMode中定义了。

事件驱动方式:使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,在事件驱动、的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
查询方式:读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。需要建立定时器来读取串口的数据。

注意:在Windows下支持以上两种模式,而在Linux下只支持Polling模式。

4、总结一下:
我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。在Linux下是:
qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h
在Linux下我们只能使用查询Polling方式。

5、下面开始建立一个基本QT工程:
工程命名为myCom,Base Class选择QWidget。

然后将有关Linux下串口配置文件(cpp和h文件)添加到工程里面去:

6、接下来修改下ui界面。如下图:

7、widget.h文件中进行对象及函数声明 。
添加头文件包含: #include “posix_qextserialport.h”,然后在private中声明对象:Posix_QextSerialPort *myCom;
声明私有槽函数:
private slots:
void on_pushButton_clicked(); //”发送数据”按钮槽函数
void readMyCom(); //读取串口

8、widget.cpp在构造函数添加:
myCom = new Posix_QextSerialPort("/dev/ttySAC3",QextSerialBase::Polling);
myCom ->open(QIODevice::ReadWrite); //以读写方式打开串口   
myCom->setBaudRate(BAUD115200); //波特率设置,我们设置为115200
myCom->setDataBits(DATA_8); //数据位设置,我们设置为8位数据位
myCom->setParity(PAR_NONE); //奇偶校验设置,我们设置为无校验
myCom->setStopBits(STOP_1); //停止位设置,我们设置为1位停止位   
myCom->setFlowControl(FLOW_OFF); //数据流控制设置,我们设置为无数据流控制
//myCom->setTimeout(10);
以上是对一个串口的初始化配置信息。
程序写到这里试着编译一下,解决一下出现的错误。



9、回顾一下:程序至此,已完成串口通信的界面设计与串口初始化配置部分。
接下来思考一下:查询方式(polling:轮询)的原理?
通过建立一个定时器,定时“询问”串口是否有信息待读取。如果有,系统留给串口一定时间来读取,如果没有,继续“询问”。
建立一个定时器:
readTimer = new QTimer(this);
readTimer->start(100);
/*开启定时器,并且每100ms后询问一次串口。定时的时间一到,马上产生timeout()信号,继续执行自定义槽函数readMyCom() */
connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));

10、注意:串口初始化中值得注意的一点

myCom->setTimeout(10);


这里的setTimeout()与定时器的timeout()区别:
PC机向ARM通过串口发送信息时,会有一个“中间存储器”----即串口缓冲区。setTimeout()作用是定时读取数据到缓冲区,而timeout()则是定时读取串口缓冲区内容。setTimeout(ms)里面大小参数设置原则:越小越好,不过如果pc机一次性发送的数据比较庞大,应该增大参数大小。

11、经过上述讲解,大家应该知道了串口通信最核心的部分。下面将程序的两个自定义槽函数补充完整。

void Widget::readMyCom() //读取串口数据并显示出来
{
    QByteArray temp = myCom->readAll(); //读取串口缓冲区的所有数据给临时变量temp
   ui->textBrowser->insertPlainText(temp); //将串口的数据显示在窗口的文本浏览器中
}
void Widget::on_pushButton_clicked() //发送数据
{
    myCom->write(ui->lineEdit->text().toAscii()); //以ASCII码形式将数据写入串口
}

0 0