FPGA:uart原理+tx发送模块+rx接收模块

文章目录

  • 一、串口通信
  • 二、UART通信
  • 三、tx发送模块
  • 四、rx模块接收

一、串口通信

处理器与外部设备通信的两种方式:
串行通信: 指数据的各个位使用多条数据线同时进行传输。
并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。
在这里插入图片描述

串行通信的通信方式:
同步通信: 带时钟同步信号的数据传输,发送方和接收方在同一时钟控制下,同步传输数据。
异步通信: 不带时钟同步信号的数据传输,发送方和接收方使用各自的时钟控制数据的发送和接收过程。在这里插入图片描述

串行通信的传输方向:
单工: 数据只能沿一个方向进行传输。
半双工: 数据传输可以沿两个方向,但需要分时进行。
全双工: 数据可以同时进行双向传输。
在这里插入图片描述

常见的串行通信接口:
在这里插入图片描述

二、UART通信

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。 它在发送数据时将并行数据转换为串行的数据来传输,在接收数据时将接收到的串行数据转换成并行数据。UART串口通信需要两根信号线来实现,一根用于发送,另一个用于接收。
在这里插入图片描述

协议层:
数据格式,1帧数据由4部分组成。

  • 起始位(1bit)
  • 数据位(6/7/8bit)
  • 奇偶校验位(1bit)
  • 停止位(1bit/1.5bit/2bit)
    在这里插入图片描述

奇校验:原始码流+校验位 总共有奇数个1
偶校验:原始码流+校验位 总共有偶数个1

传输速率:
串口通信速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bit/s(位/秒),简称bps;常用的波特率有9600,115200等。

物理层:
串口电平标准:

  • TTL电平的串口(3.3V)
  • RS232电平的串口(+5V ~ +12V为低电平,-12V ~ -5V为高电平)

三、tx发送模块

tx发送模块:共四个状态,IDLE状态,START状态,DATA状态,FINISH状态。

/** @Description: tx输出,波特率115200,系统时钟50M,传输1bit所需计数434个周期* @Author: Fu Yu* @Date: 2023-08-15 11:10:41* @LastEditTime: 2023-08-15 14:55:04* @LastEditors: Fu Yu*/module uart_tx (input           wire                clk         ,input           wire                rst_n       ,input           wire [7:0]          tx_din      ,input           wire                tx_din_vld  ,output          wire                tx_dout     ,output          wire                ready           
);parameter MAX_BIT = 50_000_000/115200;//1bit计数最大值,434localparam  IDLE   = 4'b0001,START  = 4'b0010,DATA   = 4'b0100,FINISH = 4'b1000;reg [3:0]   state_c;//现态
reg [3:0]   state_n;//次态wire        idle_start  ;// IDLE -> START
wire        start_data  ;// START -> DATA
wire        data_finish ;// DATA -> FINISH
wire        finish_idle ;// FINFISH -> IDLEreg			[8:0]	cnt_bit	   	;
wire				add_cnt_bit	;
wire				end_cnt_bit	;reg			[11:0]	cnt_data	   	;
wire				add_cnt_data	;
wire				end_cnt_data	;reg [7:0]   tx_din_r;
reg         tx_dout_r;//****************************************************************
//--                状态机
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate_c <= IDLE;endelse beginstate_c <= state_n;end
endalways @( *) begincase (state_c)IDLE : beginif(idle_start) beginstate_n = START;endelse beginstate_n = state_c;endendSTART : beginif(start_data) beginstate_n = DATA;endelse beginstate_n = state_c;endendDATA : beginif(data_finish) beginstate_n = FINISH;endelse beginstate_n = state_c;endendFINISH : beginif(finish_idle) beginstate_n = IDLE;endelse beginstate_n = state_c;endenddefault : state_n = IDLE;endcase
endassign idle_start  = state_c == IDLE && tx_din_vld ;
assign start_data  = state_c == START &&  end_cnt_bit;
assign data_finish = state_c == DATA &&  end_cnt_data;
assign finish_idle = state_c == FINISH && end_cnt_bit;//****************************************************************
//--                    计数器
//****************************************************************
//1bit计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit <= 'd0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit <= 'd0;endelse begin cnt_bit <= cnt_bit + 1'b1;end end
end assign add_cnt_bit = state_c == START || state_c == FINISH || state_c == DATA;
assign end_cnt_bit = add_cnt_bit && cnt_bit == MAX_BIT - 1;//8bit计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_data <= 'd0;end else if(add_cnt_data)begin if(end_cnt_data)begin cnt_data <= 'd0;endelse begin cnt_data <= cnt_data + 1'b1;end end
end assign add_cnt_data = state_c == DATA && end_cnt_bit;
assign end_cnt_data = add_cnt_data && cnt_data == 8 - 1 ;//****************************************************************
//--                输入数据寄存
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_din_r <= 0;endelse begintx_din_r <= tx_din;end
end//****************************************************************
//--            实现串口时序
//****************************************************************
always @( *) begincase (state_c)IDLE : begintx_dout_r = 1;endSTART : begintx_dout_r = 0;endDATA : beginif(tx_din_r[cnt_data]) begintx_dout_r = 1;endelse begintx_dout_r = 0;endendFINISH : begintx_dout_r = 1;enddefault : tx_dout_r = 1;endcase
endassign tx_dout = tx_dout_r;assign ready = state_c == IDLE;endmodule //uart_tx

