基于QT_E的串口通信故障及其解决方案

(2)数据传输不影响主程序的运行;(3)确保数据或文件不丢失。

基于如上功能需求,以PC/104为硬件基础,在Linux虚拟机上先进行内核裁剪[4],内核版本是Linux-2.6.0,在字符设备选项中选用串口选项,配置完后进行编译,再进行文件系统制作和grub配置,最后实现

6]Linux操作系统的移植[5,。串口编程是在Linux的

QT/E多线程主要通过继承QThread线程类来实现,首先重新实现QThread::run()方法,然后在主线程中调用QThread::start()方法来启动该线程。因此在串口通信子线程中应该修改run()函数,使其实现数据双向传输的功能

[10]

。run()函数主要代码如下:

structtermiosoptions;//串口设置结构体fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK);//非阻塞方式打开串口if(fd==-1)

{printf("erroropenfd\n");}tcgetattr(fd,&options);

cfsetispeed(&options,B9600);//波特率设置cfsetospeed(&options,B9600);

options.c_cflag&=~PARENB;//奇偶校验设置options.c_cflag&=~CSIZE;

options.c_cflag|=CS8;//8个数据位

options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);//原始输入模式options.c_oflag&=~OPOST;//原始输出tcsetattr(fd,TCSANOW,&options);while(1)

{inti;chara,b;charbuff;a='@';b='*';i=0;write(fd,&a,1);//写串口

QT/E中完成的。为确保在传输过程中不丢失数据/文件,本文制定了自定义的握手协议,根据实际应用可以选择合适的握手字符。通讯模块程流程图见图2

基于QT_E的串口通信故障及其解决方案

图2程序流程图

由于要求数据传输时不影响主程序的运行,因此串口通信程序在嵌入式Linux系统中以多线程的方式运行。

usleep(3000);//等待串口发送完毕buff='\0';

read(fd,&buff,1);//读串口

qApp->processEvents();//响应用户消息}

该子线程通过使用设备终端文件的方式,实现了COM1读写功能。主线程调用子线程主要代码如下:

Mythreadsend;//定义发送子线程全局对象;voidForm1::testSlot()//发送函数{iopl(3);//开启端口读写权限

send.setTargetWidget(this);/*将send对象的主窗口设置为当前窗口*/

send.start();//启动子线程}

将工程编译后在诊断仪的嵌入式Linux系统上运行,并通过串口线连接至PC机的串口调试助手,串口,调试助手能正确的接收到‘@’程序正常运行;但是当通过PC机的串口调试助手向PC/104串口发送数据时,图3所示的图形化多线程串口程序将出现卡死现象,并且在1~2分钟后出现段错误,最后导致系统崩溃。

2QT/E下多线程操作串口通信故障

Linux系统通过串口终端设备文件来实现对串口

[7,8]

设备的访问。调试发现,在QT/E图形化多线程程

序中使用设备文件方式操作串口时,当串口已关闭,如果上位机再发送数据至PC/104串口,将导致嵌入式Linux系统卡死,并在1~2分钟后出现段错误,最终致使系统崩溃,测试过程如下。

在QT/E下多线程中,通过访问串口终端设备文件来实现串口操作,编写如图3的图形化串口通信程序,该程序运行于嵌入式Linux操作系统,程序由主框、“测试”“发送”架按钮和按钮组成。点击发送按钮可调用串口通信子线程,测试按钮用于测试程序能否够响应键盘、鼠标等消息

[9]

基于QT_E的串口通信故障及其解决方案

图3测试界面程序为确定在QT/E下多线程操作串口时容易出现段

你可能喜欢

  • 串口调试工具
  • 系统设计
  • 单片机串口通信
  • 串口通信原理
  • 串口通信详解
  • 串口通信编程

基于QT_E的串口通信故障及其解决方案相关文档

最新文档

返回顶部