精华内容
下载资源
问答
  • STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03...
    STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 
    故障排除过程: 
    1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 
    2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01 0x02 0x03 0x04的数据。间接的排除了不是电脑软件的问题,而是其他的错误。 
    3、单步调试运行虽然正常了,但连续运行时,错误依旧。现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下 
          USART_SendData(USART2, 0x01);                                 //A 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   //B 
          USART_SendData(USART2, 0x02);                                 //C 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
          USART_SendData(USART2, 0x03); 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
          USART_SendData(USART2, 0x04); 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
    4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。假设:在执行B指令时,USART的 TC 状态位==SET,那么就会紧接着执行C指令,也就有可能发生数据的覆盖。于是,在A指令前,加入如下指令:USART_ClearFlag(USART2,USART_FLAG_TC); 
    5、加入上一条指令后,运行,错误消失了。说明上一个假设,应该是成立的。 
    6、查阅stm32f10x参考手册,找到这样一句话: 
          TC:发送完成 
          当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位       也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 
          0:发送还未完成;1:发送完成。 
    7、注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 也就是说,要先read USART_SR,然后write USART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉。 说明第4步的猜测是对的。 
    8、那么,应该把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改为USART_GetFlagStatus(USART2, USART_FLAG_TC);,应该也能消除错误。测试后证实,确实如此,在发送首个数据之前,先读取一下USART_SR,那么就不会出现首个数据丢失的情况了。 
    9、总结:硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,或是,在write USART_DR之后,加入一个小延时,让数据发送完毕,应该也能间接排除这个错误。 
    展开全文
  • 使用stm32f205调试串口通讯时,发现一个问题,上电后串口发送字符串的第一个字节会丢失,发送测试数据hello,接收端收到的数据为:ello,第一个字符丢失。用示波器抓取波形,发现第一个数据的波型也是丢失的。 出现...

    使用stm32f205调试串口通讯时,发现一个问题,上电后串口发送字符串的第一个字节会丢失,发送测试数据hello,接收端收到的数据为:ello,第一个字符丢失。用示波器抓取波形,发现第一个数据的波型也是丢失的。

    出现问题的代码如下:

    while(*pStr != 0){
        USART_SendData(USARTx, *pStr++);
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
    }
    

    这里写图片描述

    原因:

    1.通过DEBUG查看,在执行USART1_init();串口初始化完成后:TXE,TC是置1的。

    2.RM0033中有一段描述,

    两者的区别在于:往USART_DR中写数据的时候TXE直接被清零。TC清零则需要先读取USART_SR,然后写USART_DR。

    在出现错误的代码执行之前加一句:

    USART_GetFlagStatus(USART1, USART_FLAG_TC); 就不存在错误了。

    当然,直接清零也可以:USART_ClearFlag( USART1, USART_FLAG_TC );

    或者用USART_FLAG_TXE标志来判断。

    展开全文
  • STM32串口第一个字节丢失问题的分析过程

    万次阅读 多人点赞 2014-11-10 23:39:19
    STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功, 使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x...
    STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 
    故障排除过程: 
    1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 
    2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01 0x02 0x03 0x04的数据。间接的排除了不是电脑软件的问题,而是其他的错误。 
    3、单步调试运行虽然正常了,但连续运行时,错误依旧。现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下 
          USART_SendData(USART2, 0x01);                                 //A 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   //B 
          USART_SendData(USART2, 0x02);                                 //C 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
          USART_SendData(USART2, 0x03); 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
          USART_SendData(USART2, 0x04); 
          while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
    4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。假设:在执行B指令时,USART的 TC 状态位==SET,那么就会紧接着执行C指令,也就有可能发生数据的覆盖。于是,在A指令前,加入如下指令:USART_ClearFlag(USART2,USART_FLAG_TC); 
    5、加入上一条指令后,运行,错误消失了。说明上一个假设,应该是成立的。 
    6、查阅stm32f10x参考手册,找到这样一句话: 
          TC:发送完成 
          当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位       也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 
          0:发送还未完成;1:发送完成。 
    7、注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 也就是说,要先read USART_SR,然后write USART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉。 说明第4步的猜测是对的。 
    8、那么,应该把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改为USART_GetFlagStatus(USART2, USART_FLAG_TC);,应该也能消除错误。测试后证实,确实如此,在发送首个数据之前,先读取一下USART_SR,那么就不会出现首个数据丢失的情况了。 
    9、总结:硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,或是,在write USART_DR之后,加入一个小延时,让数据发送完毕,应该也能间接排除这个错误。 
    展开全文
  • STM32 IIC从机的使用注意点,解决IIC发送第一个字节的数据错误 ** 相关中断标志位 使用STM32 IIC作为从机,不可避免的就要用到中断对接收和发送数据进行处理。 下面讲下常用的中断标志,这里以STM32F072RB为例,在IIC...

    **

    STM32 IIC从机的使用注意点,解决IIC发送第一个字节的数据错误

    **

    相关中断标志位

    使用STM32 IIC作为从机,不可避免的就要用到中断对接收和发送数据进行处理。
    下面讲下常用的中断标志,这里以STM32F072RB为例,在IIC的中断寄存器IIC-ISR有如下标志位
    ADDR: 当主机发送地址,作为从机的STM32匹配上了地址,该位会置位为1,同时如果此时开了IIC的中断就会进入中断函数。
    RXNE:当主机是发送数据给从机的,则每一次的接收数据寄存器有一个字节的数据时,该位会置1。如果此时开了IIC的中断就会进入中断函数。当从接收寄存器读取数据后,该位会由硬件清0。
    TXE:当主机是接收数据的一方,作为从机的STM32在发送数据寄存器为空的时候。该位会置1,如果此时开了IIC的中断就会进入中断函数。一般我们会在中断函数中将数据填入数据发送寄存器,此时,这个标志位会被硬件清0.
    STOPF:当主机发送停止信号结束通讯,从机接收到此型号时,该位会置1,如果此时开了IIC的中断就会进入中断函数。

    从机的数据发送机制以及注意点

    在主机发送地址以及读取数据的方向给从机之后,从机的TXE就会被置位。这里需要注意两个寄存器,发送数据寄存器以及移位寄存器。
    发送数据寄存器:发送的数据每一个字节一开始会存在这个寄存器。
    移位寄存器:发送数据寄存器将数据发给移位寄存器,移位寄存器再发给主机。
    笔者在发送一帧数据(4个字节的数据)发现,主机接收到的新一帧的第一个字节的数据总是上一帧的最后要发送一个字节的数据。
    比如上一帧数据为(0x00, 0x01,0x02,0x04)
    新的一帧的数据为(0x05,0x06,0x07,0x08)
    结果主机接收到的新的一帧数据为(0x04,0x05,0x06,0x07)
    一开始还以为MCU出错,后来跟某宝的店主讨论后恍然开朗,问题出在了如下:
    一开始在主机发送地址以及读取数据的方向给从机之后,此时,如果发送寄存器原来就存在上一帧的最后一个字节的数据,则这一字节的数据会直接从发送寄存器发给移位寄存器,移位寄存器再把它发给主机,从而主机接收到的新一帧的第一个字节的数据总是上一帧的最后要发送一个字节的数据放。

    为什么发送寄存器会存在上一帧最后一个字节的数据呢?
    还是某宝的店主告诉我的:因为MCU的IIC处理机制就是当从机IIC发送一个字节的数据给主机时,主机要应答,从机才会把存在发送寄存器的新的一个字节的数据发送给移位寄存器。
    并且,一开始在主机发送地址以及读取数据的方向给从机之后,从机的发送寄存器如果存在一个字节的数据,则这一字节的数据会直接从发送寄存器发给移位寄存器,移位寄存器再把它发给主机,这第一个字节不需要主机先应答从机再发送出去。

    比如这个例子:
    在主机发送地址以及读取数据的方向给从机之后。如果发送寄存器原来就存在未知的一个字节的数据a,这个数据会被发送给移位寄存器(这一步是硬件自动进行的),发送寄存器为空了,此时从机的TXE位才被置位为1,产生中断事件,0x00被接着放入发送寄存器,主机接收到字节a,发送(ack)应答给从机,这个0x00才会被发送给移位寄存器。
    因此,主机在接收到a,0x00,0x01,0x02,后,发现四个数据够了,就发送非应答(NACK)再接着发送停止信号,而不是应答(ack),因此0x04就被放在发送寄存器没有发送出去。
    在新的一帧数据开始发送时,此时这个0x04就是上面的未知字节a了。

    重点总结

    1.从机产生IIC发送中断是因为发送寄存器为空,只要发送寄存器的数据发送给移位寄存器就会产生TXE置位,如果此时开了IIC的中断就会进入中断函数。
    2.一开始在主机发送地址以及读取数据的方向给从机之后,从机的发送寄存器如果存在一个字节的数据,则这一字节的数据会直接从发送寄存器发给移位寄存器,移位寄存器再把它发给主机。
    3.主机在接收到一个字节的数据后要应答(ack),从机才会继续把发送寄存器的数据发给移位寄存器,第一个字节除外,见2.

    解决办法

    实际上解决的就是在匹配到正确的地址后,就把发送寄存器的数据清空,让发送寄存器的数值重新填写,某宝的店主给我看了这段话:
    芯片数据手册原话
    这里的意思就是,在进入地址匹配的中断后,让IIC-ISR寄存器的TXE位置1,软件直接写I2C1->ISR |= I2C_ISR_TXE,此时会让MCU进入发送中断,从而往发送寄存器写入新的一个字节数据即可。

    偷偷帮店主打个广告,祝店主生意兴隆,某宝搜多多林电子:https://shop486079607.taobao.com/category-1442399460.htm?spm=a1z10.3-c-s.w401021301227193.8.20a33ebcDBMpB2&search=y&parentCatId=1442399459&parentCatName=��������΢������&catName=ST(�ⷨ�뵼�壩#bd

    大家有问题可以下面留言,需要元器件或者有问题就联系某宝店主,我也是在哪里买了东西,不会用才去问,发现原来某宝也有好多高手

    展开全文
  • MAC地址的第一个字节必须为偶数,第一个字节为奇数的MAC地址为多播地址   第一个字节是否为偶数由第一个字节的最低位来决定,这位是bit40,它为0表示单机地址,1表示组播地址,这一位是组播标志位....
  • 在USART_DR寄存器中写入了最后一个数据字后,在关闭USART模块之前或设置微控制器进入低功耗模式(详见下图)之前,必须先等待TC=1。 使用下列软件过程清除TC位: 1.读一次USART_SR寄存器; 2.写一次USART_DR寄存器。...
  • STM32串口第一个字节丢失解决办法

    千次阅读 2017-02-08 11:56:50
    void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data) { ...while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);... //而且必须加载sendata前面 加在后面时第次上电首字节丢失
  • 然后发现中断接收数据后,将数据发送给上位机(调试助手)时只接收到了最后一个字节的数据,后来以为数据发送的太快了,然后在每个字节发送完都加了延时,结果发现只接收到第一个数据。1、 在这个过程中,通过调试我...
  • 一个字等于多少个字节?”是一个不严谨的问法

    万次阅读 多人点赞 2018-03-12 13:22:16
    一个字等于多少个字节?”是一个不严谨的问法 直接回答一个字等于多少个字节,也是不严谨的答法。 相关概念: 1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。 2...
  • java判断一个字节数组在另一个字节数组的位置 有时候需要判断,一个字节数组在另一个字节数组的位置,其实只要判断第一位相等,然后后面多位持续比较,就可以判断是否有完全相同的片段。 由于项目需要,自己写了几...
  • utf-8的中文是一个汉字占三个字节长度吗?

    万次阅读 多人点赞 2016-09-07 09:35:21
    英文字母和中文汉字在不同字符集编码下的字节数英文字母:字节数 : 1;编码:GB2312字节数 : 1;编码:GBK字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1字节数 : 1;编码:UTF-8字节数 : 4;编码:UTF-16字节数 ...
  • 一个字符占几个字节

    万次阅读 2019-01-02 08:49:46
     一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个...
  • 一个汉字占多少个字节

    千次阅读 2020-07-01 20:54:04
    1,ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。 2,UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节 3...
  • InputStream 一个字节一个字节的读取

    千次阅读 2016-06-05 12:08:31
    package chap10.sec03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class Demo4 { ...public static void m
  • 我是做嵌入式开发的,在嵌入式开发过程中,如何对数据操作必然是不可缺少的问题,接下来,我们来看一个例子: 1. #include <stdio.h> int main(void) { unsigned int temp = 0x10 ; unsigned int high = ...
  • 一个字节多少位

    万次阅读 2019-09-28 13:45:35
    前几天笔试发现这问题有点模糊,囧,记录一下: 1字节(byte) = 8位(bit) 在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit) 在32位的系统中(比如win32) 1字(word)= 4字节...
  • 一个汉字是几个字节

    万次阅读 2019-06-21 21:11:11
    一个汉字是几个字节 常用中文字符用utf-8编码占用3个字节(大约2万多字),但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字)。 GBK、GB2312收编的汉字占2个字节,严格地用...
  • 一个字节多少位,一个字多少位?

    万次阅读 2019-05-04 14:42:20
    一个字节=一个byte=8位 一个字=两个byte=16位, java中: byte=8位 short = 2byte = 16位 int = 4byte = 32位 long = 8byte = 64位 float = 4byte = 32位 double = 8byte = 64位 char = 4byte = 32位 ...
  • 如果输出的是一个字节,确实1000 0000代表-128。 但,明明写的是printf("%d\n", c); 是不是因为系统只给c变量分配了1个字节内存,所以printf("%d\n", c); 只能读取内存中的一个字节,而不能按照%d读取4个字节?
  • 为什么一个字节是八个bit

    万次阅读 2019-06-10 19:10:29
    字节是是计算机信息计量单位,一个字节包含八个bit。 但是为什么一个字节是八个bit呢 bit bit是计算机存储数据的最小单位,只有0和1两种值。对于计算机来说,数据只有0和1两种值。 ascii码 ascii码是计算机一开始...
  • 16进制几个字符是一个字节

    万次阅读 2016-07-29 15:49:16
    16进制中,两个字符是一个字节,一个字符的话,是一个字节。   例如:A是一个字节,AA是一个字节,AAA是两个字节,AAAA是两个字节。   不过,16进制能够出现的字符(不区分大小写)是:1,2,3,4,5,6,7,8,9,0,A,B,...
  • 在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C ...因为一个地址里面有一个字节的内容,一个字节是8位。 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)
  • unsigned int a; unsigned char str1,str2; a=(str1 解答: 因为char其实是按int存的 char其实存的是整数 计算机中变量的首地址都是按4字节(32位机器)...单个char变量还是占了一个整数的内存,存的也是整数
  • 一个字等于多少个字节

    千次阅读 2019-06-28 14:18:31
    一个字等于多少个字节,与系统硬件(总线、cpu命令字位数等)有关,不应该毫无前提地说一个字等于多少位。 正确的说法: ①:1字节(byte) = 8位(bit) ②:在16位的系统中(比如8086微机) 1字 (word)= 2...
  • 一个字母占几个字节

    千次阅读 2018-12-18 15:53:21
    一个字母占几个字节  (2010-11-06 10:41:24) 转载▼ 标签:  杂谈   我真的搞不清楚你到底想问什么,而且你有的表述也不准确严谨 所以只好把基本的单位先说下。 比特(bit)即一个二进制位 例如...
  • mysql一个字符占用多少个字节

    千次阅读 2018-12-17 14:41:34
    UTF-8:UTF-8一个(字符)占用(3)个字节,英文占用(1)个字节。 GDK: GDK一个(字符)占用(2)个字节,英文占用(1)个字节。 针对于数据库 例如这种数据库字段定义方式: 首先mysql会忽略具体的存储细节(本人是个小白还不...
  • 也许在网上有很多类似的...1、限制文本框为16个字节,只能输入中文和字母 解决思路: 1、判断只能是中文和英文 2、判断长度只能为16 3、有一个不符合,将进入循环: 第一步:替换掉所有的#,因为我后面要用到这个特殊字
  • int为什么占4个字节?一个字节为什么是8位?

    千次阅读 热门讨论 2019-11-04 16:17:06
    不知道大家有没有思考过这样的问题,一个字节为什么是8位呀,也许还有小伙伴不知道我说的这些是什么,没关系往下看。 第一个解释(历史)是IBM为System/360设计了一套8位EBCDIC编码,涵盖了数字、大小写字母和大部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,100
精华内容 80,440
关键字:

一个字节