Как заставить Scilab открыть последовательную связь с USB-портом /dev/ttyACM0 в Linux (Ubuntu)

Я пытаюсь установить последовательную связь между Scilab и Arduino. Тем не менее, Arduino всегда распознается Linux Ubuntu в порту /dev/tty**ACM0**. Когда я пишу h=openserial(1,"9600,n,8,1) в Scilab, я знаю, что говорю ему открыть последовательную связь с COM1 или /dev/tty**S0** в Linux.

Но, например, если я использую h=openserial(N,"9600,n,8,1), предполагая N=port number, у меня всегда будет COMN в Windows и /dev/tty**S**(N-1) в Linux.

Как мне открыть последовательную связь через порт /dev/tty**ACM0** в Scilab для Linux?


person Fabio Silva    schedule 20.03.2013    source источник
comment
Я переписал библиотеку последовательной связи с нуля, чтобы сделать ее сопоставимой с функциями MATLAB, пожалуйста, найдите прототип здесь.   -  person Foad    schedule 22.03.2019


Ответы (3)


Глядя на openserial.sci из Serial Communication Toolbox for Scilab репозиторий,

function h=openserial(p,smode,translation,handshake,xchar,timeout)
//port name
  if ~exists("p","local") then p=1; end
  if type(p)==1 | type(p)==8 then
    if p<=0 then error("port number must be greater than zero"); end
    if getos() == "Windows" then
      port="COM"+string(p)+":"
    else
      port="/dev/ttyS"+string(p-1)
    end
  elseif type(p)==10
     port=p
  else
     error("port to open must be either a number or a string")
  end

Порт всегда установлен на /dev/ttyS<PORT_NUMBER>. Таким образом, в ваших локальных файлах инструментов вы можете попробовать отредактировать следующие строки в openserial.sci примерно так:

function h=openserial(p,smode,translation,handshake,xchar,timeout)
//port name
  if ~exists("p","local") then p=1; end
  if type(p)==1 | type(p)==8 then
    if p<=0 then error("port number must be greater than zero"); end
    if getos() == "Windows" then
      port="COM"+string(p)+":"
    else
      port="/dev/ttyS"+string(p-1)
    end
  elseif type(p)==10
     port=p
  elseif type(p)=="ACM0"
     port="/dev/ttyACM0"
  else
     error("port to open must be either a number or a string")
  end

а затем вызовите openserial следующим образом:

h=openserial("ACM0","9600,n,8,1)

Также убедитесь, что /dev/ttyACM0 является правильным узлом устройства. Это пример вывода из ls -l, который вы можете запустить для подтверждения:

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 188,  0 Mar 12 18:16 /dev/ttyACM0

Если вы получаете сообщение об ошибке при открытии последовательного порта в качестве обычного пользователя, вы можете добавить себя в правильную группу. Исходя из приведенного выше примера, имя группы dialout в моем дистрибутиве openSUSE. У вас оно может отличаться, поэтому замените это имя группы в следующей команде:

sudo usermod -a -G dialout <USER_NAME>
person Tuxdude    schedule 20.03.2013
comment
Tuxdude, я сделал то, что вы предлагаете, и я получаю следующий мессенджер: !--ошибка 999 TCL_EvalStr, в строке 1 не удалось открыть ACM0: нет такого файла или каталога при выполнении open ACM0 r+ вызывается из set porthandle [open ACM0 r+] в строке 17 функции openserial, вызываемой: h=openserial(ACM0,9600,n,8,1) - person Fabio Silva; 21.03.2013
comment
@FabioSilva - Вы уверены, что ваш узел устройства последовательного порта /dev/ttyACM0? - person Tuxdude; 21.03.2013
comment
@FabioSilva - обновил ответ, добавив дополнительную информацию о возможной проблеме с разрешениями в качестве обычного пользователя. Но ваше сообщение об ошибке no such file or directory указывает на то, что узел устройства неверен. - person Tuxdude; 21.03.2013
comment
Даже после всех шагов у меня все еще есть то же сообщение об ошибке. Чтобы решить мою проблему и соответствовать моим потребностям, я теперь использую Octave, и он работает очень хорошо. Я думаю, что это действительно ошибка Scilab или набора инструментов Serial. В любом случае, спасибо за помощь. С уважением. - person Fabio Silva; 27.03.2013
comment
есть идеи, где scilab устанавливает атом? - person Foad; 01.03.2019
comment
Хорошо, в Windows это C:\Users\foobar\AppData\Roaming\Scilab\scilab-6.0.2\atoms\x64\serial\0.4.2\macros. Я смог найти это с помощью команды which. - person Foad; 01.03.2019

Просто введите:

h = openserial("/dev/ttyACM0", "9600, n, 8, 1");

и все готово.

person Luis    schedule 13.10.2014

будьте проще, STRINGS - это допустимый вариант для переноса, поэтому, как пишет Луис:

"...Просто введите:

h = openserial("/dev/ttyACM0", "9600, n, 8, 1");

и ты готов..."

Например, подключите Arduino к последовательному порту типа «/dev/ttyACM0» в Scilab:

n=300 // plot 300 data points from serial port "/dev/ttyACM0"
h=openserial("/dev/ttySACM0","9600,n,8,1")
i=1;
while i<=n
data(i) = strtod(readserial(h)); // char to number
plot(i,data(i),'b-o'); // real time plot
drawnow(); // show data
i=i+1;
end
person Juan Esteban Carrique    schedule 03.12.2014