3

嘿,我一直在努力解决这个问题,但我无处可去

我正在尝试从 USB 设备中获取字节,这对于传入的一两条线来说效果很好,但是当它达到相当多的时候它就不起作用了。

我正在使用这行代码来引入数据:

conn.bulkTransfer(epIN, buffer, 57600, 500);

有没有办法一遍又一遍地进行 USB 传输,直到没有更多数据进入?因为传入的数据量可以从 8 字节到几 MB 不等


回复 user387184

像这样的东西可以传输大量数据吗?

while ( conn.bulkTransfer(epIN, buffer, 57600, 500) > 0 ){
    \\do some stuff
}
4

2 回答 2

2

当您在转换器下游尝试与(最终)串行设备通信时,如果协议设计为发送和接收的消息具有终止字符,则非常有用。这可以防止您不得不猜测是否会有更多数据在另外几毫秒内到来。换行是一个很常见的选择。例如:

主持人:你叫什么名字?\n

装置:卡米洛特的加拉哈德爵士。\n

主持人:你最喜欢什么颜色?\n

设备:蓝色\n否,黄色\n

鉴于设备在“Blue”之后用 \n 终止了响应,主机不会期望看到第二个澄清答案。通常情况下,如果设备以这种方式“违反规则”,主机不会读取“不,黄色”,直到它寻找下一个问题的答案,此时它可能会拒绝它,因为它不可信响应,并向设备发出复位命令。(一些协议有一个“在回复之前重复问题”方案,以防止这种混淆)

除了使用终止字符之外,当然还有另外两种众所周知的可能性:一种是非常缩写的代码 - 单个字符或可能无法打印的二进制 - 具有预期的长度响应(可能因代码的开头而异)。另一个是包结构的方式——一个可识别的报头,一个长度字段,然后是数据。

但主要的一点是,“等等看是否还有更多”协议主要用于两个人之间或一个人和一个自动化系统之间。当自动化系统相互交谈时,它们倾向于使用一种协议,该协议定义了您如何知道是否还会有更多。 如果您的最终下游端点设备固件的创建者了解他们的业务,那么对于您何时应该或不应该期待更多数据,将会有明显的规则。

于 2012-06-07T15:42:00.183 回答
1

如果您的 USB 连接在没有更多数据的情况下确实停止接收数据,那么您需要做的就是在您的语句周围放置一段时间 receivedBufferIsNotEmpty,因为:

lenOfReceivedBuffer = conn.bulkTransfer(epIN, buffer, 57600, 500);

0 in lenOfReceivedBuffer如果使用 500 毫秒超时在端口上找不到更多数据,则获取。

如果您的发送端太慢,您也可以稍微增加超时。

于 2012-06-07T13:21:33.227 回答