Поскольку вы упомянули, что раньше пользовались tcl, я даю свой ответ в tcl, так как IMHO это самый простой способ сделать это, и для этого нужен правильный инструмент для правильной работы.
Основным преимуществом 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 будет повторно интерпретировать " \ п»для вас в зависимости от вашей ОС:
fconfigure $rs232 -mode "9600,n,8,1" -translation binary -blocking 0
„блокирующий“бит, чтобы установить его в режим без блокировки, так что мы можем написать событие ориентированный код, который имеет решающее значение для приложений пользовательского интерфейса, так как мы не хотите, чтобы 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 строк кода. Конечно, вы можете пойти дальше и реализовать более привлекательный интерфейс, а не только текстовые метки.
Если вам нужно отправить данные на микроконтроллер просто puts
. Только не забудьте отменить автоматическое прекращение перевода строки на Tcl: binary
команду
puts -nonewline $rs232 $somedata
Используйте TCL, если вам нужно отформатировать и из двоичного файла.
В какой ОС вы работаете? – slebetman
А на каких языках вам комфортно? Я лично напишу это в tcl или node.js, так как это можно сделать с помощью примерно двух десятков строк кода в tcl или около трех десятков строк в node.js. – slebetman
Я знаком с Java и C (но не с C++), и мне пришлось использовать TCL на моем межсетевом сервере для одного отдельного проекта и ненавидеть его. Я посмотрю на node.js. –