日期:2014-05-16  浏览次数:20761 次

有谁用过“http://www.yafeilinux.com/?p=820”编的lincom吗?串口打不开是什么原因?
我完全按照“http://www.yafeilinux.com/?p=820”编写的linux下的串口调试程序lincom,串口为“/dev/ttyS0”,运行是没有问题的,但是不能接收和发送数据。调试发现串口好像没打开,另外用minicom测试串口是可以正常收发数据的,说明串口本身是没有问题的,问题是在用Qt编写的lincom程序。但是我是严格按照yafeilinux介绍的编写的,不知各位网友有没有出现过这种问题?是怎么解决的?下面是wiget.cpp的代码。
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
  QWidget(parent),
  ui(new Ui::Widget)
{
  ui->setupUi(this);
  myCom = new
  Posix_QextSerialPort("/dev/ttyS0",QextSerialBase::Polling );
  //定义串口对象,指定串口名和查询模式,这里使用事件驱动Polling


  myCom->open(QIODevice::ReadWrite);
  //以读写方式打开串口


  myCom->setBaudRate(BAUD9600);
  //波特率设置为9600
  myCom->setDataBits(DATA_8);
  //设置数据位为8
  myCom->setParity(PAR_NONE);
  //奇偶校验设置为无校验
  myCom->setStopBits(STOP_1);
  //停止位设置为1位
  myCom->setFlowControl(FLOW_OFF);
  //数据流控制设置为无流控制
  myCom->setTimeout(500);
  //延时设置,延时500MS

  readTimer = new QTimer(this);

  readTimer->start(100);
  connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()) );
  //信号和槽函数关联,延时一段时间,进行读串口操作

  }

  //实现槽函数

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

Widget::~Widget()
{
  delete ui;
}

void Widget::changeEvent(QEvent *e)
{
  QWidget::changeEvent(e);
  switch (e->type()) {
  case QEvent::LanguageChange:
  ui->retranslateUi(this);
  break;
  default:
  break;
  }
}


------解决方案--------------------
1.QextSerialBase::Polling 这是轮询机制不是事件驱动机制,更正一下。
2.终端看看/etc/dev下面串口ttys0应该是有人占用吧,还有你用的是U转串的线吧,所以啊你要建立一个符号链接吧USB口和ttys*进行连接 *号是一个未被占用的号码,随便都行只要没被占用就好。建立符号链接的命令ln 参数是s.
希望能够帮到你
------解决方案--------------------
探讨
不是USB转串口的啊,就是台式机上的RS232口,串口也没被占用,不知道是什么原因。下载了几个网友上传的代码如linucom2.2.0来运行也是打不开串口,我装的是国产的中标麒麟操作系统,是不是系统原因啊。linux版本的程序是不是不能在麒麟下运行?麒麟的内核好像又是linux,不太明白,求高人指点!

------解决方案--------------------
权限不够吧。minicom都得sudo的