当前位置: 首页 > news >正文

RK3566 MIPI屏调试记录

文章目录

  • 1. 前言
  • 2. 环境介绍
  • 3. 思路介绍
  • 4. 确认要修改的设备树文件
  • 5. 设备树中修改关键引脚
    • 5.1. 添加dsi0节点
    • 5.2. 修改屏幕背光引脚
    • 5.3. 添加屏幕复位引脚
    • 5.4. 添加屏幕使能引脚
  • 6. 修改屏幕timing参数
  • 7. 修改上下电时序
  • 8. 修改初始化序列和反初始化序列
  • 9. 显示路由配置
  • 10. 最终的设备树文件
  • 11. 调试
  • 12. 总结

1. 前言

最近接触RK3566,同时也是第一次调试MIPI屏,本文主要记录,从拿到RK3566原厂SDK后到点亮MIPI屏的过程。

2. 环境介绍

硬件:野火鲁班猫1开发板(RK3566)、野火5.5寸MIPI屏
软件:原厂RK3566 SDK

3. 思路介绍

本文不仅分享点屏的过程,顺便分享当遇到一个新平台时,又应该做哪些准备?
其实在Linux中,想把一块屏幕点亮(无论是MIPI、RGB、LVDS),无非都是改改设备树,一般是不需要改驱动的。那第一个问题来了,既然要改设备树,那具体改哪个设备树文件?里面的参数怎么去改?改完之后怎么编译及如何验证?这些问题就是去熟悉新平台的SDK时,要做的准备工作。
对于MIPI屏而言,在调试层面上来看,只是比别的接口类型的屏幕多了一些调试参数,如初始化序列、反初始化序列,这部分参数要向屏幕厂商获取。
所以调试思路总结如下:
1、确认要修改的设备树文件;
2、设备树中修改关键引脚(背光脚、复位脚、使能脚);
3、修改屏幕timing时序
4、修改上下电时序
5、修改初始化序列和反初始化序列;
6、显示路由配置

4. 确认要修改的设备树文件

在SDK根目录执行./build.sh lunch选择板级配置时,会列出如下选择:
image.png
各配置单的说明如下表:
image.png
这里我选择的是rockchip_rk3566_evb2_lp4x_v10_defconfig,该配置文件的内容如下:

# <SDK>/device/rockchip/rk3566_rk3568/rockchip_rk3566_evb2_lp4x_v10_defconfigRK_KERNEL_DTS_NAME="rk3566-evb2-lp4x-v10-linux"
RK_PARAMETER="parameter-buildroot-fit.txt"
RK_USE_FIT_IMG=y

可以看到,这里写出了编译时所使用的设备树文件为:rk3566-evb2-lp4x-v10-linux.dts
但是打开这个设备树文件一看,什么东西都没有:
image.png
这个设备树文件应该是RK留出来给用户修改用的,后续MIPI屏的适配,主要都是在这个设备树作修改。其它设备树节点的定义都在*.dtsi中。这个设备树文件最后总共会包含4个*.dtsi,分别是:rk3566-evb2-lp4x-v10.dtsirk3566.dtsirk3568.dtsirk3568-evb.dtsi

5. 设备树中修改关键引脚

5.1. 添加dsi0节点

RK3566有两个MIPI-DSI接口,鲁班猫1开发板上的MIPI接口使用的是MIPI-DSI0,那就复制rk3568-evb.dtsi中的dsi0节点到rk3566-evb2-lp4x-v10-linux.dts中,以备后续的修改。
同时先修改status属性为okay:
image.png

5.2. 修改屏幕背光引脚

背光用的是PWM0_M1,而原厂默认用的是PWM4。
image.png
自行添加backlight节点,修改pwms = <&pwm0 0 50000 0>:
image.png
继续自行添加pwm0节点,使能pwm0并修改pinctrl-0为pwm0m1:
image.png
至此,关于背光部分修改结束。

5.3. 添加屏幕复位引脚

