gir*_*946 6 python serial-port pyserial crystal-lang
我想使用Crystal lang访问串口.
我在python中有以下代码.我想为宠物项目编写等效的Crystal-lang代码.
import serial
def readSerData():
s = ser.readline()
if s:
print(s)
result = something(s) #do other stuff
return result
if __name__ == '__main__':
ser = serial.Serial("/dev/ttyUSB0", 9600)
while True:
data = readSerData()
#do something with data
Run Code Online (Sandbox Code Playgroud)
我找不到任何用于访问串行端口的库.
在crystal-lang中访问串口的正确方法是什么?
提前致谢.
在多个部分中回答这个问题更容易,真正涵盖所有问题:
问:如何访问linux/bsd上的串口?
答:将其作为文件打开.在linux/bsd上,一旦设备插入就建立了串行连接,然后将其列在某些地方/dev/(这些天,通常为/ dev/ttyUSB0).要访问此连接,只需像常规文件一样打开它.有时这实际上足以开始与设备通信,因为现代硬件通常适用于所有波特率和默认标志.
问:如何在linux/bsd上配置serial/tty设备?
答:在文件上设置termios标志.如果您确实需要配置连接以设置波特率,IXON/IXOFF等,则可以在使用stty运行程序之前执行此操作(如果可用).例如.设置你可以运行的波特率:stty -F /dev/ttyUSB0 9600.设置完成后,您只需将其作为文件打开并开始使用即可.
如果您想要一种从应用程序配置设备的简单方法,您可以stty使用水晶生成Process.run.我可能会在下一个解决方案中推荐这种方法..
问:如何在不使用stty的情况下从crystal设置termios标志?
答:直接使用termios posix函数.
Crystal实际上为FileDescriptor句柄提供了一些常见的termios设置,例如cooked,这意味着它已经具有最小的termios绑定.我们可以从使用现有代码开始我们的灵感:
require "termios" # See above link for contents
#Open the file
serial_file = File.open("/dev/ttyACM0")
raise "Oh no, not a TTY" unless serial_file.tty?
# Fetch the unix FD. It's just a number.
fd = serial_file.fd
# Fetch the file's existing TTY flags
raise "Can't access TTY?" unless LibC.tcgetattr(fd, out mode) == 0
# `mode` now contains a termios struct. Let's enable, umm.. ISTRIP and IXON
mode.c_iflag |= (Termios::InputMode::ISTRIP | Termios::InputMode::IXON).value
# Let's turn off IXOFF too.
mode.c_iflag &= ~Termios::InputMode::IXOFF.value
# Unfun discovery: Termios doesn't have cfset[io]speed available
# Let's add them so changing baud isn't so difficult.
lib LibC
fun cfsetispeed(termios_p : Termios*, speed : SpeedT) : Int
fun cfsetospeed(termios_p : Termios*, speed : SpeedT) : Int
end
# Use the above funcs to set the ispeed and ospeed to your nominated baud rate.
LibC.cfsetispeed(pointerof(mode), Termios::BaudRate::B9600)
LibC.cfsetospeed(pointerof(mode), Termios::BaudRate::B9600)
# Write your changes to the FD.
LibC.tcsetattr(fd, Termios::LineControl::TCSANOW, pointerof(mode))
# Done! Your serial_file handle is ready to use.
Run Code Online (Sandbox Code Playgroud)
要设置任何其他标志,请参阅termios手册,或我刚刚找到的这个漂亮的串行指南.
问:有没有图书馆能为我做这一切?
答:没有:(.不是我能看到的,但是如果有人成功的话会很棒的.如果他们有既得利益,那么制作一个人可能没多大工作:)