【问题标题】:Where do I start when creating a microcontroller interfacing program with a GUI?创建带有 GUI 的微控制器接口程序时,我应该从哪里开始?
【发布时间】:2013-09-18 20:32:38
【问题描述】:

我正在上大学计算机工程课程的高级设计课程。我对嵌入式系统不是很好。我需要创建一个可以向微控制器发送指令的程序,它应该有一个 GUI。其他人正在对微控制器进行编程,所以我主要只是响应他们将输出给我的内容。我真的不知道从哪里开始,我在最后一个学期有点不知所措/不知所措。有人介意为我指出正确的方向吗?

附加信息:我们正在为设备使用 TI-msp430f2274,它实际上只是输出 3 个陀螺仪的读数。我正在考虑使用 GTK 来创建 GUI,但我想看看是否有更好的东西。

编辑:我的项目是使用陀螺仪比较两个滚轮的滚轮对齐工具。该程序将向一个滚轮发送一条指令,将工具“归零”,并接收一个数据流,该数据流表示下一个滚轮的偏移差异。

我们使用的是带有 UART 接口的 TTL-232R 电缆,该程序应该可以在 Windows 上运行。我不知道你是怎么跟它说话的。大学把我压垮了。

【问题讨论】:

  • 你在什么操作系统上运行?
  • 您最喜欢哪种语言?我个人会在 tcl 或 node.js 中编写此代码,因为它可以在 tcl 中使用大约两打代码或在 node.js 中使用大约三打代码来完成。
  • 我熟悉 Java 和 C(但不熟悉 C++),我不得不在实习期间使用 TCL 进行一个单独的项目并且讨厌它。我来看看 node.js。

标签: user-interface microcontroller


【解决方案1】:

如果您使用的是 Windows 机器,那么 Visual Studio 和 Windows 窗体应用程序就可以解决问题。我以前用它通过 USB 和其他涉及从 USB 人机接口设备读取的项目与温度传感器和其他控制设备连接。因此,在不了解项目细节的情况下,我认为作为 IDE Visual Studio 是最好的和最直观的,并且使用 Windows API,您可以通过代码实现很多目标。

Visual Studio 2012

HTH。

附言我使用 VS 在 VB 中编写大部分代码,但它也支持其他语言...

编辑:一些从 com 端口读取的示例代码:

Sub ReceiveSerialData()
    ' Receive strings from a com port 
    Dim comport as string = "COM 6" 'or whatever com you want...
    Dim baud as integer = 9600 'or whatever baud you want...

    Try
        com = My.Computer.Ports.OpenSerialPort(comport)
        com.ReadTimeout = 10000
        com.BaudRate = baud

        While (com.IsOpen)
            Dim Incoming As String = com.ReadLine()
            If Incoming Is Nothing Then
                Exit While
            Else
                'do something here with your com data
                'i.e. display it in a rich text box, or whatever...
            End If
        End While

    Catch ex As Exception
        ' display your errors here if you wish....
    End Try
End Sub

我认为其他答案,尤其是关于使用 tcl 的问题,从嵌入式系统的角度来看可能更有意义。我根本没有任何经验,因此我的 VB'ness。 :-)

【讨论】:

  • 我来看看。听起来它会起作用。在 Windows 上编译和运行它使 QT 或 GTK 看起来好像不起作用。你会推荐用VB写吗?我对这一切都很陌生。
  • 在我看来,VB 很容易上手,我为我编写的应用程序选择它的唯一原因只是我当时的心情。例如 C++ 也可以,但我更喜欢 VB 的语法。各有各的。我将使用 VB 中的示例编辑我的答案,以便从 comport 中读取,以便您了解我所做的...
【解决方案2】:

既然你提到你以前使用过 tcl,我在 tcl 中给出我的答案,因为恕我直言,这是最简单的方法,因此是正确工作的正确工具。

tcl 的核心优势(也是它深受粉丝喜爱的原因之一)是它非常非常跨平台。虽然在其他语言中跨平台只是意味着“可以在多个平台上运行”,但仍然需要您根据平台使用不同的 API,但 tcl 消除了平台差异,提供了跨平台的统一 API。

Tcl 将串行端口视为文件,因此您只需open 与它对话。当然,不同的平台提供了不同的端口命名方式。因此,在 Windows 上,您只需执行以下操作即可与串行端口通信:

