GNU Radio Companion 3.10.4.0 (Windows - Radioconda installer)
Arduino Uno
WL101-341 OOK/ASK receiver
PySerial 3.5 + Python 3.11.4
I copied pyserial-3.5.dist-info and serial folders from Python 3.11.4 to
C:\Users\<user>\radioconda\Lib\site-packages
Embedded Python block code
import numpy as np
import serial
from gnuradio import gr
class blk(gr.sync_block): # other base classes are basic_block, decim_block, interp_block
def __init__(self, comPort='COM5', comSpeed=38400.0, timeout=2):
gr.sync_block.__init__(
self,
name='window voltage',
in_sig=None,
out_sig=[np.byte]
)
self.comPort = comPort
self.comSpeed = comSpeed
self.ser = serial.Serial(self.comPort, self.comSpeed)
print(self.ser)
def work(self, input_items, output_items):
d = self.ser.read(64)
i = 0
for b in d:
output_items[0][i] = b
i = i + 1
return len(output_items[0])
Arduino code
#define DATA_PIN 2
#define SERIAL_SPEED 38400
#define DATA_SIZE 64
#define pinOfPin(P)\
(((P)>=0&&(P)<8)?&PIND:(((P)>7&&(P)<14)?&PINB:&PINC))
#define pinIndex(P)((uint8_t)(P>13?P-14:P&7))
#define pinMask(P)((uint8_t)(1<<pinIndex(P)))
#define isHigh(P)((*(pinOfPin(P))& pinMask(P))>0)
#define isLow(P)((*(pinOfPin(P))& pinMask(P))==0)
#define digitalState(P)((uint8_t)isHigh(P))
uint8_t data_1[DATA_SIZE];
uint8_t data_2[DATA_SIZE];
uint8_t buf_num = 1;
volatile uint8_t index = 0;
volatile bool sendData = false;
void setup() {
Serial.begin(SERIAL_SPEED);
pinMode(DATA_PIN, INPUT);
memset(data_1, 0, sizeof(data_1));
memset(data_2, 0, sizeof(data_2));
attachInterrupt(digitalPinToInterrupt(DATA_PIN), isr, CHANGE);
}
void loop() {
if (sendData) {
index = 0;
if (buf_num) {
buf_num = 0;
sendData = false;
Serial.write(data_1, DATA_SIZE);
}
else {
buf_num = 1;
sendData = false;
Serial.write(data_2, DATA_SIZE);
}
}
}
void isr() {
static uint8_t p = 0;
static uint8_t v = 0;
if (!sendData) {
// msbfirst (lsbfirst << n;)
//v |= digitalRead(DATA_PIN) << (7 - p);
v |= digitalState(DATA_PIN) << (7 - p);
p++;
if (p == 8) {
if (buf_num) {
data_1[index] = v;
}
else {
data_2[index] = v;
}
v = 0;
p = 0;
index++;
if (index == DATA_SIZE) {
sendData = true;
}
}
}
}
Kommentit
Tämän blogin kommentit tarkistetaan ennen julkaisua.