<求助> Arduino环境编译ESP32 Dev module
操作系统Win764旗舰版,Arduino版本1.8.19,ESP32开发版本2.0.16(2.0以上一样的提示)提示错误信息如下,求助解决方法,谢谢!
File "esptool.py", line 31, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\__init__.py", line 41, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\cmds.py", line 14, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\bin_image.py", line 14, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "esptool\loader.py", line 30, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "serial\__init__.py", line 29, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "serial\serialwin32.py", line 15, in <module>
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "ctypes\__init__.py", line 7, in <module>
ImportError: DLL load failed while importing _ctypes: ��������
Failed to execute script 'esptool' due to unhandled exception!
exit status 1
为开发板 ESP32 Dev Module 编译时出错 应该是环境没有安装好。
ESP的Python环境不正确,具体的我也不知道,ESP没用过Python编程 卸载Arduino后重新安装试试 bigluo 发表于 2024-7-17 09:09
应该是环境没有安装好。
ESP的Python环境不正确,具体的我也不知道,ESP没用过Python编程
人家没有用Python,Arduino是C++ 更新开发板版本试试,Arduino有个比较奇怪的问题
开发板发布的版本被官方删除后,会导致本地编译环境坏掉
看错误代码 确实可能Python问题
esptool.py 使用了ctypes库,
要不32/64 DLL问题要不32/64 Python问题,二选一 这个错误通常表示Python无法加载一个动态链接库(DLL)
可能的原因包括:
缺少或损坏的Microsoft Visual C++ Redistributable。
系统环境变量配置不正确。
Python安装不完整或损坏。 用了很久 Win732 SP1 旗舰版,一些32位老软件运行的还算稳定
最近发现了这个SDR
https://github.com/Cvarc-Xtal/ESP32-SDR-TRX/tree/main
但需要Arduino-ESP32环境支持,其中,"I2S"需ESP32-2.0以上版本且64位系统上运行
手忙脚乱的安装了 Win764 SP1 旗舰版及Arduino-ESP32环境,结果:lol
因微软已停止对Win7的维护,系统不能更新,所以,这个问题不是个案,还好,问题已解决
(1) https://github.com/streamlink/streamlink/issues/3332
(2) https://answers.microsoft.com/en-us/windows/forum/windows_7-update/how-to-obtain-and-install-windows-7-sp2/c2c7009f-3a10-4199-9c89-48e1e883051e
文件较大,不便上传,有需要的坛友请自行下载更新
校验工具
感谢版主及各位坛友的鼎力帮助! 本帖最后由 JuncoJet 于 2024-7-17 11:47 编辑
mov99 发表于 2024-7-17 11:19
用了很久 Win732 SP1 旗舰版,一些32位老软件运行的还算稳定
最近发现了这个SDR
二次变频机?
知道了收发分开了
xSemaphoreHandle xRXDSP;
xSemaphoreHandle xRXIN;
xSemaphoreHandle xRXOUT;
int * input_buffer_ptr = &input_buffer.re;
void IRAM_ATTR rx_in(void * pvParameters){
size_t readsize = 0;
while (true) {
#ifdef DEBUG_RUN
int rx_time = micros();
#endif
xSemaphoreTake(xRXIN, portMAX_DELAY);//ждем сигнала от dsp-обработчика о готвности премного буфера для приема след.партии отсчетов
#ifdef DEBUG_RUN
if (access_in_wait){rx_in_wait_result = micros()-rx_time;access_in_wait=false;}
rx_time = micros();
#endif
//копирование ранее принятых отсчетов из старшей части рабочего буфера в младшую (50% overlap&save)
for (int i=0;i<NUM_SAMPLE_BUF;i++){
workbuf_in.re = workbuf_tmp.re;
workbuf_in.im = workbuf_tmp.im;
}
//прием след.порции отсчетов и перенос в старшую часть рабочего буфера
if(current_mode==RX_MODE)i2s_read(I2S_NUM_0, &input_buffer, sizeof(input_buffer), &readsize, portMAX_DELAY);
for (int i=0; i<NUM_SAMPLE_BUF; i++) {
workbuf_in.re = workbuf_tmp.re = (float)(input_buffer.re>>12);
workbuf_in.im = workbuf_tmp.im = (float)(input_buffer.im>>12);
fft_in.re = workbuf_tmp.re;//заполняем fft-буфер для панорамы и спектра
fft_in.im = workbuf_tmp.im;
}
fft_for_display((float*)&fft_in);//вычислить магнитуды для спектра и "водопада" для последующего отображения
#ifdef DEBUG_RUN
if (access_in_run){rx_in_run_result = micros()-rx_time;access_in_run=false;}
#endif
if(current_mode==RX_MODE){xSemaphoreGive(xRXDSP);}//разрешаем демодуляцию и фильтрацию рабочего буфера
}
}
void IRAM_ATTR rx_out(void * pvParameters){
size_t readsize = 0;
while(true){
#ifdef DEBUG_RUN
int rx_time = micros();
#endif
xSemaphoreTake(xRXOUT, portMAX_DELAY);//ждем окончания dsp-обработки
#ifdef DEBUG_RUN
if (access_out_wait){rx_out_wait_result = micros()-rx_time;access_out_wait=false;}
rx_time = micros();
#endif
if(!agc)agc_koeff=1.0f;//
for (int i=0; i<NUM_SAMPLE_BUF; i++) { //переносим обработанный массив в выходной буфер с нормализацией в I2S-формат
output_buffer.re = speak_out ? ((int)(workbuf_out.re*agc_koeff))<<12: 0;
output_buffer.im = speak_out ? ((int)(workbuf_out.im*agc_koeff))<<12: 0;
}
xSemaphoreGive(xRXIN);
if(current_mode==RX_MODE)i2s_write(I2S_NUM_0, &output_buffer, sizeof(output_buffer), &readsize, portMAX_DELAY );//вывод звука
#ifdef DEBUG_RUN
if (access_out_run){rx_out_run_result = micros()-rx_time;access_out_run=false;}
#endif
}
}
uint32_t IRAM_ATTR S_metr_ssb(float* input)
{
int bins = bandwidth/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
int bin_start = indent/(I2S_SAMPLE_RATE/NUM_SAMPLE_BUF);
float tmp=0;
float S_metr_buf=0;
float beta=0.99f;
float alpha=(1-beta);
for (int i=bin_start*2;i<(bins+bin_start)*2;i+=2)
{
if (input<0){tmp=-input;}else{tmp=input;}
S_metr_buf=(S_metr_buf*beta)+(alpha*tmp);
}
int32_t level=(int32_t)(2.0f*sqrtf((S_metr_buf/bins)));
if (level<=0)level=0;
if (level>150)level=150;
return level;
}
void IRAM_ATTR get_ssb(int pos,struct COMPLEX* input){//демодуляция SSB в частотной области
switch (rf_mode){
case LSB: //
for (int i=0;i<NUM_FFT_BUF/2;i++) {
input.re = input.re;
input.im = -input.im;
}
break;
case USB: //
for (int i=0;i<NUM_FFT_BUF/2;i++) {
input.re = input.re;
input.im = input.im;
}
break;
}
for (int i=NUM_FFT_BUF/2;i<NUM_FFT_BUF;i++) {//обнуляем отрицательные частоты
input.re = input.im = 0;
}
}
void IRAM_ATTR get_am(struct COMPLEX* input){
for(int i=0;i<NUM_FFT_BUF/2;i++){
input.re = input.im = sqrtf((input.re*input.re) + (input.im*input.im));
input.re = input.im = 0;
}
}
void IRAM_ATTR rx_dsp(void *pvParameters){
while(true){
#ifdef DEBUG_RUN
int rx_time = micros();
#endif
xSemaphoreTake(xRXDSP, portMAX_DELAY);//ждем сигнала о готвности приемного буфера
#ifdef DEBUG_RUN
if (access_dsp_wait){rx_dsp_wait_result = micros()-rx_time;access_dsp_wait=false;}
rx_time = micros();
#endif
init_filters (num_filter);
if(rf_mode!= AM)
{
xtensa_cfft_f32(&cfft,(float*)&workbuf_in,0,1);
get_ssb(pos_fft,(struct COMPLEX*)&workbuf_in);//демодуляция ssb участка спектра в позиции pos_fft
smeter = S_metr_ssb((float*) &workbuf_in);
xtensa_cfft_f32(&cfft,(float*)&workbuf_in,1,1);
}
else
{
get_am((struct COMPLEX*)&workbuf_in);//пока работает не должным образом
}
fir_f32(&fir_rx, (float*)&workbuf_in, (float*)&workbuf_out, NUM_FFT_BUF);//основной фильтр
//разрешаем выводить звук иприем след.партии отсчетов
#ifdef DEBUG_RUN
if (access_dsp_run){rx_dsp_run_result = micros()-rx_time;access_dsp_run=false;}
#endif
if(current_mode == RX_MODE){xSemaphoreGive(xRXOUT);}
if (smeter > old_smeter){old_smeter=smeter;}
if(old_smeter>70)old_smeter=70;
}
}
xSemaphoreHandle xTXDSP;
xSemaphoreHandle xTXIN;
xSemaphoreHandle xTXOUT;
void IRAM_ATTR tx_in(void * pvParameters){
size_t readsize = 0;
while(true){
xSemaphoreTake(xTXIN, portMAX_DELAY);//ждем сигнала об окончании dsp-обработки предыдущего буфера
if(current_mode==TX_MODE)i2s_read(I2S_NUM_0, &input_buffer, sizeof(input_buffer), &readsize, portMAX_DELAY);
for (int i=0; i<NUM_SAMPLE_BUF; i++) { //копируем все принятые отсчеты в рабочий буфер
workbuf_re = (float)(input_buffer.re>>12);
workbuf_im = (float)(input_buffer.im>>12);
}
if(current_mode==TX_MODE)xSemaphoreGive(xTXDSP);//разрешаем dsp-обработку рабочего буфера
}
}
void IRAM_ATTR tx_out(void * pvParameters){
size_t readsize = 0;
while(true){
xSemaphoreTake(xTXOUT, portMAX_DELAY); //ждем сигнала об окончании dsp-обработки выходного буфера
for (int i=0; i<NUM_SAMPLE_BUF; i++) { //переносим обработанный массив в выходной буфер с нормализацией в I2S-формат
output_buffer.re = ((int)(workbuf_re))<<12;
output_buffer.im = ((int)(workbuf_im))<<12;
}
if(current_mode==TX_MODE)i2s_write(I2S_NUM_0, &output_buffer, sizeof(output_buffer), &readsize, portMAX_DELAY );//вывод звука
}
}
void IRAM_ATTR tx_dsp(void *pvParameters){
while(true){
xSemaphoreTake(xTXDSP, portMAX_DELAY);//ждем готовности рабочего буфера
switch(rf_mode){//формируем квадратуры (гилберт+фнч)
case USB:
fir_f32(&fir_90, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert90
fir_f32(&fir_00, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert00
break;
case LSB:
fir_f32(&fir_00, (float*)&workbuf_re, (float*)&workbuf_re, NUM_SAMPLE_BUF);//Hilbert00
fir_f32(&fir_90, (float*)&workbuf_im, (float*)&workbuf_im, NUM_SAMPLE_BUF);//Hilbert90
break;
}
if(current_mode==TX_MODE){
xSemaphoreGive(xTXIN);//разрешаем прием следующей партии отсчетов
xSemaphoreGive(xTXOUT); //разрешаем выводить квадратуры в смеситель
}
}
}
这个编解码写的很清晰
这机器确实不常见
5351输出一路频率信号,然后通过HC74来分成IQ驱动
收发都用独立的复用器做混频器
USDX的做法是5351输出3路信号,IQ驱动和TX本振驱动 本帖最后由 mov99 于 2024-7-17 12:06 编辑
JuncoJet 发表于 2024-7-17 11:49
这个编解码写的很清晰
我不懂C编程,但感觉这位俄罗斯作者写的代码"干净"
有业余爱好者试过,这款SDR用了大屏(4.3吋)显示频谱
不清楚具体原因,美中不足,代码没写完整,距实用还有大量的工作 这个74HC74好高级的样子
JuncoJet 发表于 2024-7-17 15:59
这个74HC74好高级的样子
看来你对SDR也感兴趣,还有一款用RP2040模块做的,电路简洁,据说还不错
https://github.com/dawsonjon/PicoRX mov99 发表于 2024-7-18 16:21
看来你对SDR也感兴趣,还有一款用RP2040模块做的,电路简洁,据说还不错
https://github.com/dawsonjo ...
2040能产生125M PWM,只是移相真不明白
理论上可以直接取缔掉si5351
我画了板子,在论证阶段
RP2040原理图、官方和合宇
http://www.crystalradio.cn/forum.php?mod=viewthread&tid=2143633&fromuid=272612
(出处: 矿石收音机论坛)
页:
[1]
2