测试文件:

/** @Description: uart_tx仿真模块* @Author: Fu Yu* @Date: 2023-08-15 14:58:32* @LastEditTime: 2023-08-15 15:06:49* @LastEditors: Fu Yu*/`timescale 1ns/1nsmodule tb_uart_tx();//激励信号定义 reg				tb_clk  	;reg				tb_rst_n	;reg		[7:0]   tb_tx_din	;reg             tb_tx_din_vld;//输出信号定义	 wire			tx_dout	;wire			ready    ;//时钟周期参数定义	parameter		CLOCK_CYCLE = 20;   defparam  u_uart_tx.MAX_BIT = 10;
//模块例化
uart_tx u_uart_tx(/*input           wire       */  .       clk       (tb_clk)  ,/*input           wire       */  .       rst_n     (tb_rst_n)  ,/*input           wire [7:0] */  .       tx_din    (tb_tx_din) ,/*input           wire       */  .       tx_din_vld(tb_tx_din_vld) ,/*output          wire       */  .       tx_dout   (tx_dout)  ,/*output          wire       */  .       ready     (ready)      
);//产生时钟initial 		tb_clk = 1'b0;always #(CLOCK_CYCLE/2) tb_clk = ~tb_clk;//产生激励initial  begin tb_rst_n = 1'b1;tb_tx_din = 0;tb_tx_din_vld = 0;#(CLOCK_CYCLE*2);tb_rst_n = 1'b0;#(CLOCK_CYCLE*20);tb_rst_n = 1'b1;repeat(10) begintb_tx_din_vld = 1;tb_tx_din = {$random};#20;tb_tx_din_vld = 0;wait(ready == 1);#20;end#1000;$stop;endendmodule 

仿真波形图:
在这里插入图片描述
上板验证:
加入按键控制模块,每一次按下,输出8’hAB

按键消抖模块:

/** @Description: 按键消抖,使用延迟方法,消抖后输出高电平信号* @Author: Fu Yu* @Date: 2023-08-07 14:22:56* @LastEditTime: 2023-08-07 14:48:48* @LastEditors: Fu Yu*/module key_filter #(parameter WITDH = 3//WITDH表示位宽
)(input       wire                clk         ,input       wire                rst_n       ,input       wire [WITDH-1:0]    key_in      ,output      wire [WITDH-1:0]    key_down
);parameter MAX_20MA = 20'd999_999;//20msreg [WITDH - 1:0]   key_r0;//同步信号
reg [WITDH - 1:0]   key_r1;//打拍
reg [WITDH - 1:0]   key_r2;
reg [WITDH - 1:0]   key_down_r;
reg [19:0]          cnt_20ms;
reg                 flag;//开始计数信号wire [WITDH - 1:0]  nedge;//下降沿
wire add_cnt_20ms;
wire end_cnt_20ms;//****************************************************************
//--同步,打拍
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_r0 <= {WITDH{1'b1}};key_r1 <= {WITDH{1'b1}};key_r2 <= {WITDH{1'b1}};endelse beginkey_r0 <= key_in;key_r1 <= key_r0;key_r2 <= key_r1;end
end//下降沿检测
assign nedge = ~key_r1 & key_r2;//****************************************************************
//--flag
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginflag <= 1'b0;endelse if(nedge) begin//检测到下降沿开始计数flag <= 1'b1;endelse if(end_cnt_20ms) begin//20ms后停止计数flag <= 1'b0;endelse beginflag <= flag;end
end//****************************************************************
//--20ms计数器
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_20ms <= 20'd0;end else if(add_cnt_20ms)begin if(end_cnt_20ms)begin cnt_20ms <= 20'd0;endelse begin cnt_20ms <= cnt_20ms + 1'b1;end end
end assign add_cnt_20ms = flag;
assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == MAX_20MA;//****************************************************************
//--key_down
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_down_r <= {WITDH{1'b0}};endelse if(end_cnt_20ms) beginkey_down_r <= ~key_r2;endelse beginkey_down_r <= {WITDH{1'b0}};end
endassign key_down = key_down_r;endmodule //key_filter

顶层模块:

module top (input           wire            clk         ,input           wire            rst_n       ,input           wire            key_in      ,output          wire            tx
);wire        key_wire;
wire        ready;key_filter #(.WITDH(1)) u_key_filter(/* input       wire            */.   clk     (clk)    ,/* input       wire            */.   rst_n   (rst_n)    ,/* input       wire [WITDH-1:0]*/.   key_in  (key_in)    ,/* output      wire [WITDH-1:0]*/.   key_down(key_wire)
);uart_tx u_uart_tx(/*input           wire       */  .       clk       (clk)  ,/*input           wire       */  .       rst_n     (rst_n)  ,/*input           wire [7:0] */  .       tx_din    (8'hab)  ,/*input           wire       */  .       tx_din_vld(key_wire && ready)  ,/*output          wire       */  .       tx_dout   (tx)  ,/*output          wire       */  .       ready     (ready)      
);endmodule //top

效果展示:
在这里插入图片描述

四、rx模块接收

/** @Description: rx接收,波特率115200,系统时钟50M,传输1bit所需计数434个周期* @Author: Fu Yu* @Date: 2023-08-15 11:10:41* @LastEditTime: 2023-08-16 10:03:27* @LastEditors: Fu Yu*/module uart_rx (input           wire                clk         ,input           wire                rst_n       ,input           wire                rx_din       ,output          wire [7:0]          rx_dout      ,output          wire                rx_dout_vld  ,output          wire                ready           
);parameter MAX_BIT = 50_000_000/115200;//1bit计数最大值,434localparam  IDLE   = 4'b0001,START  = 4'b0010,DATA   = 4'b0100,FINISH = 4'b1000;reg [3:0]   state_c;//现态
reg [3:0]   state_n;//次态wire        idle_start  ;// IDLE -> START
wire        start_data  ;// START -> DATA
wire        data_finish ;// DATA -> FINISH
wire        finish_idle ;// FINFISH -> IDLEreg			[8:0]	cnt_bit	   	;
wire				add_cnt_bit	;
wire				end_cnt_bit	;reg			[11:0]	cnt_data	   	;
wire				add_cnt_data	;
wire				end_cnt_data	;reg     [7:0]       rx_dout_r;//****************************************************************
//--                状态机
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate_c <= IDLE;endelse beginstate_c <= state_n;end
endalways @( *) begincase (state_c)IDLE : beginif(idle_start) beginstate_n = START;endelse beginstate_n = state_c;endendSTART : beginif(start_data) beginstate_n = DATA;endelse beginstate_n = state_c;endendDATA : beginif(data_finish) beginstate_n = FINISH;endelse beginstate_n = state_c;endendFINISH : beginif(finish_idle) beginstate_n = IDLE;endelse beginstate_n = state_c;endenddefault : state_n = IDLE;endcase
endassign idle_start  = state_c == IDLE && rx_din == 0 ;
assign start_data  = state_c == START &&  end_cnt_bit;
assign data_finish = state_c == DATA &&  end_cnt_data;
assign finish_idle = state_c == FINISH && end_cnt_bit;//****************************************************************
//--                    计数器
//****************************************************************
//1bit计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit <= 'd0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit <= 'd0;endelse begin cnt_bit <= cnt_bit + 1'b1;end end
end assign add_cnt_bit = state_c == START || state_c == FINISH || state_c == DATA;
assign end_cnt_bit = add_cnt_bit && cnt_bit == MAX_BIT - 1;//8bit计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_data <= 'd0;end else if(add_cnt_data)begin if(end_cnt_data)begin cnt_data <= 'd0;endelse begin cnt_data <= cnt_data + 1'b1;end end
end assign add_cnt_data = state_c == DATA && end_cnt_bit;
assign end_cnt_data = add_cnt_data && cnt_data == 8 - 1 ;//****************************************************************
//--            实现数据接收
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginrx_dout_r <= 0;endelse if(state_c == DATA && cnt_bit == MAX_BIT >> 1) beginrx_dout_r[cnt_data] <= rx_din;end
endassign rx_dout = rx_dout_r;assign rx_dout_vld = data_finish;assign ready = state_c == IDLE;endmodule //uart_rx

ip核fifo调用:

module ctrl (input           wire            clk                 ,input           wire            rst_n               ,input           wire [7:0]      rx_data             ,input           wire            rx_data_vld         ,input           wire            tx_ready            ,output          wire [7:0]      tx_data             ,output          wire            tx_data_vld     
);wire  fifo_rd_empty;
wire  fifo_wr_full;fifo	fifo_inst (.aclr ( ~rst_n ),.data ( rx_data ),.wrclk ( clk ),.wrreq ( rx_data_vld && ~fifo_wr_full ),.q ( tx_data ),.rdclk ( clk ),.rdreq ( tx_ready && ~fifo_rd_empty ),.rdempty ( fifo_rd_empty ),.wrfull ( fifo_wr_full ));assign tx_data_vld = tx_ready && ~fifo_rd_empty ;endmodule //ctrl

顶层模块:

module top (input           wire            clk         ,input           wire            rst_n       ,input           wire            key_in      ,input           wire            rx          ,output          wire            tx
);wire        key_wire;
wire        tx_ready;
wire [7:0]  rx_data;
wire        rx_data_vld;
wire [7:0]  tx_data;
wire        tx_data_vld;key_filter #(.WITDH(1)) u_key_filter(/* input       wire            */.   clk     (clk)    ,/* input       wire            */.   rst_n   (rst_n)    ,/* input       wire [WITDH-1:0]*/.   key_in  (key_in)    ,/* output      wire [WITDH-1:0]*/.   key_down(key_wire)
);uart_tx u_uart_tx(/*input           wire       */  .       clk       (clk)  ,/*input           wire       */  .       rst_n     (rst_n)  ,/*input           wire [7:0] */  .       tx_din    (tx_data)  ,/*input           wire       */  .       tx_din_vld(tx_data_vld)  ,/*output          wire       */  .       tx_dout   (tx)  ,/*output          wire       */  .       ready     (tx_ready)      
);uart_rx u_uart_rx(/* input           wire       */.         clk        (clk ) ,/* input           wire       */.         rst_n      (rst_n ) ,/* input           wire       */.         rx_din     (rx )  ,/* output          wire [7:0] */.         rx_dout    (rx_data)  ,/* output          wire       */.         rx_dout_vld(rx_data_vld)  ,/* output          wire       */.         ready      ()     
);ctrl  u_ctrl(/* input           wire         */ .   clk        (clk) ,/* input           wire         */ .   rst_n      (rst_n) ,/* input           wire [7:0]   */ .   rx_data    (rx_data) ,/* input           wire         */ .   rx_data_vld(rx_data_vld) ,/* input           wire         */ .   tx_ready   (tx_ready) ,/* output          wire [7:0]   */ .   tx_data    (tx_data) ,/* output          wire         */ .   tx_data_vld(tx_data_vld)
);endmodule //top

将rx接收模块与tx发送模块联合使用,效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/98082.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

sql server安装报错 合成活动模板库(ATL) 失败

错误 “合成活动模板库(ATL) 规则失败“ 解决办法&#xff1a; 进入SQL Server 2008R2安装包目录找到文件&#xff1a;sqlsupport_msi&#xff0c;安装此文件之后&#xff0c;再安装SQL Server&#xff0c;便可解决该问题。C:\SQL Server 2008R2\new\SQL Server 2008R2\2052_CH…

Java虚拟机(JVM):虚拟机栈溢出

一、概念 Java虚拟机栈溢出&#xff08;Java Virtual Machine Stack Overflow&#xff09;是指在Java程序中&#xff0c;当线程调用的方法层级过深&#xff0c;导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的&#xff0c;用于存储方法的调用和局部变量的内存空间。每当…

如何学习专业的学术用语01

问题的提出——凭啥人家写的词汇这么专业 做法一 做法二&#xff1a;做一个专业数据库 专门做教育技术类的

Android Ble蓝牙App(六)请求MTU与显示设备信息

前言 在上一篇文章中已经了解了数据操作的方式&#xff0c;而数据交互的字节长度取决于我们手机与蓝牙设备的最大支持长度。 目录 Ble蓝牙App&#xff08;一&#xff09;扫描Ble蓝牙App&#xff08;二&#xff09;连接与发现服务Ble蓝牙App&#xff08;三&#xff09;特性和属…

unity 之 Vector 数据类型

文章目录 Vector 1Vector 2Vector 3Vector 4 Vector 1 在Unity中&#xff0c;Vector1 并不是一个常见的向量类型。 如果您需要表示标量&#xff08;单个值&#xff09;或者只需要一维的数据&#xff0c;通常会直接使用浮点数&#xff08;float&#xff09;或整数&#xff08;in…

Linux命令200例:tail用来显示文件的末尾内容(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

【ARM】Day4 点亮LED灯

1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1&#xff0c;LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …

【深入探究人工智能】:常见机器学习算法总结

文章目录 1、前言1.1 机器学习算法的两步骤1.2 机器学习算法分类 2、逻辑回归算法2.1 逻辑函数2.2 逻辑回归可以用于多类分类2.3 逻辑回归中的系数 3、线性回归算法3.1 线性回归的假设3.2 确定线性回归模型的拟合优度3.3线性回归中的异常值处理 4、支持向量机&#xff08;SVM&a…

〔012〕Stable Diffusion 之 中文提示词自动翻译插件 篇

✨ 目录 🎈 翻译插件🎈 下载谷歌翻译🎈 谷歌翻译使用方法🎈 谷歌翻译使用效果🎈 翻译插件 在插件列表中搜索 Prompt Translator可以看到有2个插件选项:一个是基于谷歌翻译 〔推荐〕、一个基于百度和deepl翻译推荐使用谷歌翻译,因为是离线翻译,所以使用时不用在乎是…

Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】

Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 一、分布式系统遇到的问题1、服务挂掉的一些原因 二、解决方案三、Sentinel&#xff1a;分布式系统的流量防卫兵1、Sentinel是什么2、Sentinel和Hystrix对比3、Sentinel快速开发4、通过注解的方式来控流5、启动Sen…

vue3 基础知识

vue3创建一个项目 PS D:\code> npm init vuelatestVue.js - The Progressive JavaScript Framework√ Add TypeScript? ... No / Yes √ Add JSX Support? ... No / Yes √ Add Vue Router for Single Page Application development? ... No / Yes √ Add Pinia for sta…

电商项目part04 微服务拆分

微服务架构拆分 微服务介绍 英文:https://martinfowler.com/articles/microservices.html 中文:http://blog.cuicc.com/blog/2015/07/22/microservices 微服务拆分时机 如下场景是否需要进行微服务拆分&#xff1f; 代码维护困难&#xff0c;几百人同时开发一个模块&…

小白的Node.js学习笔记大全---不定期更新

Node.js是什么 Node. js 是一个基于 Chrome v8 引擎的服务器端 JavaScript 运行环境Node. js 是一个事件驱动、非阻塞式I/O 的模型&#xff0c;轻量而又高效Node. js 的包管理器 npm 是全球最大的开源库生态系统 特性 单一线程 Node.js 沿用了 JavaScript 单一线程的执行特…

【数据结构】链表的回文结构

文章目录 &#x1f30f;引言&#x1f9ed;[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking)&#x1f6a9;&#x1f6a9;题目描述&#xf…

简单认识Docker数据管理

文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器&#xff0c;再开启数据就会消失&#xff0c;使用数据管理的数据卷挂载&#xff0c;实现了数据的持久化&#xff0c;重启数据还会存在…

分布式websocket解决方案

1、websocket问题由来 websocket基础请自行学习,本文章是解决在分布式环境下websocket通讯问题。 在单体环境下,所有web客户端都是连接到某一个微服务上,这样消息都是到达统一服务端,并且也是由一个服务端进行响应,所以不会出现问题。 但是在分布式环境下,我们很容易发现…

自我管理篇--“90%的简历会被刷掉”这个现象背后的原因

以上简历模板资源的排版可能不是最优&#xff0c;但工作经历可以借鉴 文章目录 一、简历问题出在什么地方二、如何提升简历的质量三、如何避免常见的简历错误四、如何让你的简历脱颖而出五、如何准备面试 为什么90%的简历会被淘汰 在当今竞争激烈的就业市场中&#xff0c;求职者…

JavaScript(JavaEE初阶系列13)

目录 前言&#xff1a; 1.初识JavaScript 2.JavaScript的书写形式 2.1行内式 2.2内嵌式 2.3外部式 2.4注释 2.5输入输出 3.语法 3.1变量的使用 3.2基本数据类型 3.3运算符 3.4条件语句 3.5循环语句 3.6数组 3.7函数 3.8对象 3.8.1 对象的创建 4.案例演示 4…

python采集京东商品详情页面数据,京东API接口,京东h5st签名(2023.08.20)

一、原理与分析 1、目标页面 https://item.jd.com/6515029.html 在chrome中打开&#xff0c;按f12键进入开发者模式&#xff0c;找到商品详情数据接口&#xff0c;如下&#xff1a; 2、URL链接&#xff1a; https://api.m.jd.com/?appidpc-item-soa&functionIdpc_detail…