根据原理图可以得出复位引脚为GPIO3_A4:
image.png
原本的dsi0节点没有描述复位引脚,所以这里自行添加复位引脚:
image.png

5.4. 添加屏幕使能引脚

根据原理图可以得出使能引脚为GPIO0_C0:
image.png
原本的dsi0节点没有描述使能引脚,所以这里自行添加使能引脚。但在最后的测试中,屏幕一直点不亮,对比野火已经适配好的设备树发现,这里的enable-gpios并不起作用,同时还需添加power-supply属性,这应该是屏幕电源相关的控制:
image.png
同时在rk3568-evb.dtsi中添加mipi_dsi0_power属性和在pinctrl节点下添加mipi_dsi0_pwr_en引脚:image.png
image.png

6. 修改屏幕timing参数

修改dsi0节点下的屏幕timing参数,这部分参考规格书或直接向屏厂咨询:
image.png

# 分辨率fps = 60
其中clock-frequency = (hactive+hsync+hbp+hfp) * (vactive+vsync+vbp+vfp) * fps

7. 修改上下电时序

MIPI屏的上下电时序通常都在规格书的Power on/off sequence章节中:
image.png

8. 修改初始化序列和反初始化序列

MIPI上下电后需要发送初始化或退出指令才能使之正常工作,我们需要向屏幕厂商获得所谓的初始化序列,如下图只是一部分:
image.png
图中的是初始化代码,不是初始化序列,我们需要将初始化代码转换成初始化序列后填入设备树中。
这些初始化代码可以总结出三个指令:SET_GENERIC、W_D、delay_ms,不同厂商呈现出的代码可能不同,但实际是一个意思。
SET_GENERIC:写命令
W_D:写数据
delay_ms:毫秒延时
了解了代码的基本构成后,如何将这些初始化代码转换成初始化序列呢?
首先初始化序列的格式如下:

命令类型 + 延时数量 + 数据长度 + 数据

转换可以分三个步骤:
1、确认数据的个数;
2、根据数据的个数确定命令类型;
3、确定延时时间;

现在以下图为例将初始化代码转换成初始化序列:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为4;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数超过了两个,所以命令类型为0x39;
3、这里没有延时时间,所以延时时间为0x00
所以最后的初始化序列为:

39 00 04 B9 FF 83 99

再举一个双字节数据的例子:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为2;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数为两个,所以命令类型为0x15;
3、这里没有延时时间,所以延时时间为0x00
所以最后的初始化序列为:

15 00 02 D2 77

再举一个有延时的例子:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为1;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数为1个,所以命令类型为0x05;
3、这里的延时时间为200ms,需要转为16进制,转换后为0xC8;
所以最后的初始化序列为:

05 C8 01 11

了解了转换方法后,将所有初始化代码转换成初始化序列,这个过程需要耐心。最后填到设备树dsi0节点的panel-init-sequence属性中:
image.png
反初始化序列也是如此:
image.png

9. 显示路由配置

Rockchip平台的LCD Controller称为VOP(Video Output Processor),芯片中一般集
成1~2个VOP。只有支持两个VOP的芯片,才能支持双屏异显。RK3566不支持双屏异显。
自行在设备树中添加关于dsi的相关配置:
image.png
route_dsi0:打开logo显示,指定VOP为vp0
video_phy0:使能phy0
dsi0_in_vp0:VOP Rounting,使能vp0
dsi0_in_vp1:VOP Rounting,关闭vp1
同时关闭hdmi的相关配置:
image.png

10. 最终的设备树文件

这里给出最终修改后的设备树文件作参考:

