查看: 4462|回复: 3

【UP-Board试用】+基于Qt的串口助手和小人时钟

[复制链接]
  • TA的每日心情
    奋斗
    2022-10-13 10:27
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-2-13 22:56:54 | 显示全部楼层 |阅读模式
    分享到:
    UP-Board 试用汇总

    前面搭建好了Windows开发板平台,说是开发平台不如说是一款名副其实的掌上电脑,同样的X86架构,所以如果之前有Windows下的一些项目,基本上无需移植就可以直接再我们的Upboard上运行了,这里我给出了前段时间做的一个Qt串口助手和一个小人时钟,关于Qt串口助手设计如下:
    首先是设计界面
    QQ截图20170213225244.jpg

    代码实现如下
    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include <QKeyEvent>

    4. MainWindow::MainWindow(QWidget *parent) :
    5.     QMainWindow(parent),
    6.     ui(new Ui::MainWindow)
    7. {
    8.     ui->setupUi(this);
    9.     qDebug()<<"start";
    10.     ui->radioButton->setChecked(true);
    11.     ui->radioButton_3->setChecked(true);



    12.     ui->closeMyComBtn->setEnabled(false); //开始“关闭串口”按钮不可用

    13.     ui->sendMsgBtn->setEnabled(false); //开始“发送数据”按钮不可用
    14.     connect(ui->textBrowser, SIGNAL(cursorPositionChanged()), this, SLOT(autoScroll()));
    15. }

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

    20. QByteArray MainWindow::QString2Hex(QString str)
    21. {
    22.     QByteArray senddata;
    23.     int hexdata,lowhexdata;
    24.     int hexdatalen = 0;
    25.     int len = str.length();
    26.     senddata.resize(len/2);
    27.     char lstr,hstr;
    28.     for(int i=0; i<len; )
    29.     {
    30.         hstr=str[i].toAscii();
    31.         if(hstr == ' ')
    32.         {
    33.             i++;
    34.             continue;
    35.         }
    36.         i++;
    37.         if(i >= len)
    38.             break;
    39.         lstr = str[i].toAscii();
    40.         hexdata = ConvertHexChar(hstr);
    41.         lowhexdata = ConvertHexChar(lstr);
    42.         if((hexdata == 16) || (lowhexdata == 16))
    43.             break;
    44.         else
    45.             hexdata = hexdata*16+lowhexdata;
    46.         i++;
    47.         senddata[hexdatalen] = (char)hexdata;
    48.         hexdatalen++;
    49.     }
    50.     senddata.resize(hexdatalen);
    51.     return senddata;
    52. }

    53. char MainWindow::ConvertHexChar(char ch)  //16进制字符“d”转为16进制d
    54. {
    55.     if((ch >= '0') && (ch <= '9'))
    56.         return ch-0x30;
    57.     else if((ch >= 'A') && (ch <= 'F'))
    58.         return ch-'A'+10;
    59.     else if((ch >= 'a') && (ch <= 'f'))
    60.         return ch-'a'+10;
    61.     else return (-1);
    62. }

    63. void MainWindow::readMycom()
    64. {
    65.     qDebug()<<"read";
    66.     QByteArray temp = myCom->readAll();
    67.     //QByteArray temp = MainWindow::QString2Hex(temp1);

    68.     qDebug()<<"readOver";
    69.     if( ui->radioButton_2->isChecked())
    70.     {
    71.         //ui->radioButton_2->setChecked( true );
    72.         qDebug("read Hex choiced!");
    73.         ui->textBrowser->insertPlainText(temp.toHex());
    74.     }
    75.     else if(ui->radioButton->isChecked())
    76.     {
    77.         qDebug("read Ascll choiced!");
    78.         ui->textBrowser->insertPlainText(temp);
    79.     }
    80.     else
    81.     {
    82.         qDebug("read set default!");
    83.         ui->textBrowser->insertPlainText(temp);
    84.     }


    85. void MainWindow::on_openMyComBtn_clicked()
    86. {
    87.     QString portName = ui->portNameComboBox->currentText();//获取端口号
    88.     myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven); //定义串口对象,并传递参数,在构造函数里对其进行初始化
    89.    // myCom = new Win_QextSerialPort(tr("\\\\.\\%1").arg(ui->portNameComboBox->currentText()),QextSerialBase::EventDriven);
    90.     myCom ->open(QIODevice::ReadWrite); //打开串口

    91.     if(ui->baudRateComboBox->currentText()==tr("1200")) //根据组合框内容对串口进行设置
    92.     myCom->setBaudRate(BAUD1200);
    93.     else if(ui->baudRateComboBox->currentText()==tr("2400"))
    94.     myCom->setBaudRate(BAUD2400);
    95.     else if(ui->baudRateComboBox->currentText()==tr("4800"))
    96.     myCom->setBaudRate(BAUD4800);
    97.     else if(ui->baudRateComboBox->currentText()==tr("9600"))
    98.     myCom->setBaudRate(BAUD9600);
    99.     else if(ui->baudRateComboBox->currentText()==tr("14400"))
    100.     myCom->setBaudRate(BAUD14400);
    101.     else if(ui->baudRateComboBox->currentText()==tr("19200"))
    102.     myCom->setBaudRate(BAUD19200);
    103.     else if(ui->baudRateComboBox->currentText()==tr("38400"))
    104.     myCom->setBaudRate(BAUD38400);
    105.     else if(ui->baudRateComboBox->currentText()==tr("56000"))
    106.     myCom->setBaudRate(BAUD56000);
    107.     else if(ui->baudRateComboBox->currentText()==tr("57600"))
    108.     myCom->setBaudRate(BAUD57600);
    109.     else if(ui->baudRateComboBox->currentText()==tr("115200"))
    110.     myCom->setBaudRate(BAUD115200);
    111.     else if(ui->baudRateComboBox->currentText()==tr("128000"))
    112.     myCom->setBaudRate(BAUD128000);
    113.     //设置波特率

    114.     if(ui->dataBitsComboBox->currentText()==tr("8"))
    115.     myCom->setDataBits(DATA_8);
    116.     else if(ui->dataBitsComboBox->currentText()==tr("7"))
    117.     myCom->setDataBits(DATA_7);
    118.     //设置数据位
    119.     if(ui->parityComboBox->currentText()==tr("无"))
    120.     myCom->setParity(PAR_NONE);
    121.     else if(ui->parityComboBox->currentText()==tr("奇"))
    122.     myCom->setParity(PAR_ODD);
    123.     else if(ui->parityComboBox->currentText()==tr("偶"))
    124.     myCom->setParity(PAR_EVEN);
    125.     //设置奇偶校验
    126.     if(ui->stopBitsComboBox->currentText()==tr("1"))
    127.     myCom->setStopBits(STOP_1);
    128.     else if(ui->stopBitsComboBox->currentText()==tr("2"))
    129.     myCom->setStopBits(STOP_2);
    130.     //设置停止位

    131.     myCom->setFlowControl(FLOW_OFF); //设置数据流控制,我们使用无数据流控制的默认设置
    132.     myCom->setTimeout(500); //设置延时
    133.     connect(myCom,SIGNAL(readyRead()),this,SLOT(readMycom()));

    134.     //信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作
    135.     ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”按钮不可用
    136.     ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”按钮可用
    137.     ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”按钮可用
    138.     ui->baudRateComboBox->setEnabled(false); //设置各个组合框不可用
    139.     ui->dataBitsComboBox->setEnabled(false);
    140.     ui->parityComboBox->setEnabled(false);
    141.     ui->stopBitsComboBox->setEnabled(false);
    142.     ui->portNameComboBox->setEnabled(false);


    143.     myCom->close();
    144.     ui->openMyComBtn->setEnabled(true); //关闭串口后“打开串口”按钮可用
    145.     ui->closeMyComBtn->setEnabled(false); //关闭串口后“关闭串口”按钮不可用
    146.     ui->sendMsgBtn->setEnabled(false); //关闭串口后“发送数据”按钮不可用
    147.     ui->baudRateComboBox->setEnabled(true); //设置各个组合框可用
    148.     ui->dataBitsComboBox->setEnabled(true);
    149.     ui->parityComboBox->setEnabled(true);
    150.     ui->stopBitsComboBox->setEnabled(true);
    151.     ui->portNameComboBox->setEnabled(true);
    152. }

    153. void MainWindow::on_sendMsgBtn_clicked()
    154. {
    155.     //qDebug()<< myCom->write(ui->sendMsgLineEdit->toPlainText().toAscii());
    156.     //以ASCII码形式将行编辑框中的数据写入串口
    157.     if( ui->radioButton_4->isChecked())
    158.     {
    159.         //ui->radioButton_2->setChecked( true );
    160.         qDebug("send Hex choiced!");
    161.         QByteArray senddata = MainWindow::QString2Hex(ui->sendMsgLineEdit->toPlainText().toAscii());
    162.         myCom->write(senddata);
    163.     }
    164.     else if(ui->radioButton_3->isChecked())
    165.     {
    166.         qDebug("send Ascll choiced!");
    167.         // 串口发送数据Ascll
    168.         myCom->write(ui->sendMsgLineEdit->toPlainText().toAscii());

    169.     }
    170.     else
    171.     {
    172.         qDebug("send set default!");
    173.         // 串口发送数据Ascll
    174.         myCom->write(ui->sendMsgLineEdit->toPlainText().toAscii());
    175.     }
    176. }

    177. void MainWindow::debugtest()
    178. {
    179.     qDebug()<<"slots is runing !";
    180. }

    181. void MainWindow::autoScroll()
    182. {
    183.       ui->textBrowser->moveCursor(QTextCursor::End);
    184. //    QTextCursor cursor =  this->tex
    185. //    cursor.movePosition(QTextCursor::End);
    186.       //    ui->textBrowser->setTextCursor(cursor);
    187. }




    188. void MainWindow::on_RXButton_clicked()
    189. {
    190.     ui->textBrowser->clear();
    191. }

    192. void MainWindow::on_TXButton_clicked()
    193. {
    194.     ui->sendMsgLineEdit->clear();
    195. }

    196. void MainWindow::on_quitButton_clicked()
    197. {
    198.     exit(0);
    199. }

    200. // 键盘按下事件实现快捷键
    201. void MainWindow::keyPressEvent(QKeyEvent *event)

    202. {
    203.     // 是否按下Ctrl键
    204.     if(event->modifiers() == Qt::ControlModifier){

    205.         // 是否按下Enter键
    206.         if(event->key() == Qt::Key_Return)
    207.         {
    208.             if( ui->radioButton_4->isChecked())
    209.             {
    210.                 //ui->radioButton_2->setChecked( true );
    211.                 qDebug("Receive Hex choiced!");
    212.                 QByteArray senddata = MainWindow::QString2Hex(ui->sendMsgLineEdit->toPlainText().toAscii());
    213.                 myCom->write(senddata);
    214.             }
    215.             else if(ui->radioButton_3->isChecked())
    216.             {
    217.                 qDebug("Receive Ascll choiced!");
    218.                 // 串口发送数据Ascll
    219.                 myCom->write(ui->sendMsgLineEdit->toPlainText().toAscii());

    220.             }
    221.             else
    222.             {
    223.                 qDebug("Receive set default!");
    224.                 // 串口发送数据Ascll
    225.                 myCom->write(ui->sendMsgLineEdit->toPlainText().toAscii());
    226.             }
    227.         }

    228.     }
    229.     else MainWindow::keyPressEvent(event);
    230. }

    231. // 按键释放事件
    232. //void MainWindow::keyReleaseEvent(QKeyEvent *event)
    233. //{
    234. //    //其他操作
    235. //}


    复制代码
       Qt来做图形界面实在是比较方便,Windows和嵌入式平台都不错,这里设计比较简单,大家可以参考上面代码,下面是运行效果,实现了我们平常用的串口助手上的基本功能
    03.jpg
    后面接着测试了一个小人时钟,这个是网上的一个开源软件,感觉还不错,效果如下
    06.jpg
    总结:
       对于Upboard这样一款能够完全运行Windows系统的板卡,如果想移植之前的程序可以说十分方便,上面的两个例子大家也看到了,基本上你电脑开发的项目都可以再上面跑,不过如果都运行工程量比较大的程序,直接运行windwos上,或许就要考虑关闭掉一些不必要的资源占用问题了,大家可以根据开发需求做相应的调整。

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2017-2-28 09:34
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-2-14 11:20:33 | 显示全部楼层
    QT哦   高大上
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2017-2-28 09:34
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-2-14 11:21:05 | 显示全部楼层
    每次都是一铜板
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-4-24 06:39
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-3-10 12:21:33 | 显示全部楼层
    谢谢分享!好功能,经常用得到。多谢,多谢了!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 10:04 , Processed in 0.139611 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.