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

什么公司设计网站建设上海集酷网站

什么公司设计网站建设,上海集酷网站,新公司注册在哪个网站,环球下载杭州网目录 1、实验内容梳理2、对于串口中断函数#xff08;自定义数据接收协议#xff09;的理解3、对main函数的理解4、实验异常现象及解决办法5、USART-FLAG-TXE与USART-FLAG-TC标志位 1、实验内容梳理 首先结合串口调试助手对实验进行说明#xff0c;以便后续结合代码熟悉整个… 目录 1、实验内容梳理2、对于串口中断函数自定义数据接收协议的理解3、对main函数的理解4、实验异常现象及解决办法5、USART-FLAG-TXE与USART-FLAG-TC标志位 1、实验内容梳理 首先结合串口调试助手对实验进行说明以便后续结合代码熟悉整个流程。整个实验其实就是通过串口调试助手向单片机发送数据然后单片机将接收到的数据返回给上位机并加以显示。 简单来串口调试助手说其实就是用于上位机和下位机通信用的一个桥梁软件功能主要有两个这也是本实验的两个步骤 人工发送数据给单片机处理即通过串口调试助手的下方窗口编辑数据然后点击发送按钮就能发送数据给单片机接受单片机发送的数据显示给你看即通过串口调试助手上方窗口将单片机发回给上位机的数据进行显示 关于串口调试助手还应知道 发送英文字符需要用一个字符即8位发送汉字需要两个字符即16位如上图发送汉字“宋”实际是发送“CB1100 1011CE1100 1110”而发送英文字符S实际是发送“530101 0011”本质上没有太大区别勾选了下方“发送新行”后XCOM就会再你输入的需要发送的数据后自动加上一个回车0X0D0X0A如果不勾选则我们在手动输入完“宋S”后还需敲一个回车键只有这样点击发送后调试助手上方窗体才能将其显示这是因为我们在程序的串口中断中自定义了一个数据接收协议即只有当接受的数据以回车结尾0X0D0X0A串口才认可数据接受完毕。 2、对于串口中断函数自定义数据接收协议的理解 正点原子的例程中通过语句USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)开启相关中断当读数据寄存器非空即单片机一接收到数据时便会触发串口1的中断函数。 改协议的核心是定义了一个16位的变量USART_RX_STA该变量的0-13位用于存储接收到的数据最后的14、15两位作用在于当14、15位依次接收到da0x0d和0x0a时依次将这两位置1作为判断数据是否接收完的标志位。 以下是我看到的一个注释比较详细的代码和一个实例结合两者就可以很好的理解这个过程和代码 void USART1_IRQHandler(void) //串口1中断服务程序{u8 Res; //定义unsigned char型字符Resif(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)//这里判断发送接收完成的依据就是串口数据0x0d 0x0a//0x0d是CR(carriage return)回车的意思光标回到最左边,//0x0a是LF(line feed)换行的意思,光标到达下一行//但是在PC上回车和换行是在一起的就是按下回车按键//当然可以更改程序使用其他进行判断例如使用0x2a也就是*进行结束判断{Res USART_ReceiveData(USART1);//(USART1-DR); //读取接收到的数据存放到变量Res中if((USART_RX_STA0x8000)0)//判断接收是否未完成//接收完成未清除标志位还是会不断进入到接收中断所以使用标志进行判断//当接收完成便不会跳入到判断从而不执行任何指令空等待//使用条件判断是否已经接收完数据这里判断接收完的依据就是收到了0x0a;//具体判断在后面{if(USART_RX_STA0x4000)//如果接收到了0x0d那么再进一步执行是否接收到0x0a的判断{if(Res!0x0a)USART_RX_STA0;//没有接收到0x0a那么说明数据未正确传输或者接收错误,重新开始判断//但是这里没有将接收到的数据进行清空也没有退出接收中断此程序只是从头开始执行接收判断else USART_RX_STA|0x8000; //接收完成了收到了0x0a那么标志位USART_RX_STA将会变成0x8000将不再进行数据检测与存储}else //还没收到0X0D说明数据还未发送结束继续进行数据的检测与存储{ if(Res0x0d)USART_RX_STA|0x4000;//收到了数据0x0d标志位USART_RX_STA变成0x4000else{//如果没有接收到数据0x0d执行判断是否存储数组已满已满则重新开始接收USART_RX_BUF[USART_RX_STA0X3FFF]Res ;//将接收到的数据写进数组标志位USART_RX_STA与上0X3FFF清除前两位以防止标志位与8000和4000冲突USART_RX_STA;//数组地址加一向后排if(USART_RX_STA(USART_REC_LEN-1))USART_RX_STA0;//接收数据错误,超出数组大小又开始接收向数组重新写 } }} } } 假设我们发送的数据是“abcd”经过串口调试助手加上0X0D0X0A后发送给单片机即单片机要接受的数据是“abcd”“0X0D0X0A” 1当接收到“a”时读寄存器非空RXNE为1第一次进入串口中断处理函数我们先判断是否接是因为USART1接受到了数据产生的中断如果是则将USART1接受到的一位数据“a”存入变量Res里(Res “a”) if(USART_GetFlagStatus(USART1, USART_IT_RXNE) ! RESET)2然后我们来判断接收的一系列数据是否没接收完即。当然没有啦我们还有b、c、d三个数据没有接收。这个时候呢USART_RX_STA——这个在全部函数之间实现消息传递的变量的值仍然为0和0x8000相与以后为0那么执行该if语句的内层函数。 if((USART_RX_STA0x8000)0) //接收未完成3进入该if语句的内层语句后判断语句如下这里判断USART_RX_STA的第14位是否为1如果我们接收到了回车即0x0d那么USART_RX_STA的第14位会置1。在我们接收第一个数据a时USART_RX_STA当然还为0我们后面的的b、c、d、3个数据还都没接收了当然不会收到0x0dUSART_RX_STA和0x400相与为0该判断语句就为假执行下面的else语句。 if(USART_RX_STA0x4000)//接收到了0x0d4该else语句的内层语句是一个if-else语句 if(Res0x0d)USART_RX_STA|0x4000; 这里我就不再赘述我们接收的是数据a还没有接收到0x0d执行else语句。 USART_RX_BUF[USART_RX_STA0X3FFF]Res ; // 0x3ff 0011 1111 1111 1111USART_RX_STA;if(USART_RX_STA(USART_REC_LEN-1))USART_RX_STA0;//接收数据错误,重新开始接收USART_RX_STA的bit0~bit13代表的是接收到的有效数据个数这里USART_RX_STA值仍为0USART_RX_STA 0X3FFF 0 然后USART_RX_BUF[USART_RX_STA0X3FFF]Res意思就是将Res里的数据存放到USART_RX_BUF[0]里了并且USART_RX_STA自增1。 此时USART_RX_STA 1这样在接收到下一个数据b后USART_RX_STA0X3FFF 1将b存入到了USART_RX_BUF[1]里一直循环下去直到我们接收到了0x0d(Res 0x0d)。 我们可以从上面程序里找到如下代码 else //还没收到0X0D{ if(Res0x0d)USART_RX_STA|0x4000; //再次判断这次接收到的是不是0x0d当接收到0x0d并且程序执行到这一步一时USART_RX_STA 4此时该if语句成立执行USART_RX_STA|0x4000即0000 0000 0000 0100 | 0100 0000 0000 0000 0100 0000 0000 0100 我们可以清晰的看到bit13~0位是4代表接收到了4个数据abcd第14位为1是因为接收到了数据0x0d也和最上面给的表对上了然后程序向下执行接收到了0x0d回车,那下一个就是接收0x0a换行了Res 0x0a if(USART_RX_STA0x4000)//接收到了0x0d 0100 0000 0000 0000{if(Res!0x0a)USART_RX_STA0;//接收错误,重新开始--接收到了0X0d但是没有接受到0x0aelse USART_RX_STA|0x8000; //接收完成了--0x0d后面是0x0a }这里第一个判断语句if(USART_RX_STA0x4000)当然为真因为Res 0x0a那么执行else语句USART_RX_STA|0x8000即0100 0000 0000 0100 | 1000 0000 0000 0000 1100 0000 0000 0100。到了这一步就说明这一串数据已经完完全全的接收完了USART_RX_STA 1100 0000 0000 0100最高位为1代表接收到了0x0a第十四位为1代表接收到了0x0d第0位到第13位为4代表接收到了4位有效数据(a、b、c、d) 3、对main函数的理解 main函数如下大致的执行流程为 int main(void) { u8 t;u8 len; u16 times0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //延时初始化 uart_init(115200); //串口初始化波特率为115200LED_Init(); //初始化与LED连接的硬件接口 while(1){if(USART_RX_STA0x8000){ lenUSART_RX_STA0x3fff;//得到此次接收到的数据长度printf(\r\n您发送的消息为:\r\n);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!SET);for(t0;tlen;t){USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!SET);//等待发送结束}printf(\r\n\r\n);//插入换行USART_RX_STA0;}else{times;if(times%3000){printf(\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n);printf(正点原子ALIENTEK\r\n\r\n);}if(times%2000)printf(请输入数据,以回车键结束\r\n); if(times%300)LED0!LED0;//闪烁LED,提示系统正在运行.delay_ms(10); }} } 完成串口的相关设置使能相应中断以及初始化过程然后进入while等待当在串口调试助手的想窗体输入想要发送的数据并点击发送后当单片机开始接受数据时便会触发中断函数USART1 IRQHandler( 对数据进行接收并最终存储进缓存RX_BUF_USART中其在usart.h中的生命为extern u8 USART_RX_BUF[USART_REC_LEN]。其中USART_REC_LEN200通过语ifUSART RX STA0x8000判断数据是否完成接受存入缓存数组RX_BUF_USART中如果完成了则利用重定向的printf函数向上位机发送语句“\r\n您发送的消息为:\r\n” , 如下图标号1区域此处实验现象异常后面会有解释然后通过for循环将缓存RX_BUF_USART中的数据依次通过USART_SendData函数发给上位机发给上位机的数据将在串口调试助手上显示。所有数据发送完毕后再次通过printf函数向上位机发送\r\n\r\n即在串口调试助手上窗体光标在原来位置的基础上下移两行。如下图标号2区域所示。当数据没有接受完或者没有向单片机发送数据时单片机便会通过printf函数向上位机按照一定时间间隔发送“\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n”、“正点原子ALIENTEK\r\n\r\n”和“请输入数据,以回车键结束\r\n”语句。 注意重定向的printf函数本质上还是通过USART_SendData向上位机发送数据且此处发送的“\r\n”与中断函数里的需要作为接受完成标志位的“\r\n”0X0D0X0A只是单纯的表示换行的转义字符电脑上位机接收到后会将光标下移两行视觉上就是空一行显示在串口调试助手上。 4、实验异常现象及解决办法 上面有提到过图片标号1的区域出现了异常实验现象即单片机利用printf(“\r\n您发送的消息为:\r\n”)语句显示的结果中语句末尾的“\r\n”并没有起到作用即让光标移至下一行后再显示“逆光”。 这种现象的原因是因为printf语句中的“\r\n”发送未完成寄存器又被后面要发送的数据覆盖解决方法就是在USART_SendData(USART1, USART_RX_BUF[t]);前面在多加一句 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!SET);//等待发送结束 for(t0;tlen;t){while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!SET);USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!SET);//等待发送结束}修改后实验现象恢复正常如下 我尝试过在printf语句的后面利用延时的方式解决问题但是只有第一次能够正常显示后面再次发送现实的数据就会存在乱码的问题。 5、USART-FLAG-TXE与USART-FLAG-TC标志位 我觉得这两个标志位的使用应当严格区分开当个附加知识记录一下 USART-FLAG-TXE发送缓冲区空标志说明可以往数据寄存器写入数据了但并不代码数据发送完成了。 USART-FLAG-TC发送完成标志这个才是代表USART在缓冲区的数据发送完成了即从机接收到了数据。 这两个标志的区别在于它们分别表示数据在发送过程中在两个不同的阶段中的完成情况.TXE表示数据被从发送缓冲区中取走转移到的移位寄存器中此时发送缓冲是空的可以向其中补充新的数据了。而 TC则表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线Tx上的转移。所以判定数据最终发送完成的标志是TC而不是IXE.
http://www.dnsts.com.cn/news/40929.html