# rk3566-evb2-lp4x-v10-linux.dts// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/** Copyright (c) 2020 Rockchip Electronics Co., Ltd.**/#include "rk3566-evb2-lp4x-v10.dtsi"
#include "rk3568-linux.dtsi"
#include <dt-bindings/display/rockchip_vop.h>&vp0 {cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
};// 电源域配置,和本次调试MIPI屏无关
&pmu_io_domains {status = "okay";pmuio2-supply = <&vcc3v3_pmu>;vccio1-supply = <&vccio_acodec>;vccio3-supply = <&vccio_sd>;vccio4-supply = <&vcc_3v3>;vccio5-supply = <&vcc_3v3>;vccio6-supply = <&vcc_1v8>;vccio7-supply = <&vcc_3v3>;
};// dsi Host
&dsi0 {status = "okay";#address-cells = <1>;#size-cells = <0>;dsi0_panel: panel@0 {compatible = "simple-panel-dsi";reg = <0>;backlight = <&backlight>;reset-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>;power-supply = <&mipi_dsi0_power>;//enable-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;enable-delay-ms = <35>;prepare-delay-ms = <6>;reset-delay-ms = <0>;init-delay-ms = <20>;unprepare-delay-ms = <0>;disable-delay-ms = <20>;size,width = <74>;size,height = <133>;dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;dsi,format = <MIPI_DSI_FMT_RGB888>;dsi,lanes  = <4>;panel-init-sequence = [39 00 04 B9 FF 83 9915 00 02 D2 7739 00 10 B1 02 04 74 94 01 32 33 11 11 AB 4D 56 73 02 0239 00 10 B2 00 80 80 AE 05 07 5A 11 00 00 10 1E 70 03 D415 00 02 36 0239 00 2D B4 00 FF 02 C0 02 C0 00 00 08 00 04 06 00 32 04 0A 08 21 03 01 00 0F B8 8B 02 C0 02 C0 00 00 08 00 04 06 00 32 04 0A 08 01 00 0F B8 0139 05 22 D3 00 00 00 00 00 00 06 00 00 10 04 00 04 00 00 00 00 00 00 00 00 00 00 01 00 05 05 07 00 00 00 05 4039 05 21 D5 18 18 19 19 18 18 21 20 01 00 07 06 05 04 03 02 18 18 18 18 18 18 2F 2F 30 30 31 31 18 18 18 1839 05 21 D6 18 18 19 19 40 40 20 21 06 07 00 01 02 03 04 05 40 40 40 40 40 40 2F 2F 30 30 31 31 40 40 40 4039 00 11 D8 A2 AA 02 A0 A2 A8 02 A0 B0 00 00 00 B0 00 00 0015 00 02 BD 0139 00 11 D8 B0 00 00 00 B0 00 00 00 E2 AA 03 F0 E2 AA 03 F015 00 02 BD 0239 00 09 D8 E2 AA 03 F0 E2 AA 03 F015 00 02 BD 0039 00 03 B6 8D 8D39 05 37 E0 00 0E 19 13 2E 39 48 44 4D 57 5F 66 6C 76 7F 85 8A 95 9A A4 9B AB B0 5C 58 64 77 00 0E 19 13 2E 39 48 44 4D 57 5F 66 6C 76 7F 85 8A 95 9A A4 9B AB B0 5C 58 64 7705 C8 01 1105 C8 01 29];panel-exit-sequence = [05 78 01 2805 00 01 10];disp_timings0: display-timings {native-mode = <&dsi0_timing0>;dsi0_timing0: timing0 {clock-frequency = <126884880>;hactive = <1080>;		//vactive = <1920>;		//hfront-porch = <5>;		//hsync-len = <5>;		//hback-porch = <5>;		//vfront-porch = <2>;		//vsync-len = <2>;		//vback-porch = <2>;		//hsync-active = <0>;vsync-active = <0>;de-active = <0>;pixelclk-active = <0>;};};ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;panel_in_dsi: endpoint {remote-endpoint = <&dsi_out_panel>;};};};};ports {#address-cells = <1>;#size-cells = <0>;port@1 {reg = <1>;dsi_out_panel: endpoint {remote-endpoint = <&panel_in_dsi>;};};};
};// backlight
&backlight {pwms = <&pwm0 0 50000 0>;
};// backlight
&pwm0 {status = "okay";pinctrl-0 = <&pwm0m1_pins>;
};// dsi logo
&route_dsi0 {status = "okay";connect = <&vp0_out_dsi0>;
};// dsi phy
&video_phy0 {status = "okay";
};// dsi VOP Routing
&dsi0_in_vp0 {status = "okay";
};// dsi VOP Routing
&dsi0_in_vp1 {status = "disabled";
};// hdmi logo
&route_hdmi {status = "disabled";
};// hdmi VOP Routing
&hdmi_in_vp0 {status = "disabled";
};// hdmi VOP Routing
&hdmi_in_vp1 {status = "disabled";
};// hdmi Host
&hdmi {status = "disabled";
};