set rs232 [open COM1 w+]

在 unixen(Linux、MacOSX 等)上你会这样做:

set rs232 [open /dev/ttyS0 w+]

现在可以设置波特率和奇偶校验位

fconfigure $rs232 -mode "9600,n,8,1"

确保还将串口配置为二进制模式,否则 tcl 将根据您的操作系统为您重新解释“\n”:

fconfigure $rs232 -mode "9600,n,8,1" -translation binary -blocking 0

“阻塞”位是将其设置为非阻塞模式,这样我们就可以编写面向事件的代码,这对 UI 应用至关重要,因为我们不希望 IO 阻塞我们的 UI。

那么现在来说一个从串口读取数据的简单程序:

package require Tk ;# in case we're running in tclsh

if {[catch {set rs232 [open COM1 w+] err}]} {
    tk_dialog .error Error "Could not open COM1: $err" error 0 OK
}
fconfigure $rs232 -mode "9600,n,8,1" -translation binary -blocking 0

# Draw a simple UI do dump data to:
pack [label .l -text "Gyroscope outputs:"]
pack [label .g1 -textvariable gyro1]
pack [label .g2 -textvariable gyro2]
pack [label .g3 -textvariable gyro3]

# Now the fun part, read from the serial continuously with fileevent:
set buffer ""
fileevent $rs232 readable {
    append buffer [read $rs232]

    # Here, you need to parse the data returned.
    # Due to the byte-wise nature of serial ports the data read may not be
    # complete so we need to check if it's complete. "Completeness" depends
    # on you. For example the data packet may end with a newline. Or it may
    # simply be a timeout between data packets.

    if {[message_is_complete $buffer]} {
        set gyros [parse_message $buffer]
        set buffer ""

        # Update the UI:
        foreach x $gyros y {gyro1 gyro2 gyro2} {
            set $y $x
        }
    }
}

减去 cmets 和空行,只有 16 行代码。您当然可以更进一步,实现更精美的 UI 而不仅仅是文本标签。

如果您需要向微控制器发送数据,只需 puts 即可。只要记住覆盖 tcl 的自动换行终止:

puts -nonewline $rs232 $somedata

如果您需要格式化为二进制格式,请使用 tcl 的 binary 命令。

【讨论】:

    【解决方案3】:

    我个人仍然更喜欢 tcl,因为您可以在 5 分钟内启动并运行原型以读取硬件的输出。但是您也提到了对 node.js 解决方案的兴趣。所以这里是 node.js 的另一个起点

    首先你需要安装 node.js。根据您的操作系统,这可能会或可能不会微不足道。您需要在系统上安装 Python 2.x(不是 3.0)才能编译用 C 编写的 node.js 模块(甚至是 node.js 本身)。即使您正在安装 node 的二进制分发版,您仍然需要编译串行端口库,因为它不包含在核心中。

    接下来您需要安装serialport 模块。说明因您的操作系统而异。查看模块的 npm 页面:https://npmjs.org/package/serialport

    一旦启动并运行,您就可以使用 serialport 模块简单地与您的串行端口进行通信:

    var SerialPort = require("serialport").SerialPort
    var rs232 = new SerialPort("COM1", {
        baudrate: 57600
    }, false);
    

    同样,与 tcl 案例一样,串行端口的名称取决于您的操作系统。以上是 Windows 的示例。对于 unixen,你会这样做:

    var rs232 = new SerialPort("/dev/ttyS0", {
        baudrate: 57600
    }, false);
    

    对于 UI,node 没有像 tcl 这样的核心工具包。 npm 上有许多可用的库,允许您使用 QT 或 GTK 或其他一些小部件集。但是在 node 上做 UI 最常见的方法是简单地将它作为一个 web 服务器运行并使用你的 web 浏览器连接到它。这样做的缺点是有点额外的复杂性和需要弄乱 HTML。好处是 HTML 和 CSS!这意味着您可以利用 CSS3 效果和 jQuery 等工具轻松创建一个非常流畅的 UI。

    不幸的是,编写一个交互式 web 应用程序(即使是一个简单的)是相当复杂的,所以我不会提供一个“简单”的示例实现。我只建议您阅读更流行的框架,如 express.js 和模板库,如 dusthandlebars。您可能还想查看socket.io,以简化服务器和网络浏览器之间实时通信的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 2020-01-26
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多