我正在参加我大学计算机工程专业的高级设计课程。我对嵌入式系统不太满意。我需要创建一个可以向微控制器发送指令的程序,它应该有一个GUI。其他人正在编程微控制器,所以我只是回应他们将输出给我的东西。我真的不知道从哪里开始,我在最后一个学期有点淹没/不堪重负。有人会介意我指出正确的方向吗?
附加信息:我们正在为设备使用TI-msp430f2274,它实际上只输出3个陀螺仪的读数。我正在考虑使用GTK创建GUI,但我希望看看是否有更好的东西。
编辑:我的项目是一个滚轮对齐工具,使用陀螺仪比较两个滚轮。程序会发送一条指令,将工具“归零”到一个滚轮,并接收一条数据流,说明下一个滚轮的偏移差异。
我们正在使用带有UART接口的TTL-232R电缆,该程序应该适用于Windows。我不知道你怎么跟它说话。大学压垮了我。
答案 0 :(得分:0)
如果您使用的是Windows计算机,那么Visual Studio和Windows窗体应用程序就可以解决问题。我之前使用它通过USB和其他涉及USB人机接口设备读取的项目与温度传感器和其他控制设备连接。因此,在不了解项目细节的情况下,作为IDE Visual Studio,我认为是最好,最直观的,使用Windows API,您可以通过代码实现很多目标。
HTH。
P.S。我使用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的esp可能更有意义。我根本没有任何经验,因此我的VB'ness。 : - )
答案 1 :(得分:0)
既然你之前提到过你曾经使用过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
}
}
}
减去注释和空行只有16行代码。你当然可以更进一步,实现一个更花哨的UI,而不仅仅是文本标签。
如果您需要将数据发送到微控制器,只需puts
即可。请记住覆盖tcl的自动换行终止:
puts -nonewline $rs232 $somedata
如果需要格式化为二进制格式,请使用tcl的binary
命令。
答案 2 :(得分:0)
我个人仍然更喜欢tcl,因为你可以在5分钟内启动并运行原型来读取硬件的输出。但是你也提到了对node.js解决方案的兴趣。所以这是node.js的另一个起点
首先你需要安装node.js.根据您的操作系统,这可能是也可能不是微不足道的。您需要在系统上安装Python 2.x(而不是3.0)才能编译在C中编写的node.js模块(甚至是node.js本身)。即使您正在安装节点的二进制分发版,您仍然需要编译串行端口库,因为它不包含在核心中。
接下来,您需要安装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,节点没有像tcl这样的核心工具包。 npm上有许多库,允许您使用QT或GTK或其他一些小部件集。但是在节点上执行UI的最常见方式是将其作为Web服务器运行并使用Web浏览器连接到它。这样做的缺点是需要额外的复杂性和混乱HTML的需要。好处是HTML& CSS!这意味着您可以利用CSS3效果和jQuery等工具轻松创建一个非常流畅的UI。
不幸的是,编写一个交互式webapp(甚至是一个简单的webapp)是相当复杂的,因此我不会提供一个“简单”的示例实现。我建议您阅读更受欢迎的框架,例如express.js和模板库,例如dust或handlebars。您可能还需要查看socket.io以简化服务器与Web浏览器之间实时通信的实现。