相关文章:

  • 婚纱摄影网站管理系统个人备案的网站可以卖东西么
  • 网站雪花飘落代码WordPress自动采集豆瓣评分
  • 快速的网站设计制作电商思维做招聘网站
  • 做房产网站用什么软件wordpress获取文章来源
  • 有趣网站建设无聊网站的汉化包怎么做
  • 郑州网站建设模板制作常见的网络推广方式包括
  • 长春网站制作长春万网wordpress 使用mysql添加文章
  • 手机网站左右滑动建公司网站设计网站公司
  • 公司管理系统网站南通学校网站建设
  • 北京seo招聘信息seo关键词排名工具
  • 学校网站建设用哪个系统怎么看关键词的搜索量
  • 如何在ftp给网站做百度自动推送枣阳建网站
  • 做网站属于什么技术网站推广合同
  • 爱站网工具包阿里云有网站建设吗
  • 昆山住房和城乡建设部网站莱芜网站优化排名
  • 网站针对爬虫爬取做的优化html代码特效
  • 什么网站做的好网站开发中如何实现gps定位
  • 俄文网站策划新楼盘开盘信息
  • 大连金州代做网站公众号网站开发价格预算
  • 做家常便饭网站wordpress 亲子模板下载
  • 通州网站制作安徽企业建站系统平台
  • 网站分类目录宽带公司排名
  • 定制开发 商城网站 最快网站1g空间多少钱
  • 如何建议一个网站网站建设玖金手指谷哥十一
  • 便利的龙岗网站设计二级网站和自建网站有什么区别
  • 合肥哪里有做网站的百度网页版入口网址
  • 建设微信网站制作aspcms中引文 网站修改配置
  • 口碑好的秦皇岛网站建设哪家好花网站开发背景
  • 做网站威海wordpress搭建ppt
  • 网站建设服务费怎么做会计分录led照明企业网站模板