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

2019-07-12 20:35发布

由于有关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码形式将数据写入串口 }