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

哪家网站建设公司好谷歌浏览器下载视频

哪家网站建设公司好,谷歌浏览器下载视频,高端企业网站报价,专业手机网站建设哪家好1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播 对讲 电话】 不是有两根线就是全双工#xff0c;而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本#xff1a;判断是否有时钟信号#xff08;时钟线#xff09;。…1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播  对讲 电话】 不是有两根线就是全双工而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本判断是否有时钟信号时钟线。如果有时钟线则是同步通信如果没有时钟线则是异步通信。 4.波特率  VS  比特率 5.常见的串行通信接口 2.串口RS-232 1.什么是串口 实际上就是按位来对数据进行发送和接收。 2.RS232电平和CMOS/TTL电平对比 3.设备间的RS232通信示意图 MAX323将RS232电平---》TTL/CMOS电平 DB9接口就是COM接口 4.STM32串口与电脑USB口通信示意图 USB/串口转换电路CH340CUSB电平---》TTL/CMOS电平 5.RS232异步通信协议 注意异步通信协议中是没有使用到时钟线SCLK 1.通讯的起始和停止信号 串口通讯的一个数据包从起始信号开始直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示只要双方约定一致即可。 2.数据校验 3.STM32USART 1.STM32USART简介 USART虽然是同步和异步都可以进行使用但是我们大多数情况下使用的都是异步通信。 2.STM32USART主要特征 3.在选型手册中查看USART/UART对应的引脚定义 4.STM32F1的USART框图 1.引脚说明 2.接收/发送数据的存放/处理位置 数据要先放在DR寄存器中然后再通过DR寄存器操作CPU 3.波特率的处理 5.框图简化版 4.设置USART/UART波特率 1.计算公式 baud波特率是用户自己定义的然后求出USARTDIV然后分为整数部分和小数部分在存储到USART_BRR寄存器 2.波特比率寄存器BRR 3.举个例子 4.公式推导 因为小数部分和整数部分都要往左移动4位所以将整个值*16 5.USART寄存器 USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器一个专门用于发送的可写TDR一个专门用于接收的可读RDR。当进行发送操作时往USART_DR写入数据会自动存储在TDR内当进行读取操作时向USART_DR读取数据会自动提取RDR数据。 TDR和RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的发送时把TDR内容转移到发送移位寄存器然后把移位寄存器数据每一位发送出去接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。 1.控制寄存器 1(USART_CR1) 2.控制寄存器 2(USART_CR2) 3. 控制寄存器 3(USART_CR3) 4. 数据寄存器(USART_DR) 1具体传输多少位取决于寄存器USART_CR1中的位12M【字长】 2设置好控制和波特率寄存器后往该寄存器写入数据即可发送接收数据则读该寄存器 5.状态寄存器(USART_SR) 根据TC位发送完成位可以知道能否发数据根据RXNE位读数据寄存器非空知道是否收到数据。 6.需要配置的时序总结 6.USART/UART异步通信配置步骤 1.HAL_USART_Init 对USART进行初始化 2.HAL_USART_Receive_IT USART的中断使能函数 这个函数是非阻塞式的没有执行完也可以出来 3.HAL_USART_Receive 没有开启中断的UASRT 这个函数是阻塞式的没有执行完不可以出来 7.通过串口接收或者发送一个字符 1.连接注意点 2.原理图分析 3.代码编写 usart_init() 相关的设置参数和开启usart的中断 hal_usart_mspinit() 1使能USART1和对应的IO时钟 2初始化IO 3使能USART1中断设置NVIC优先级 usart1_IRQHandler 中断回调服务函数 2HAL_UART_iRQHandler()会清除中断 HAL_USART_RxCpltCallback 串口接收数据的回调函数 1.CubeMX和HAL库的串口实战 1、CubeMX中打开并设置串口 1.设置对应的RCC 2.查看原理图上对应的RX和TX 注意点我们的串口对应的应该是RX--》TXTX--》RX 我们要先查看原理图中是否已经帮我们接反了如果没有则需要我们自己手动接反。 我们使用的STM32F103C8xx直接接入USB口即可 由上面分析可知我们使能PA9和PA10即可 3.设置相关的USART 4.设置相关的时钟 5.在usart.c文件中添加输入/输出的函数 在使用之前记得先定义一个宏定义 #includestdio.h “PUTCHAR_PROTOTYPE’’的含义 PUTCHAR_PROTOTYPE 是一个在使用HAL库时用户可以定义的宏通常用于重定向 printf 函数的输出。这个宏的目的是提供一个适配不同硬件平台的接口以实现 printf 输出到用户定义的设备或串口。 #ifdef __GNUC__//当前在Linux系统下#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else//在windows下#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /*** brief Retargets the C library printf function to the USART.* param None* retval None*/ //PUTCHAR_PROTOTYPE 宏是一个用户在使用HAL库时可以自定义的宏 //用于实现 printf 函数的输出重定向。 PUTCHAR_PROTOTYPE //int fputc(int ch, FILE *f) {/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF);return ch; } 2、串口操作 (1)阻塞模式串口发送CPU不做其他事情 MCU的CPU一个字节一个字节的将要发送的内容丢给串口模块然后看着串口模块将这个字节发送出去然后CPU再去拿下一个字节来丢给串口模块。直到本次要发送的所有字节全部发完CPU才会去做其他事。 (2)中断模式串口发送CPU轮询式查询 MCU的CPU向串口模块丢一个字节然后串口模块慢慢发CPU丢完这个字节后会跳出去做其他事情等串口模块发完这个字节后会生成一个中断中断会通知CPU过来继续丢下一个字节。 2.源码分析和串口发送的实现 1、阻塞式串口发送/接收 1.1 阻塞式发送HAL_UART_Transmit常用 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) {uint16_t *tmp;uint32_t tickstart 0U;/* Check that a Tx process is not already ongoing *///查看状态if (huart-gState HAL_UART_STATE_READY){if ((pData NULL) || (Size 0U)){return HAL_ERROR;}/* Process Locked *///将串口模块锁住了将变量的值设置为HAL_LOCKED__HAL_LOCK(huart);huart-ErrorCode HAL_UART_ERROR_NONE;huart-gState HAL_UART_STATE_BUSY_TX;/* Init tickstart for timeout managment *///获取当前的时候用于判断是否超时tickstart HAL_GetTick();huart-TxXferSize Size;//表示要发送的个数huart-TxXferCount Size;//还要发送的个数总个数-已经发送while (huart-TxXferCount 0U){huart-TxXferCount--;if (huart-Init.WordLength UART_WORDLENGTH_9B){//等待标志发生查看是否超时if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) ! HAL_OK){return HAL_TIMEOUT;//超时}tmp (uint16_t *) pData;huart-Instance-DR (*tmp (uint16_t)0x01FF);if (huart-Init.Parity UART_PARITY_NONE){pData 2U;}else{pData 1U;}}else{if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) ! HAL_OK){return HAL_TIMEOUT;}//真正干活的代码huart-Instance-DR (*pData (uint8_t)0xFF);}}//查看发送是否已经完成【阻塞等待串口发完】if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) ! HAL_OK){return HAL_TIMEOUT;}/* At end of Tx process, restore huart-gState to Ready *///将状态设置回去huart-gState HAL_UART_STATE_READY;/* Process Unlocked *///解锁__HAL_UNLOCK(huart);return HAL_OK;}else{return HAL_BUSY;} } 1.2 阻塞式接收HAL_UART_Receive不常用 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) {uint16_t *tmp;uint32_t tickstart 0U;/* Check that a Rx process is not already ongoing */if (huart-RxState HAL_UART_STATE_READY){if ((pData NULL) || (Size 0U)){return HAL_ERROR;}/* Process Locked */__HAL_LOCK(huart);huart-ErrorCode HAL_UART_ERROR_NONE;huart-RxState HAL_UART_STATE_BUSY_RX;/* Init tickstart for timeout managment */tickstart HAL_GetTick();huart-RxXferSize Size;huart-RxXferCount Size;/* Check the remain data to be received */while (huart-RxXferCount 0U){huart-RxXferCount--;if (huart-Init.WordLength UART_WORDLENGTH_9B){//检查UART_FLAG_RXNE是否为空如果为非空表示接收到数据if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) ! HAL_OK){return HAL_TIMEOUT;}tmp (uint16_t *) pData;if (huart-Init.Parity UART_PARITY_NONE){*tmp (uint16_t)(huart-Instance-DR (uint16_t)0x01FF);pData 2U;}else{*tmp (uint16_t)(huart-Instance-DR (uint16_t)0x00FF);pData 1U;}}else{if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) ! HAL_OK){return HAL_TIMEOUT;}if (huart-Init.Parity UART_PARITY_NONE){*pData (uint8_t)(huart-Instance-DR (uint8_t)0x00FF);}else{*pData (uint8_t)(huart-Instance-DR (uint8_t)0x007F);}}}/* At end of Rx process, restore huart-RxState to Ready */huart-RxState HAL_UART_STATE_READY;/* Process Unlocked */__HAL_UNLOCK(huart);return HAL_OK;} 3.延时时间的设置 如果我们设置的延时时间太长则我们可能会在延时的时候错过一些字符的发送和接收。 4.总结 int main(void) {//定义一个要进行发送的数据uint8_t sbuf[8]stm32;//定义一个要进行接收的数据uint8_t rbuf[20];HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){//第一个参数要传入的是地址//size:要发送的大小//0x0000ffff超时时间// HAL_UART_Transmit(huart1,sbuf,5,0x0000ffff);// HAL_Delay(1000);//阻塞式的接收接收一个后马上接着下一个接收//此方法最好一次发送一个bitHAL_UART_Receive(huart1,rbuf,1,0x0000ffff);//将接收到的数值发送出来HAL_UART_Transmit(huart1,rbuf,1,0x0000ffff);//这个延时时间不能太久要不然可能会在延时的时候接收了一个字符从而错过这个//HAL_Delay(100);} } 阻塞式的发送实际用的很多因为编程简单。缺陷是浪费高速CPU的部分性能没有追求到串口发送和整个系统性能的最高。 2、非阻塞式中断串口发送 1.HAL_UART_Transmit_IT 这个函数没有超时时间因为我们不用等。 注意点要打开中断 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) {/* Check that a Tx process is not already ongoing */if (huart-gState HAL_UART_STATE_READY){if ((pData NULL) || (Size 0U)){return HAL_ERROR;}/* Process Locked */__HAL_LOCK(huart);//因为我们使用中断方式则需要在串口内部定义一个buf使得buf指向data的地址huart-pTxBuffPtr pData;huart-TxXferSize Size;huart-TxXferCount Size;huart-ErrorCode HAL_UART_ERROR_NONE;huart-gState HAL_UART_STATE_BUSY_TX;/* Process Unlocked */__HAL_UNLOCK(huart);/* Enable the UART Transmit data register empty Interrupt *///使能UART发送数据寄存器空中断__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);return HAL_OK;}else{return HAL_BUSY;} }2.注意点  我们使用这个中断式的应该打开Usart的中断 int main(void) {//定义一个要进行发送的数据uint8_t sbuf[8]stm32;//定义一个要进行接收的数据uint8_t rbuf[20];HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){/**中断式发送和接收*/HAL_UART_Transmit_IT(huart1,sbuf,5);HAL_Delay(100);} } 3.printf重定向的实现 printf的实现其实就是重载fputc函数 要实现printf就要重写fputc fputc--printf 在使用USART通用异步收发传输时fputc 函数通常用于将一个字符发送到串口。fputc 是标准C库函数它用于将一个字符写入指定的输出流通常是标准输出流 stdout。 在使用USART进行串口通信时fputc 的使用场景可能是在使用标准C库的 printf 函数时。printf 是一个格式化输出函数通过重定向标准输出流可以将格式化的数据发送到USART从而实现通过串口发送数据的功能。 1.原始代码  #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /*** brief Retargets the C library printf function to the USART.* param None* retval None*/ PUTCHAR_PROTOTYPE {/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF);return ch; } 2.注意点1  一定一定要勾选User MicroLIB 3.注意点2 我们使用到了fputc其中FILE中是定义在stdio.h中的宏定义 定义在usart.h中 int main(void) {/* USER CODE BEGIN 1 *///定义一个要进行发送的数据uint8_t sbuf[8]stm32;//定义一个要进行接收的数据uint8_t rbuf[20];HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){float a4.532;printf(a%f\n,a);printf(test\r);} } 4.串口接收编程实战 1、阻塞式串口接收 CPU等着过来。所以当CPU临时去处理其他事情时可能会错过一些串口的输出。所以我们基本上不用。如果真的要使用则要协调好延时和串口的接收和发送。 2、中断式串口接收 使用中断的方式向串口发送数据并且输出 1.先开启uart中断 2.写中断处理函数HAL_UART_RxCpltCallback 在main函数中 //rc用来暂存和处理串口接收到的字节内容的 uint8_t receive_char;//这个就是HAL库对接的中断处理程序 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {//判断是否为usart1if(huart-Instance USART1){//这里就是真正的中断处理代码//我们这里的处理就是接收到一个字节后原封不动的发回去HAL_UART_Transmit(huart1, receive_char, 1,0xFF);//发送字符//等待本次接收完毕同时开启下一次接收【更新receive_char】//HAL_UART_Receive_IT开启中断处理流程while(HAL_UART_Receive_IT(huart1, receive_char, 1) ! HAL_OK);}} 3.注册中断 由上面分析可以知道我们在进入中断处理函数中是将接收到的字符发送出去所以我们需要在外部先接收到字符【触发中断】才可以发送。所以我们需要在其他模块初始化的位置先进入一次中断接收串口发送的数据。 3.测试代码 此代码在我们不向串口发送字符时每3s发送一次a当我们向串口发送数据时会马上在串口输出。 int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();//从此处进入中断处理程序HAL_UART_Receive_IT(huart1, receive_char, 1);while (1){float a4.532;printf(a%f\n,a);HAL_Delay(3000);} }//这个就是HAL库对接的中断处理程序 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {//判断是否为usart1if(huart-Instance USART1){//这里就是真正的中断处理代码//我们这里的处理就是接收到一个字节后原封不动的发回去HAL_UART_Transmit(huart1, receive_char, 1,0xFF);//发送字符//等待本次接收完毕同时开启下一次接收【更新receive_char】//HAL_UART_Receive_IT开启中断处理流程while(HAL_UART_Receive_IT(huart1, receive_char, 1) ! HAL_OK);}} 3.处理串口中断的流程 在初始化部分已经将中断连接起来到时候产生中断则直接进入【HAL_UART_RxCpltCallback】这个函数 5.案例1基于串口的命令shell实现 命令shell发送一个命令返回一个回应 1.协议自定义 (1)指令集指令1add    指令2sub (2)指令结束符;【定义普通指令中不可能出现的】 (3)指令中遇到回车和空格、Tab等特殊字符怎么办 2.实现思路分析 1.定义一个缓冲区存储接到的数据 2.定义一个索引值 值存储再buf中的第几个字节 3.代码编写 /* USER CODE BEGIN 4 */ //这个就是HAL库对接的中断处理程序 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {//判断是否为usart1if(huart-Instance USART1){//将receive_char的数值存放再buf中rev_buf[tindex]receive_char;//暂存tindex;//指向下一个while(HAL_UART_Receive_IT(huart1, receive_char, 1) ! HAL_OK);}} 4.main函数编写 1判断指令 2buf和index要记得清空 6.串口实验 1.串口接收数据过程 2.串口发送数据过程
http://www.huolong8.cn/news/93460/

