天嵌 ARM开发社区

 找回密码
 注册
查看: 1792|回复: 3

坑爹啊~~真的坑爹啊

[复制链接]
vvb9137 发表于 2012-2-28 00:08:31 | 显示全部楼层 |阅读模式
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QTimer>
  4. #include<QThread>
  5. #define FALSE                0
  6. #define TRUE                1


  7. static int serial_fd;

  8. Widget::Widget(QWidget *parent) :
  9.     QWidget(parent),
  10.     ui(new Ui::Widget)
  11. {
  12.     ui->setupUi(this);
  13.     serial_init();
  14. }

  15. Widget::~Widget()
  16. {
  17.     delete ui;
  18.    
  19. }

  20. void Widget::changeEvent(QEvent *e)
  21. {
  22.     QWidget::changeEvent(e);
  23.     switch (e->type()) {
  24.     case QEvent::LanguageChange:
  25.         ui->retranslateUi(this);
  26.         break;
  27.     default:
  28.         break;
  29.     }
  30. }


  31. void Widget::set_speed(int fd)
  32. {
  33.         int status;
  34.         struct termios Opt;
  35.         struct termios oldOpt;
  36.         tcgetattr(fd, &oldOpt);
  37.         tcflush(fd, TCIOFLUSH);
  38.         cfsetispeed(&Opt, B38400);
  39.         cfsetospeed(&Opt, B38400);
  40.         status = tcsetattr(fd, TCSANOW, &Opt);
  41.         tcflush(fd, TCIOFLUSH);

  42. }

  43. int Widget::set_Parity(int fd)
  44. {
  45.         struct termios options;
  46.         struct termios oldoptions;
  47.         if(tcgetattr(fd, &oldoptions) != 0)
  48.         {
  49.                   ui->textBrowser->insertPlainText("tcgetattr");
  50.                   return(FALSE);
  51.         }

  52.       options.c_cflag |= (CLOCAL|CREAD);
  53.        options.c_cflag &=~CSIZE;

  54.        options.c_cflag |= CS8;

  55.         options.c_cflag &= ~PARENB;
  56.        options.c_iflag &= ~INPCK;

  57.       options.c_cflag &= ~CSTOPB;

  58.         options.c_iflag |= INPCK;

  59.         options.c_cc[VTIME] = 0;        //150;                        //15 seconds
  60.         options.c_cc[VMIN] = 0;

  61.         options.c_iflag |= IGNPAR|ICRNL;
  62.         options.c_oflag |= OPOST;
  63.        options.c_iflag &= ~(IXON|IXOFF|IXANY);



  64.          options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);    //有时候要屏蔽掉这句才行,有时候又不用

  65.         tcflush(fd, TCIFLUSH);
  66. #if 1

  67. //这里更奇怪有时候要屏蔽掉这段代码发送才正确
  68.         if(tcsetattr(fd, TCSANOW, &options) != 0)
  69.         {
  70.                 ui->textBrowser->insertPlainText("parity 2");
  71.               //  return(FALSE);
  72.         }
  73.         return(TRUE);
  74. #endif

  75. return(TRUE);

  76. }

  77. int Widget::OpenDev(char *Dev)
  78. {
  79.         int fd = open(Dev, O_RDWR, 0);
  80.         if(-1 == fd)
  81.         {
  82.                 ui->textBrowser->insertPlainText("OpenDev");
  83.                 return -1;
  84.         }
  85.         else
  86.                 return fd;
  87. }
  88. void Widget::serial_init(void)
  89. {
  90.       serial_fd = OpenDev("/dev/ttyUSB0");

  91.         if(serial_fd > 0)
  92.                 set_speed(serial_fd);                //设置波特率
  93.         else
  94.         {
  95.                 ui->textBrowser->insertPlainText("init_speed");
  96.                 exit(0);
  97.         }
  98.    #if 1     //恢复串口未阻塞状态
  99.         if (fcntl(serial_fd, F_SETFL, O_NONBLOCK) < 0)
  100.         {
  101.                 ui->textBrowser->insertPlainText("init_speed");
  102.                 exit(0);
  103.         }
  104.         //检查是否是终端设备
  105.         #endif
  106. #if 1
  107.       //  if(isatty(STDIN_FILENO)==0)
  108.        if(isatty(serial_fd)==0)
  109.         {
  110.                 ui->textBrowser->insertPlainText("standard input is not a terminal device\n");
  111.         }

  112. #endif

  113. #if 1       //设置串口参数
  114.         if(set_Parity(serial_fd) == FALSE)
  115.         {
  116.                 ui->textBrowser->insertPlainText("set_Parity Error\n");
  117.             //  exit(1);
  118.         }
  119. #endif
  120. }

  121. void Widget::readCom()
  122. {
  123.     char buffrecv[512];
  124.        int nread=0;
  125.        while((nread=read(serial_fd,buffrecv,512))<=0)
  126.        {
  127.            ;
  128.        }

  129.        for(int i=0;i<nread;i++)
  130.        {
  131.            QString str = QString("%1").arg(buffrecv[i]&0xff,2, 16, QLatin1Char('0'));
  132.            ui->textBrowser->insertPlainText(str+" ");


  133.        }
  134.        nread=0;



  135. }


  136. void Widget::on_pushButton_clicked()
  137. {
  138.     char buff[512];
  139.     char buff2[] ={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};
  140.     int nread=0,nwrite=0,i;

  141.     nwrite = write(serial_fd,buff2,sizeof(buff2));
  142. readCom();

  143. }
复制代码
 楼主| vvb9137 发表于 2012-2-28 00:12:58 | 显示全部楼层
PC 上调通了之后烧到开发板又不行,有时是发送正确,接受的又不对,有时就卡在那里!   为什么啊???   能在PC上运行在开发板不一定能吗?是不是不一样??    每次改一点烧一次,抓狂了!
回复

使用道具 举报

TQ-lkp 发表于 2012-2-28 08:52:49 | 显示全部楼层
你用nfs的方式调试不就行了,只要把程序拷到nfs的目录下就可以了,不用每次都烧啊
回复

使用道具 举报

TQ-lkp 发表于 2012-2-28 08:53:32 | 显示全部楼层
我们论坛中有现成的Qt4开发的串口测试程序,你去下载看下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-20 15:12 , Processed in 2.036031 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表