只想在 gnuradio 中创建信号并使用 TCP 协议将其发送到 Arduino Due 和以太网屏蔽 w5100,这将在 DAC0 引脚上生成信号。但是我在三天多的时间里试图解决这个问题。 GRC 项目具有连接到 TCP 接收器块的信号源块(类型 - 字节,频率 - 100Hz,波形 - 正弦波,采样率 32000Hz)。 Arduino 接收信号,但来自引脚 DAC 的信号看起来像方波。怎么了? 第二个问题,如何在 arduino sketch 中将 32 位值转换为 12 位值(如果在 gnuradio 信号源块中选择浮点类型)?
Arduino 草图:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 137, 10);
EthernetServer server(8788);
void setup() {
analogWriteResolution(8); // set DAC resolution to 8 bits
Ethernet.begin(mac, ip);
server.begin();
}
void loop() {
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
byte val = client.read();
analogWrite(DAC0, val); // generate signal on DAC0 pin
}
}
client.stop();
}
}
这个 arduino sketch 似乎更值得怀疑——你不是等待数据可用,而是获取它(如果没有可用的数据包则自旋锁);而不是让定时器定期将值复制到 DAC,您只需尽快写入它们即可。遗憾的是,这行不通,因为数据以数据包的形式到达。当有新数据包时,您的
while()
将有很多字节可以快速写出。数据包一被消费,就没有什么可写的了。
所以,您需要重新构建 Arduino 端:
恐怕我不知道在 Arduino 下如何做到这一点。
第二个问题,如何在 arduino sketch 中将 32 位值转换为 12 位(如果在 gnuradio 信号源块中选择 float 类型)?
通过乘以一个适当的常数,并转换为一个 16 位整数,可能;然后只使用与 DAC 相关的 12 位。但是:你永远不想那样做。在主机上的 GNU Radio 中进行浮点处理,在那里转换为 16 位中的 12 位整数,并通过以太网发送准备好的数据。浪费带宽和计算能力发送 32 位是没有意义的,您只需要 12 位!