相关文章:

  • 建一个网站的步骤wordpress邮箱配置
  • 做网站如何处理并发问题dw网站制作的源代码
  • 怎么往网站里做游戏网页设计版式教程
  • 静态网站被同行使用wordpress部署到git
  • 沈阳网站专业商圈云分销软件下载
  • 网上的网站模板怎么用汕头网站设计有限公司
  • 中小型网站建设平台网络广告
  • 网站制作报价被哪些因素影响山楼小院在哪家网站做宣传
  • 商务网站开发技术网站建设验收单模板
  • 微信设计网站建设口碑营销渠道
  • 南宁做网站公司建盏哪家好
  • 网站制作需要多少钱k乱起封神是那个网站开发的?
  • 健身网站的建设方案网站建设目标个人博客dw
  • 西安专业的网站优化东莞做网站推广公司
  • 网站开发服务税收编码上海外贸营销网站建设
  • 广西网站建设工具做网站好接活吗
  • 黑龙江住房城乡建设厅网站刚开始做电商怎么入手
  • 百度 网站 移动端室内设计项目概况
  • 网站开发岗位传奇页游平台
  • 关于推进公司网站开发的请示企业邮箱注册申请腾讯免费
  • 网站标题 空格企业网站建设制作公司
  • 殡仪馆做网站的好处合肥租房网
  • 开发一个网站的步骤网页制作基础教程第一版
  • 强的网站建设做外贸仿牌网站
  • 自动化营销网站建设电子产品东莞网站建设
  • 如何网站建设 需要详细的步骤冻品网站建设
  • 网站被k了做网站敲代码的图片
  • 从事网站开发企业门户网站管理办法
  • 把网站制作成app社交网站模版
  • 下载网站的搭建网站建设与管理好吗