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

公司网站建设合同交印花税吗网站建设面板

公司网站建设合同交印花税吗,网站建设面板,北京燕化工程建设有限公司网站,wordpress自动获取标签背景 我这里用STM32实现#xff0c;其实可以搬移到其他MCU#xff0c;之前有项目使用STM32实现Modbus协议 这个场景比较正常#xff0c;很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集#xff0c;我记得之前用过一些传感器都…背景 我这里用STM32实现其实可以搬移到其他MCU之前有项目使用STM32实现Modbus协议 这个场景比较正常很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集我记得之前用过一些传感器都是Modbus协议 这就需要MCU实现Modbus协议不过实际使用的Modbus协议往往都是简化版本的 可能只是几条Modbus协议格式的指令而已 初学者网上一搜Modubus协议往往越看越糊涂 原理图 如下图所示使用STM32 UART2采用485接口设计引出 解释一下为什么这里的485电路设计的这么复杂 这里考虑485带电插拔操作以及客户要求隔离功能等所以硬件上设计比常用电路复杂很多 其实主要功能都是一致的 软件设计  初始化串口这里写的比较复杂因为考虑了串口2也就是485接口的波特率是可以配置的并且配置后掉电保存所以有个波特率的接口当然同时也有校验位可配置 如下配置串口采用中断模式使用串口2对应管脚PA2/PA3 void Bsp_usart2_cfg(u8 baud, u8 checkbit) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure; u32 BaudRate;switch(baud){ case 0:{BaudRate 300;break;}case 1:{BaudRate 600;break;}case 2:{BaudRate 1200;break;}case 3:{BaudRate 2400;break;}case 4:{BaudRate 4800;break;}case 5:{BaudRate 9600;break;}case 6:{BaudRate 19200;break;}case 7:{BaudRate 38400;break;}case 8:{BaudRate 57600;break;}case 9:{BaudRate 115200;break;}default:{BaudRate 9600;break;}}RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/** USART2_TX - PA2 , USART2_RX - PA3*/ GPIO_InitStructure.GPIO_Pin GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure);USART_InitStructure.USART_BaudRate BaudRate;///USART_InitStructure.USART_WordLength USART_WordLength_9b;//9位数据USART_InitStructure.USART_WordLength USART_WordLength_8b;//if(checkbit 0)//USART_InitStructure.USART_StopBits USART_StopBits_2;//1位停止位//elseUSART_InitStructure.USART_StopBits USART_StopBits_1;//1位停止位if((checkbit 0) || (checkbit 3))USART_InitStructure.USART_Parity USART_Parity_No;//else if(checkbit 1)USART_InitStructure.USART_Parity USART_Parity_Even;//偶校验else if(checkbit 2)USART_InitStructure.USART_Parity USART_Parity_Odd;//奇校验elseUSART_InitStructure.USART_Parity USART_Parity_No;// USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; //硬件流控制失能USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; //发送和接受使能USART_Init(USART2, USART_InitStructure); NVIC_InitStructure.NVIC_IRQChannel USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority USART2_IRQCHANNELPP;// 设置抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority USART2_IRQCHANNELSP; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStructure);// USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 使能USART接收中断,这里先不开启接收中断USART_Cmd(USART2, ENABLE); USART_ClearITPendingBit(USART2, USART_IT_TC);//清除中断TC位while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) RESET);//等待传输完成否则第一位数据容易丢失} 串口2的中断处理函数如下 这里很简单就是把串口2的数据收集起来放到队列comrx2xQueue中 void USART2_IRQHandler(void) {portBASE_TYPE xHigherPriorityTaskWoken pdFALSE;uint8_t cChar;uint16_t msg;if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) ! RESET) // ORE中断{USART_ReceiveData(USART2);}if (USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) // 接收数据中断 {cChar USART_ReceiveData( USART2 );msg MSG_USART_EVT | (cChar);xQueueSendFromISR( comrx2xQueue, msg, xHigherPriorityTaskWoken );}portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } 在串口2的接收任务中进行 协议帧格式匹对 如下代码使用状态机跳转到接收处理位置 void tskcomrx2( void *pvParameters ) {uint16_t Msg;QueueHandle_t pq pvParameters;uint8_t stt FSM_IDLE,*prx;uint16_t tmp16,len; while(1) {if( xQueueReceive( pq, Msg, 20 ) pdPASS ){if(MSG_NAME(Msg) MSG_USART_EVT){tmp16 MSG_DATA(Msg);//调试语句打印接受数据到调试串口1 // while((USART1-SR0x40)0);//等待上一次发送完毕 // USART1-DR tmp16; // switch (stt) {case FSM_IDLE :{prx StdDatBufIn2;*prx 0;len 0;if (tmp16 FlashParagma.addr) {/*数据开始*/len;*prx tmp16;*prx 0;stt FSM_HEAD;}break;}case FSM_HEAD :{len;*prx tmp16;*prx 0;if ((tmp16 0x03) || (tmp16 0x06)){stt FSM_ASCII_DATA;}else{stt FSM_IDLE;//异常处理}break;}case FSM_ASCII_DATA :{ len;*prx tmp16;*prx 0; if(len 7){//处理接收数据modbusEventPro(StdDatBufIn2, len);stt FSM_IDLE;//异常处理}break;}default:{stt FSM_IDLE;break;}} }/**end of if(MSG_NAME(pMsg)*/ } }/*end of while(1)*/ }/*end of void tskDatRxCOM1(void * pdata) */ 根据modbus协议指令分类进行数据处理代码如下 功能码03、06进行处理 // Modbus事件处理函数 void modbusEventPro(u8 *src, u16 len) {u16 crc,rccrc;//收到数据包长度判定//通过读到的数据帧计算CRCcrc Modbus_CRC16(src[0], len - 2); // 读取数据帧CRCrccrc src[len - 2] src[len - 1] * 256;if(crc rccrc) //CRC校验成功开始分包{ if(src[0] FlashParagma.addr) //检测是否是自己的地址{switch(src[1]) //分析modbus功能码{case 3: {Modbus_Func3(src, len);break;}case 6:{Modbus_Func6(src, len);break;}default:break; }}else if(src[0] 0) //广播地址不予回应{} } }发送modbus协议指令这里需要先把发送模式打开发送数据完成后注意要延时一段时间再切换为接收模式这个延时时间需要自己根据调试情况进行实际调整 控制不同类型的从机延时时间要求可能不太一样 void Modbus_USRAT2_SendStr(u8 *scr, u16 len) {u16 i;// 开始返回Modbus数据Modbus_USART2_TX_Mode;vTaskDelay(5);for(i 0; i len; i){while((USART2-SR0x40)0);//等待上一次发送完毕 USART2-DR scr[i]; }vTaskDelay(5);Modbus_USART2_RX_Mode; }总结 这实现的比较简单且常用的Modbus协议 协议格式如下采用高字节在前方式 地址 功能码 从机地址 数据 校验 485从机地址 03H(读)、06H(写) CRC 1byte 1byte 2byte 4byte 2byte 上述Modbus协议实现03、06指令即可完成对从机地址的读写。 上述代码实现也是根据表格中的格式进行实现的可以和代码对的上。 其他 网上搜集了一下关于RS485和Modbus协议的解释这里拿出来比较关键的供参考 关于RS485主要是关注传输距离、接口线、电平 RS-485是美国电子工业协会EIA在1983年批准了一个新的平衡传输标准balanced transmission standardEIA一开始将RSRecommended Standard做为标准的前缀不过后来为了便于识别标准的来源已将RS改为EIA/TIA。目前标准名称为TIA-485但工程师及应用指南仍继续使用RS-485来称呼此标准。 RS-485仅是一个电气标准描述了接口的物理层像协议、时序、串行或并行数据以及链路全部由设计者或更高层协议定义。RS-485定义的是使用平衡也称作差分多点传输线的驱动器driver和接收器receiver的电气特性。 差分传输增加噪声抗扰度减少噪声辐射长距离链路最长可达4000英尺约1219米数据速率高达10Mbps40英寸内约12.2米同一总线可以连接多个驱动器和接收器宽共模范围允许驱动器和接收器之间存在地电位差异允许最大共模电压-7-12V 关于Modbus协议 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。 Modbus协议包括ASCII、RTU、TCP等并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式数据通讯采用Maser/Slave方式Master端发出数据请求消息Slave端接收到正确消息后就可以发送数据到Master端以响应请求Master端也可以直接发消息修改Slave端的数据实现双向读写。 Modbus协议需要对数据进行校验串行协议中除有奇偶校验外ASCII模式采用LRC校验RTU模式采用16位CRC校验但TCP模式没有额外规定校验因为TCP协议是一个面向连接的可靠协议。另外Modbus采用主从方式定时收发数据在实际使用中如果某Slave站点断开后如故障或关机Master端可以诊断出来而当故障修复后网络又可自动接通。因此Modbus协议的可靠性较好。 对于Modbus的ASCII、RTU和TCP协议来说其中TCP和RTU协议非常类似我们只要把RTU协议的两个字节的校验码去掉然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。 1通讯传送方式 通讯传送分为独立的信息头和发送的编码数据。以下的通讯传送方式定义也与ModBusRTU通讯规约相兼容 初始结构 ≥4字节的时间 地址码 1 字节 功能码 1 字节 数据区 N 字节 错误校检 16位CRC码 结束结构 ≥4字节的时间 地址码地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址而从机发送的地址码表明回送的从机地址。 功能码通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送通过功能码告诉从机执行什么动作。作为从机响应从机发送的功能码与从主机发送来的功能码一样并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为(比如功能码大与此同时127)则表明从机没有响应操作或发送出错。 数据区数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。 CRC码二字节的错误检测码。
http://www.hkea.cn/news/14321391/

