设为首页 加入收藏

TOP

让串口调试助手像命令行一样(一)
2019-01-10 20:09:26 】 浏览:532
Tags:串口 调试 助手 命令 一样

说到嵌入式的实时系统,大家首先想到的是不是 闻名遐迩的 UCOS 呢? UCOS 简单,易移植,在关键部分移植汇编语言,是入坑 RTOS [1]的不二选择.接触了一段时间之后,偶然在网上看到,原子哥(正点原子) 的开源教材里头也有介绍 RT-Thread OS 系统,然后开始了解和使用Rt-thread. 它的优势是:商用无风险,不限任务个数,各种协议栈齐全(尤其在 IoT方面),兼容部分POSIX接口(linux接口).

图片来自网络截图侵删

RT-thread 是一个中国人自己开发的开源的RTOS ,借鉴了linux的部分想法.甚至可以复用linux的驱动接口.同时高度可裁剪和丰富的协议栈.当然现在的菜鸟小编都用不到这些. 可是有一个功能小编可是眼红的很,那就是它的 串口 shell 功能,让单片机跟电脑的命令行一样执行命令.

用过gcc 或者java 的小伙伴都知道,可以直接在命令行敲 gcc *.c 或者javac *.java 就可以直接编译文件, 这个 gcc javac 就是咱们的*.exe 文件,那么在单片机里,我定义了一个 printcircle (int r);这个函数,那么我们可不可以直接在串口助手里给单片机发信息: printcircle 30 \n 是不是他就可以执行printcirc这个函数并且r = 30 呢?  答案当然是可以的.

rt-thread 中的shell 就可以做到.并且更加完善.但是单片机支持这样的命令行操作,可是咱们的串口助手并不能像cmd窗口一样啊.著名的Xcom 串口调试软件,不支持这个功能.于是我萌生了做一个上位机适配这个shell 的想法.

 

我的想法很简单,就是做一个窗口尽量让他像我们的命令行. 但是串口还是需要扫描,检查串口.所以我在最下面增加了几个按钮.同时尽量关联快捷键.尽量做到少操作鼠标.经过几天的打磨,思考,现在已经有点样子了.有需要的同学可以移步:

Github: https://github.com/KimAlittleStar/UART_SHELL

程序下载:  https://github.com/KimAlittleStar/UART_SHELL/releases

百度云:  https://pan.baidu.com/s/12Soblpsm5CUIeg1eEZEp1Q           提取码:  hyhn

软件说明:按下回车就是发送消息.方向上键是发送消息的历史记录.有以下几个BUG:  

  1. 按方向下键不能看到下一条历史记录.

  2. 现在暂时不能发送 带有\n 的字符串,也不能发送 HEX

  3. 如果光标在字符中间的时候按下了回车,那么接收到的消息是会从光标处开始插入

 

发送字符给单片机的时候,是发送最后一行的字符.文本太长会自动换行显示,但是仍然是一行.

以上的bug我还在修,因为现在是在实习工作,可能修bug 的速度会慢一些.Ps:win10/win7 64bit 实测可用.

接下来是里面的一些具体的逻辑想法:

    首先UI界面布局,这个不赘述,需要注意的就是使用*.ui文件的时候注意将你需要用到的对象的名称修改掉,不然你可能过了几天,你就不记得你的变量名那个是哪个了.没错我就经历过.

之后 开启串口.

void Widget::openprot()
{
    if(activePort->isOpen()) //如果串口打开着就关闭
    {
//        activePort->clear();
        activePort->close();
        ui->pushButton_2->setText("打开串口");
        ui->tLine_message->setText("串口"+ui->cBox_Portlist->currentText()+"已关闭");
    }else{ //关闭着就打开
        activePort->setPortName(ui->cBox_Portlist->currentText());
        if(activePort->open(QIODevice::ReadWrite)== true)
        {
            int a = ui->cBox_Baudlist->currentText().toInt();
            activePort->setBaudRate(a,QSerialPort::AllDirections);//设置波特率和读写方向
            activePort->setDataBits(QSerialPort::Data8);      //数据位为8位
            activePort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
            activePort->setParity(QSerialPort::NoParity); //无校验位
            activePort->setStopBits(QSerialPort::OneStop); //一位停止位
            ui->tLine_message->setText(ui->cBox_Portlist->currentText()+"打开成功");
            connect(activePort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));
            ui->pushButton_2->setText("关闭串口");
            ui->tEdit_shell->setFocus();
        }else {
            ui->tLine_message->setText("打开失败,检查串口是否被占用");
            ui->pushButton_2->setText("打开串口");
        }
    }
}

监听按键,如果按键按到了 方向上 下 和enter键那么就执行相应的操作.同时我 也预留了一个 tab 键,为以后自定义关键字,做到字符按提示.

 1 if (static_cast<QKeyEvent *>(event)->key() == Qt::Key_Up) {
 2                 QTextCursor tc =  ui->tEdit_shell->textCursor();
 3 
 4                 if(history.size() == 0) return true;//如果没有历史记录,则不操作
 5 
 6                 if(historyNum != history.size())//如果当前不是第一次按上键,则要删除上一次补全的历史记录
 7                 {
 8                     if(historyNum == 0)
 9                         tc.movePosition(QTextCursor::Left,QTextCursor::KeepAnchor,history[0].length());
10                     else {
11                         tc.movePosition(QTextCursor::L
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇cf1102F. Elongated Matrix(状压d.. 下一篇素数判定

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目