11. 调试

编译设备树:

./build.sh kernel

打包:

./build.sh firware

更新镜像,如果成功的话,在启动过程中会显示RK的logo,最后会启动一个应用程序:
79200a8e-4209-4436-b53a-cdfff1d3daed.jpg

12. 总结

初次接触RK平台和MIPI调试,以上描述存在个人理解,如有错误欢迎指正点评!
参考文章:LKD3568、RK3399 Linux-SDK mipi屏幕驱动及调试

相关文章:

RK3566 MIPI屏调试记录

文章目录 1. 前言2. 环境介绍3. 思路介绍4. 确认要修改的设备树文件5. 设备树中修改关键引脚5.1. 添加dsi0节点5.2. 修改屏幕背光引脚5.3. 添加屏幕复位引脚5.4. 添加屏幕使能引脚 6. 修改屏幕timing参数7. 修改上下电时序8. 修改初始化序列和反初始化序列9. 显示路由配置10. 最…...

爬虫数据模拟真实设备请求头User-Agent生成(fake_useragent:一个超强的Python库)

在Python开发中&#xff0c;处理HTTP请求时经常需要模拟不同的用户代理&#xff08;User-Agent&#xff09;来绕过网站的反爬虫机制或进行兼容性测试。fake_useragent正是这样一个强大的Python库&#xff0c;它能够生成随机且多样化的用户代理字符串&#xff0c;让你的请求看起…...

【教育宝-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

3.达梦数据库基础运维管理

文章目录 前言一、基础数据库管理权限角色管理1.1 DM 系统管理员的类型1.2 角色责则分类 DM 数据库2.1 数据库评估2.2 状态和模式 参考内容 前言 本篇博客为上一篇博客的进阶版&#xff0c;主要针对常规达梦数据库的基本管理上面 一、基础数据库管理 权限角色管理 1.1 DM 系…...

【Linux】【系统纪元】Linux起源与环境安装

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C游记》《进击的C》《Linux迷航》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、Linux的起源1.1 计算机硬件1.2 计算机软件 二、Linux的环境安装2.1 安装方式2.2 安装版本2.3 安装过程2.4 远程…...

Android笔试面试题AI答之Activity(9)

文章目录 1.如何在Application中获取当前Activity实例 &#xff1f;方法一&#xff1a;使用全局变量或单例方法二&#xff1a;使用LocalBroadcastManager或EventBus方法三&#xff1a;通过Fragment方法四&#xff1a;使用Service和Intent注意事项 2.Activity A跳转Activity B&a…...

什么是嵌入式

1、什么是嵌入式 对专用设备的控制&#xff0c;把不需要的功能能够裁剪、删除&#xff0c;适配于专用设备&#xff0c;就叫做嵌入式&#xff08;也叫做嵌入式系统&#xff09; 嵌入式系统定义&#xff1a;用于控制、监视或者辅助机器和设备的运行 一个嵌入式系统由硬件和软件…...

SAM 2:Segment Anything in Images and Videos 论文详解

SAM 2:Segment Anything in Images and Videos 文章目录 SAM 2:Segment Anything in Images and Videos摘要1 Introduction具体分析 2 Related work具体分析&#xff1a; 3 任务&#xff1a;可提示的视觉分割4 模型具体分析具体分析 5 数据5.1 Data engine5.2 SA - V数据集 6 Z…...

