我正在尝试打开Scilab和Arduino之间的串行通信。但是,Arduino始终在/dev/tty**ACM0**
端口中被Linux Ubuntu识别。当我在Scilab中写h=openserial(1,"9600,n,8,1)
时,我知道我要对它说,要在Linux中打开COM1
或/dev/tty**S0**
的串行通信。
但是,例如,如果我使用h=openserial(N,"9600,n,8,1)
,假设为N=port number
,我将始终在Windows中使用COMN,在Linux中使用/dev/tty**S**(N-1)
。
如何通过Scilab for Linux中的/dev/tty**ACM0**
端口打开串行通信?
答案 0 :(得分:2)
查看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
如果您以普通用户身份打开串口时遇到错误,可以将自己添加到正确的组中。基于上面的示例,我的openSUSE发行版上的组名称为dialout
。它可能与您的不同,因此请在以下命令中替换该组名称:
sudo usermod -a -G dialout <USER_NAME>
答案 1 :(得分:0)
只需输入:
h = openserial("/dev/ttyACM0", "9600, n, 8, 1");
你已经完成了。
答案 2 :(得分:0)
保持简单,STRINGS是一个有效的端口选项,所以Luis发布:
“......只需输入:
h = openserial("/dev/ttyACM0", "9600, n, 8, 1");
你完成了......“
例如,在Scilab上将你的arduino用于串口“/ dev / ttyACM0”类型:
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