[ruby|arduino] 简单的串口校时脚本

# ruby script to send datetime data by serial port
# author: Weihong Guan (aguegu)
# blog: http://aguegu.net
# date: May 24, 2012

require "serialport"

sp = SerialPort.new("/dev/ttyUSB0", 4800, 8, 1, SerialPort::NONE)
# change "/dev/ttyUSB0" to "COMx" for windows system.

sp.write "" 
# Open serial port, if DTR is connected, arduino would reset.
# Send the data after arduino is ready. Let us say 2 seconds.
t = (Time.now()+2).round()

while Time.now() < t  
end

sp.write t.strftime("[%y %m %d %H %M %S 0%w]")
# sp.write "[12 05 24 10 21 34 04 ]" 
# use this to set customized time, like 2012-05-24 10:21:34 Thursday
# in format "[yy mm dd HH MM SS WD]"

puts t.strftime("[%y %m %d %H %M %S 0%w]")

sp.close


不到10行,一个给 TCA1602S 时钟校时的上位机脚本就写好了。TCA1602S 是在 Arduino 平台上搭建的液晶屏时钟,会接收串口数据,并根据特定的格式进行解码,对自身始终进行设置。而又因为我们读取的是上位机系统的时钟,这就可以实现二者时间的同步,达到一键校时的目的。至于上位机,是 windows 还是 linux,甚至是另外一个单片机系统,时钟主控芯片是 51系列,AVR(Arduino)其实都没有关系。只要有串口,就能通讯上。这个概念,其实和 3d8 是一样的。

同样的程序,之前用 C# 写过,比较起来,确实有点用电线杆吃面条的感觉——大材小用。

用 C# 实现的优点是,是可以获取当前可用串口列表,缺点是制定参数相对麻烦一些,所以实际配合程序还需要再写一个脚本文件来配合,另外修改数据传输格式的时候,就要打开工程文件,借助 VS.Net 编辑、编译。

而用 Ruby 实现的优点嘛,自身就是脚本咯,格式干干净净。因为是解释执行,也不需要编译,各种参数清晰可见,使用文本编辑器随时改就好。开源起来也没啥顾虑,因为太简单了。另外,Ruby 也是跨平台的语言,也就是说,这个脚本,在 windows 系统上也是可以执行的,基本只需要改变串口的名称就好。而 C# 的程序,想到 linux 上运行,尤其是这种直接操作底层硬件的程序,相信就没那么简单。

而且,这是我第一个在纯 vim 的环境下写的脚本哦,学 vim 也就是一招,多用多写。

PS. 这个脚本使用到了 serialport gem,并参考了 ruby-core 中的 Time 类。

关于aGuegu

阿古 真名:官微宏,技术Geek,玩Arduino,玩Linux,爱Google,爱开源;现居福州
此条目发表在Arduino, Ruby, 时钟分类目录,贴了, , , 标签。将固定链接加入收藏夹。