PYTHON专题-(10)基操之我要玩并发

什么是并发&#xff1f; 并发指的是两个或多个事件在同一时间间隔内发生。在计算机科学中&#xff0c;并发通常指的是一个程序同时执行多个独立的任务。这些任务可以同时进行&#xff0c;而不会相互干扰或阻塞彼此。并发可以提高程序的执行效率和资源利用率&#xff0c;但也需要…...

双指针实现删除字符串中的所有相邻重复项

class Solution:def removeDuplicates(self, s: str) -> str:res list(s)slow fast 0length len(res)while fast < length:# 如果一样直接换&#xff0c;不一样会把后面的填在slow的位置res[slow] res[fast]# 如果发现和前一个一样&#xff0c;就退一格指针if slow …...

vue(vue2和vue3)项目打包去除console.log

1.Vue2去除 module.exports { configureWebpack: (config) > {// 取消console打印config.optimization.minimizer[0].options.terserOptions.compress.drop_console truereturn {name: "项目名称",resolve: {alias: {"": resolve("src")}}…...

Visual Studio 2022社区版、专业版、企业版功能对比表

https://visualstudio.microsoft.com/zh-hans/vs/compare/...

Codeforces 888 div3 A-G

A. Escalator Conversations 分析 二者身高差为k的倍数且不超过m-1倍&#xff0c;身高差不能为0&#xff08;即不能在同一个阶梯&#xff09; C代码 #include<iostream> using namespace std; void solve(){int n,m,k,H,ans0;cin>>n>>m>>k>>H;…...

IDEA如何去掉编辑框右侧的竖线

打开 IntelliJ Idea 软件 依次找到 File—>Settings—>Editor—>General—>Appearance 去掉勾选 Show hard wrap and visual guides (configured in Code Style options)...

3DCoat v2023 激活版下载与安装教程 (数字雕刻程序)

前言 3DCoat 是一款数字雕塑软件&#xff0c;由乌克兰开发。该软件专注于游戏模型的细节设计&#xff0c;集三维模型实时纹理绘制和细节雕刻功能为一身&#xff0c;可以加速细节设计流程&#xff0c;在更短的时间内创造出更多的内容。 一、下载地址 下载链接&#xff1a;分享…...

【Unity/XLua】xlua自带教程示例分析(一)——打印Hello world

第一步 创建Monobehavior脚本 public class Helloworld : MonoBehaviour {void Start(){} }第二步 在类中或Start函数中创建Lua虚拟机环境 LuaEnv luaenv new LuaEnv();第三步 使用LuaEnv的DoString方法直接运行字符串存储的lua语句&#xff08;字符串前使用可强制不进行转义…...

虚拟机(VMware16)安装rocky9.2详细过程,附镜像下载链接

rocky官方站点 链接: 官方站点 rocky9.2镜像下载路径 链接: Rocky-x86_64-dvd.iso 打开虚拟机&#xff0c;选择新建虚拟机 新建虚拟机 选择典型 由于VMware16没有rocky的版本&#xff0c;所以我们这里选择其他liunx 5.x 内核 64位 因为rocky9默认内核版本就是5开头的&#xf…...

C语言新手小白详细教程(6)函数

希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明为什么要使用函数&#xff1f;1.定义一个函数2.调用函数3.定义函数详解 开篇说明 截止目前&#xff0c;我们已…...

力扣1488.避免洪水泛滥

力扣1488.避免洪水泛滥 贪心 二分 将所有晴天存入集合用哈希表存每次池子上一次下雨的日期当下雨并且池子满了时&#xff0c;二分找到上一次下雨之后最近的晴天 class Solution {unordered_map<int,int> mp;public:vector<int> avoidFlood(vector<int>&a…...

System类、BigDecimal类、Calendar类 用法详解

System类 System 类是Java中的一个核心类&#xff0c;提供了访问与系统相关的一些属性和方法。它包含了一些静态字段和静态方法&#xff0c;用于获取系统的标准输入、标准输出、标准错误流&#xff0c;以及加载动态链接库和系统属性等功能。 常见方法&#xff1a; public stat…...

SQLTools插件下载与使用说明

SQLTools是一个专注于SQL优化与管理的plsql developer插件&#xff0c;目的是把一些常用的SQL收集在一起&#xff0c;方便快速解决问题&#xff0c;提高工作效率。 当在SQL或PACKAGE窗口,或者选中表时&#xff0c;会有两个右键菜单&#xff1a; SQLTools聚焦在SQL方面&#xf…...

【人脸识别】数据集宝藏合集,速看!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 26,090张人脸肤质缺陷采集数据【数据堂】 发布方&#xff1a; 数据堂&#xff08;北京&#xff09;科技股份有限公司 发布时间&#xff1a; 2021 简介&#xff1a; 26,090张人脸…...

mysql操作(进阶)

1.数据库约束 数据库自动对数据的合法性进行校验检查的一系列机制&#xff0c;目的是为了保证数据库中能够避免被插入或者修改一些非法数据。 &#xff08;1&#xff09;mysql中提供了以下的约束&#xff1a; a.NOT NULL&#xff1a;指定某列不能为null b.UNIQUE&#xff1…...

[000-01-025].第07节:WorkBench

我的后端学习大纲 我的Drools学习大纲 8. WorkBench 8.1 WorkBench简介: 1.WorkBench是KIE组件中的元素&#xff0c;也称为KIE-WB&#xff0c;是Drools-WB与JBPM-WB的结合体。它是一个可视化的规则编辑器。WorkBench其实就是一个war包&#xff0c;安装到tomcat中就可以运行。…...

JavaScript - 变量声明(let、const 和其他)

目录 一、引言 1. let 的作用 2. const 的作用 3. let 与 const 的选择 4. let 和 const 的性能 5. var, let, const 的对比 6. 常见误区 二、其他变量定义 1. var 关键字 2. 全局对象属性 3. 使用 IIFE&#xff08;立即调用函数表达式&#xff09; 4. ES6 模块 总结 …...

AC800PEC PC D231 3BHE025541R0101控制模块面价

AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块引脚线 AC800PEC PC D231 3BHE025541R0101控制模块说明书 AC800PEC PC D231 3BHE0…...

2024年3款免费录屏软件,你的电脑桌面上缺哪一个?

现在&#xff0c;不管是上网课、在家工作&#xff0c;还是拍视频&#xff0c;录屏软件都变得越来越重要了。想做个教学视频、录个操作指南&#xff0c;或者录个游戏的高光时刻&#xff0c;好的录屏软件都能帮你轻松搞定。这篇文章就是要聊聊免费录屏软件一般都有啥功能&#xf…...

Python爬虫新手指南及简单实战

网络爬虫是自动化获取网络信息的高效工具&#xff0c;Python因其强大的库支持和简洁的语法成为编写网络爬虫的首选语言。本教程将通过一个具体的案例&#xff08;基于Microsoft Edge浏览器的简单爬取&#xff09;&#xff0c;指导你使用Python实现一个完整的网络爬虫&#xff0…...

如何有效开展产业链招商?

产业链招商是一种以产业大数据为依托、以产业链图谱为基础、以产业链分析为核心、以完善产业链结构为目标的招商引资方式。相比于传统招商模式&#xff0c;产业链招商比拼的并不是土地、政策优惠&#xff0c;而是以产业链分析为核心&#xff0c;诊断区域产业链结构及长短板&…...

爬虫中使用多进程、多线程的混合方式遇到的数据丢失问题

项目场景&#xff1a; 网络爬虫项目&#xff0c;主要实现多进程、多线程方式快速缓存网页资源到MongoDB&#xff0c;并解析网页数据&#xff0c;将信息写入到csv文件中。 问题描述 在单独使用多线程的过程中&#xff0c;是没有问题的&#xff0c;比如这个爬虫示例是爬取豆瓣电…...