相关文章:

  • 有什么做户外活动的网站吗苏州建设网站制作
  • 做一家网站建设微信网站
  • 食品网站网页设计手机app设计软件有哪些
  • 阿里云虚拟主机与网站吗网站设计项目明细
  • 网站的icp备案信息是什么wordpress源程序
  • 网站推广哪个主流网站便宜邢台做网站服务商
  • 创建站点如何做网站刚做的网站搜全名查不到
  • 汕头免费自助建站模板黑龙江建设网官
  • 网站城市切换如何做网站建设名片设计
  • 建设网站 深圳淘宝直通车推广怎么收费
  • 湖州网站建设培训教程商务网站建设中的必备功能
  • 网站建设审批表培训机构排名全国十大教育机构排名
  • 房地产网站建设解决方案一建报考条件及专业要求
  • 橙色系网站重庆景点图片高清图片
  • 做网站的外包能学到什么北京微网站
  • 上海物流网站怎么建设厦门海投工程建设有限公司网站
  • 企业网站找谁做好wordpress 密码 hello
  • 购物手机网站怎么做如何修改wordpress主题模板
  • 如何做产品众筹网站中文单页面网站模板
  • 蛋糕网站制作答辩上海建设网站的网站
  • 建设部网站 挂证WordPress怎么添加语言
  • 做官网网站哪家公司好微信网页宣传网站怎么做的
  • 上海的建设网站制作wordpress 邮件推送
  • 怎样在网站做咨询医生挣钱连云港高端网站建设
  • 怎么建立属于自己的网站淘宝官网首页入口电脑版网址
  • 一张图片做单页网站网页设计与制作步骤
  • 纯静态网站怎么做股市财经新闻最新消息
  • 北京网站设计价格网站建设页面页脚怎么设置
  • 网站dns错误网站不维护会怎么样
  • 青海 网站开发 app开网店哪些平台不收费