【发布时间】:2013-03-02 14:03:15
【问题描述】:
我正在实现一个串行协议,用于从 Arduino 到 Java 的通信(单向)。
我从 Arduino 发送的每一帧都是这样的:
"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
-
G表示帧开始,唯一可能的值是G。 -
Fs 是编码为 HEX 值的有效负载。可能的值:[0-F] -
T是校验和。可能的值:[H-Z]
为了计算校验和,我为 Arduino 和 Java 编写了一个函数。然而,当我在 Java 端接收到这些函数时,我得到了大约 50% 的损坏帧。
我认为问题与 Java 变量不能无符号这一事实有关。你能发现错误吗?或者一个简单的串行连接是否有可能破坏我发送的 50% 的帧? FRAME_LENGTH_WITHOUT_CRC 是 21。
Java 代码:
char checksum(byte[] frame) {
short sum = 0;
for (short i = 0; i < Config.FRAME_LENGTH_WITHOUT_CRC; i++) {
sum += (char)frame[i];
}
return (char) ('H' + sum % 16);
}
Arduino C 代码:
char checksum(const char * str)
{
uint8_t sum = 0;
for (uint8_t i = 0; i < FRAME_LENGTH_WITHOUT_CRC; i++) {
sum += (uint8_t)str[i];
}
return 'H' + sum % 16;
}
【问题讨论】:
-
普通串行连接的可靠性取决于许多工厂,如波特率(速度)、电缆、连接器、电磁杂散场等外部影响......
-
使用 Arduino 上的 FTDI 芯片通过 USB 连接。速度:38400 波特
-
尝试以最低速度测试连接,使用尽可能短的电缆而不使用任何奇怪的适配器。还要检查芯片组是否允许开启某种握手以避免缓冲区溢出。
-
好的,现在我想我知道它可能是什么了。我认为我在所有数据到达之前读取了缓冲区,因此我读取的数据少于我假设已经到达的 21 个字节。我假设在
InputStream中,in.read(array[], offset, size)在返回之前读取了所有size字节,但显然它没有。 -
总是检查系统调用的结果。
标签: java c serial-port arduino checksum