【问题标题】:Problems with serial port read/write in MatlabMatlab中串口读/写的问题
【发布时间】:2013-10-30 17:14:13
【问题描述】:

我有一个 Cyber​​Glove 通过串口连接到 Matlab。我正在尝试编写一个请求数据样本的命令,然后将样本读回。

我已经用以下代码成功连接了手套:

s = serial('/dev/ttyS0')
set(s,'BaudRate',115200)
fopen(s)

然后我可以写入/读取以获取二进制或 ascii 格式的传感器信息。

我正在做的二进制:

fwrite(s,'G')
fread(s)

fread 总是超时,然后吐出一个看似随机长度 (1-100+) 的列向量,其中包含无意义的整数。

对于 ASCII,命令是:

fprintf(s,'g')
fscanf(s)

这会给出一个空字符串作为读出值。我知道手套正在获取并且至少在某种程度上处理命令,因为如果我给它一个无效的命令,我会收到错误消息e?

不过,真正让我感到困惑的是:我无意中发现了一种从手套中获得正确读数的方法。

fread(s)(超时并给出看似随机的输出)

fprintf(s,'g')

fscanf(s)

然后我得到字符串输出'g 1 76 93 113 89 42 20 77 98 106 117 81 62 23 52 60 34 68 57 254 92 26',这是正确的。

我的问题是:

(1) 为什么最后一部分会产生正确的响应?

(2) 如何从二进制命令中获取读数?这是我真正想要获得的。

【问题讨论】:

  • 这听起来更像是设备的通信协议问题,而不是 Matlab 问题。
  • 那么,看来我应该用别的东西来测试它,然后呢?有没有我可以使用的简单命令行方法?
  • 好问题...不确定这是否是最好的方法,但我想您可以使用cat /dev/ttyS0 阅读和printf ... > /dev/ttyS0 写作。 printf 是内置的 bash。但我建议的第一件事是检查设备的文档,看看你是否了解所有内容。

标签: matlab serial-port


【解决方案1】:

发现问题: 发生超时是因为它没有像预期的那样返回尽可能多的字节,并且它期望的数字不正确。默认情况下,get(s, 'InputBufferSize') 返回 512,而实际数据为 24 字节。在调用 fopen(s) 之前,我只运行了 set(s, 'InputBufferSize', 24); 并从我期望的二进制读/写中得到了正确的 24 个 8 位整数,没有超时。

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多